什么是 Docker Compose?

解释

如果您到目前为止一直遵循这些指南,那么您一直在使用单容器应用程序。但是,现在您想要做一些更复杂的事情 - 运行数据库、消息队列、缓存或各种其他服务。您是否将所有内容安装在一个容器中?运行多个容器?如果您运行多个,如何将它们连接在一起?

容器的一个最佳实践是每个容器应该做一件事并且做好。尽管这一规则也有例外,但请避免让一个容器执行多项操作的趋势。

您可以使用多个docker run命令来启动多个容器。但是,您很快就会意识到您需要管理网络、将容器连接到这些网络所需的所有标志等等。完成后,清理工作会稍微复杂一些。

使用 Docker Compose,您可以在单个 YAML 文件中定义所有容器及其配置。如果您将此文件包含在代码存储库中,则克隆您的存储库的任何人都可以使用单个命令启动并运行。

重要的是要理解 Compose 是一个声明性工具 - 您只需定义它并运行即可。您并不总是需要从头开始重新创建所有内容。如果您进行了更改,请docker compose up再次运行,Compose 将协调文件中的更改并智能地应用它们。

Dockerfile 与 Compose 文件

Dockerfile 提供构建容器映像的说明,而 Compose 文件则定义正在运行的容器。通常,Compose 文件会引用 Dockerfile 来构建用于特定服务的映像。

试试看

在本次实践中,您将学习如何使用 Docker Compose 来运行多容器应用程序。您将使用一个简单的待办事项列表应用程序,该应用程序使用 Node.js 和 MySQL 作为数据库服务器构建。

启动应用程序

按照说明在您的系统上运行待办事项列表应用程序。

  1. 下载并安装Docker Desktop。

  2. 打开终端并 克隆此示例应用程序

    git clone https://github.com/dockersamples/todo-list-app 
    
  3. 导航到todo-list-app目录:

    cd todo-list-app
    

    在此目录中,您将找到一个名为compose.yaml.这个 YAML 文件是所有魔法发生的地方!它定义了组成应用程序的所有服务及其配置。每个服务指定其映像、端口、卷、网络以及其功能所需的任何其他设置。花一些时间探索 YAML 文件并熟悉其结构。

  4. 使用 docker compose up命令启动应用程序:

    docker compose up -d --build
    

    当您运行此命令时,您应该看到如下输出:

    [+] Running 4/4
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled           7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
    [+] Running 2/4
      ⠸ Network todo-list-app_default           Created         0.3s
      ⠸ Volume "todo-list-app_todo-mysql-data"  Created         0.3s
      ✔ Container todo-list-app-app-1           Started         0.3s
      ✔ Container todo-list-app-mysql-1         Started         0.3s
    

    这里发生了很多事!有几点需要注意:

    • 从 Docker Hub 下载了两个容器镜像 - Node 和 MySQL
    • 已为您的应用程序创建了一个网络
    • 创建了一个卷来在容器重新启动之间保留数据库文件
    • 两个容器已启动并具有所有必要的配置

    如果这感觉令人难以承受,请不要担心!你会到达那里的!

  5. 现在一切都已启动并运行,您可以 在浏览器中打开http://localhost:3000来查看该站点。您可以随意将项目添加到列表中、勾选它们并删除它们。

    显示在端口 3000 上运行的待办事项列表应用程序的网页屏幕截图
  6. 如果您查看 Docker 桌面 GUI,您可以看到容器并更深入地了解其配置。

    Docker Desktop 仪表板的屏幕截图,显示运行 todo-list 应用程序的容器列表

把它撕下来

由于此应用程序是使用 Docker Compose 启动的,因此完成后可以轻松将其全部拆除。

  1. 在 CLI 中,使用以下 docker compose down命令删除所有内容:

    docker compose down
    

    您将看到类似于以下内容的输出:

    [+] Running 2/2
    ✔ Container todo-list-app-mysql-1  Removed        2.9s
    ✔ Container todo-list-app-app-1    Removed        0.1s
    ✔ Network todo-list-app_default    Removed        0.1s
    

    音量持久性

    默认情况下,当您拆除 Compose 堆栈时,卷不会自动删除。这个想法是,如果您再次启动堆栈,您可能希望恢复数据。

    如果您确实想要删除卷,请--volumes在运行docker compose down命令时添加该标志:

    docker compose down --volumes
    
  2. 或者,您可以使用 Docker Desktop GUI 通过选择应用程序堆栈并选择“删除”按钮来删除容器。

    Docker 桌面 GUI 的屏幕截图显示了容器视图,其中的箭头指向“删除”。按钮

    使用 Compose 堆栈的 GUI

    请注意,如果您在 GUI 中删除 Compose 应用程序的容器,则只会删除容器。如果需要,您必须手动删除网络和卷。

在本演练中,您学习了如何使用 Docker Compose 启动和停止多容器应用程序。

其他资源

本页是对 Compose 的简要介绍。在以下资源中,您可以更深入地了解 Compose 以及如何编写 Compose 文件。