Skip to content

什么是 Docker Compose?

原文:https://docs.docker.com/guides/docker-concepts/the-basics/what-is-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 桌面。

  2. 打开一个终端并克隆这个示例应用程序

    console
    git clone https://github.com/dockersamples/todo-list-app
  3. 进入todo-list-app目录:

    console
    cd todo-list-app

    在这个目录中,你会找到一个名为compose.yaml的文件。这个 YAML 文件是所有魔法发生的地方!它定义了组成你应用程序的所有服务及其配置。每个服务指定其镜像、端口、卷、网络和其他必要的设置。花点时间探索 YAML 文件并熟悉其结构。

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

    console
    docker compose up -d --build

    当你运行这个命令时,你应该看到这样的输出:

    console
    [+] 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桌面仪表板的截图

清理

由于这个应用程序是使用 Docker Compose 启动的,当你完成后,清理它就很容易了。

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

    console
    docker compose down

    你将看到类似以下的输出:

    console
    [+] 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标志:

    console
    docker compose down --volumes
  2. 或者,你可以使用 Docker 桌面 GUI 通过选择应用堆栈并选择删除按钮来移除容器。

    显示容器视图的Docker桌面GUI的截图,箭头指向“删除”按钮

    使用 GUI(全称 Graphical User Interface,中文是:图形用户界面) 管理 Compose 堆栈

    请注意,如果你在 GUI 中移除了 Compose 应用的容器,它只是移除了容器。如果你想这样做,你将不得不手动移除网络和卷。

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

额外资源

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