什么是 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. 现在一切都已经启动并运行,您可以在浏览器中打开 https://127.0.0.1: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 文件。