什么是 Docker Compose?
解释
如果你一直在遵循之前的指南,你一直在使用单容器应用程序。但是,现在你想要做一些更复杂的事情——运行数据库、消息队列、缓存或各种其他服务。你是否在一个容器中安装所有内容?运行多个容器?如果你运行多个容器,如何将它们连接在一起?
容器的一个最佳实践是每个容器应该只做一件事并做好它。虽然此规则有例外,但应避免一个容器执行多项任务的倾向。
你可以使用多个docker run
命令来启动多个容器。但是,你很快就会意识到你需要管理网络、连接容器到这些网络所需的所有标志等等。完成后,清理工作也会更加复杂。
使用 Docker Compose,你可以在单个 YAML 文件中定义所有容器及其配置。如果将此文件包含在你的代码库中,任何克隆你的代码库的人都只需一个命令即可运行。
重要的是要理解 Compose 是一个声明式工具——你只需定义它即可。你并不总是需要从头开始重建一切。如果你进行更改,再次运行docker compose up
,Compose 将协调你的文件中的更改并智能地应用它们。
Dockerfile 与 Compose 文件
Dockerfile 提供构建容器镜像的指令,而 Compose 文件定义正在运行的容器。通常,Compose 文件会引用 Dockerfile 来构建用于特定服务的镜像。
试一试
在本实践练习中,你将学习如何使用 Docker Compose 运行多容器应用程序。你将使用一个简单的待办事项列表应用程序,该应用程序使用 Node.js 和 MySQL 作为数据库服务器构建。
启动应用程序
按照说明在你的系统上运行待办事项列表应用程序。
下载并安装 Docker Desktop。
打开终端并克隆此示例应用程序。
git clone https://github.com/dockersamples/todo-list-app
进入
todo-list-app
目录cd todo-list-app
在这个目录中,你会找到一个名为
compose.yaml
的文件。这个 YAML 文件就是所有神奇之处发生的地方!它定义了构成你的应用程序的所有服务及其配置。每个服务都指定其镜像、端口、卷、网络以及其功能所需的任何其他设置。花些时间浏览 YAML 文件并熟悉其结构。使用
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
- 为你的应用程序创建了一个网络
- 创建了一个卷来持久化容器重启之间的数据库文件
- 启动了两个容器及其所有必要的配置
如果这让你感到不知所措,别担心!你会掌握的!
现在一切运行起来后,你可以在浏览器中打开http://localhost:3000查看站点。随意向列表中添加项目、选中它们并删除它们。
如果你查看 Docker Desktop GUI,你可以看到容器并更深入地了解它们的配置。
关闭
由于此应用程序是使用 Docker Compose 启动的,因此完成时很容易将其关闭。
在 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
或者,你可以使用 Docker Desktop GUI 通过选择应用程序堆栈并选择**删除**按钮来删除容器。
使用 GUI 进行 Compose 堆栈操作
请注意,如果你在 GUI 中删除 Compose 应用程序的容器,它只会删除容器。如果你想删除网络和卷,则必须手动删除它们。
在本演练中,你学习了如何使用 Docker Compose 启动和停止多容器应用程序。
附加资源
此页面是对 Compose 的简要介绍。在以下资源中,你可以更深入地了解 Compose 以及如何编写 Compose 文件。