什么是 Docker Compose?

解释

如果您到目前为止一直在遵循这些指南,那么您一直在使用单个容器应用程序。但是,现在您想要做一些更复杂的事情 - 运行数据库、消息队列、缓存或各种其他服务。您是否将所有内容都安装在一个容器中?运行多个容器?如果运行多个,如何将它们全部连接在一起?

容器的一个最佳实践是,每个容器都应该做一件事,并且做得好。虽然此规则有例外,但请避免让一个容器执行多项操作的趋势。

您可以使用多个命令启动多个容器。但是,您很快就会意识到您需要管理网络、将容器连接到这些网络所需的所有标志等等。完成后,清理会稍微复杂一些。docker run

使用 Docker Compose,您可以在单个 YAML 文件中定义所有容器及其配置。如果您将此文件包含在代码存储库中,则克隆存储库的任何人都可以使用单个命令启动并运行。

请务必了解 Compose 是一种声明式工具 - 您只需定义它即可。您并不总是需要从头开始重新创建所有内容。如果您进行了更改,请再次运行,Compose 将协调文件中的更改并智能地应用这些更改。docker compose up

Dockerfile 与 Compose 文件

Dockerfile 提供构建容器镜像的说明,而 Compose 文件定义正在运行的容器。通常,Compose 文件会引用 Dockerfile 来构建用于特定服务的镜像。

试用

在本动手实践中,您将学习如何使用 Docker Compose 运行多容器应用程序。您将使用一个使用 Node.js 和 MySQL 构建的简单待办事项列表应用程序作为数据库服务器。

启动应用程序

按照说明在您的系统上运行待办事项列表应用程序。

  1. 下载并安装Docker 桌面。

  2. 打开终端并克隆此示例应用程序

    git clone https://github.com/dockersamples/todo-list-app 
    
  3. 导航到目录:todo-list-app

    cd todo-list-app
    

    在此目录中,您将找到一个名为 .这个 YAML 文件是所有魔法发生的地方!它定义构成应用程序的所有服务及其配置。每个服务都指定其镜像、端口、卷、网络以及其功能所需的任何其他设置。花一些时间浏览 YAML 文件并熟悉其结构。compose.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 以查看该网站。随意将项目添加到列表中,勾选它们,然后删除它们。

    显示在端口 3000 上运行的 todo-list 应用程序的网页屏幕截图
  6. 如果您查看 Docker Desktop GUI,则可以看到容器并更深入地了解它们的配置。

    Docker Desktop 仪表板的屏幕截图,其中显示了运行 todo-list 应用程序的容器列表

停止容器

由于此应用程序是使用 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 堆栈时,不会自动删除卷。这个想法是,如果您再次启动堆栈,您可能希望恢复数据。

    如果您确实要删除卷,请在运行命令时添加标志:--volumesdocker compose down

    docker compose down --volumes
    
  2. 或者,您可以使用 Docker Desktop GUI 通过选择应用程序堆栈并选择 Delete (删除) 按钮来删除容器。

    Docker Desktop GUI 的屏幕截图,其中显示了容器视图,箭头指向“Delete”按钮

    使用 Compose 堆栈的 GUI

    请注意,如果您在 GUI 中移除 Compose 应用的容器,则只会移除容器。如果需要,您必须手动删除网络和卷。

在本演练中,您学习了如何使用 Docker Compose 启动和停止多容器应用程序。

其他资源

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