什么是 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. 一切都已启动并运行,你可以在浏览器中打开 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 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 移除容器,方法是选择应用堆栈并点击 Delete 按钮。

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

页面选项