什么是 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 GUI,你可以看到容器并更深入地了解它们的配置。

    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 GUI 通过选择应用程序堆栈并选择**删除**按钮来删除容器。

    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 文件。