什么是 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 来查看网站。您可以随意向列表中添加项目、勾选它们或删除它们。

    A screenshot of a webpage showing the todo-list application running on port 3000
  6. 如果您查看 Docker Desktop 图形用户界面,您可以看到容器并深入了解它们的配置。

    A screenshot of Docker Desktop dashboard showing the list of containers running todo-list app

拆解它

由于此应用程序是使用 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 栈时,卷不会自动删除。这是因为如果您再次启动该栈,可能需要保留这些数据。

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

    docker compose down --volumes
    
  2. 或者,您可以使用 Docker Desktop 图形用户界面来删除容器,方法是选择应用程序堆栈,然后选择 删除 按钮。

    A screenshot of the Docker Desktop GUI showing the containers view with an arrow pointing to the "Delete" button

    使用 GUI 管理 Compose 堆栈

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

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

其他资源

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