什么是 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 5/5
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled          7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
      ✔ 43c47a581c29 Download complete                          2.0s
    [+] Running 4/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://: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 3/3
    ✔ 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
    [+] Running 1/0
    ✔ Volume todo-list-app_todo-mysql-data  Removed
    
  2. 或者,你可以使用 Docker Desktop GUI 来移除容器,方法是选择应用程序栈并点击**删除**按钮。

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

    为 Compose 栈使用 GUI

    请注意,如果你在 GUI 中移除 Compose 应用的容器,它只移除容器。如果你想移除网络和卷,你必须手动操作。

在这个演练中,你学会了如何使用 Docker Compose 来启动和停止一个多容器应用程序。

其他资源

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.