介绍
在本实验中,你将学习如何高效使用 docker compose wait 命令来管理 Docker Compose 服务的生命周期。我们将从创建一个包含多个服务的基础 docker-compose.yml 文件开始,并观察服务启动后的初始状态。
随后,你将探索 docker compose wait 的核心功能——阻塞执行直到项目中的所有服务停止。我们将演示如何使用该命令等待特定服务停止,最后展示如何结合 docker compose wait 与 --down-project 选项实现完整的项目关闭与等待操作。
创建包含多个服务的简单 docker-compose.yml 文件
在本步骤中,我们将创建一个定义了两个服务的简易 docker-compose.yml 文件。开始前,由于当前环境未预装 Docker Compose,我们需要先进行安装。
首先下载 Docker Compose 二进制文件。我们将下载与已安装 Docker 版本兼容的 v2.20.2 版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
该命令从 GitHub 官方发布页下载 Docker Compose 二进制文件并保存至 /usr/local/bin/docker-compose。其中 $(uname -s) 和 $(uname -m) 会自动检测你的操作系统和架构。
接着为下载的二进制文件添加可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
通过检查版本来验证 Docker Compose 是否安装成功:
docker-compose version
你应该能看到显示已安装 Docker Compose 版本的输出信息。
安装完成后,现在可以创建 docker-compose.yml 文件了。该文件使用 YAML 格式定义应用程序的服务、网络和卷。我们将创建一个包含 web 服务器和数据库两个服务的简易文件。
进入项目目录:
cd ~/project
使用 nano 编辑器创建名为 docker-compose.yml 的文件:
nano docker-compose.yml
将以下内容粘贴到编辑器中:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: mysecretpassword
文件结构解析:
version: '3.8'指定 Docker Compose 文件格式版本services:定义组成应用的各个服务web:定义名为web的服务image: nginx:latest指定使用 Docker Hub 上最新的nginx镜像ports:将主机的 80 端口映射到web容器的 80 端口,使你能够通过浏览器访问 web 服务器
db:定义名为db的服务image: postgres:latest指定使用 Docker Hub 上最新的postgres镜像environment:设置容器内的环境变量,这里设置了 PostgreSQL 镜像所需的POSTGRES_PASSWORD
按 Ctrl + X,然后按 Y,最后按 Enter 保存文件。
至此,你已成功创建了一个定义两个服务的 docker-compose.yml 文件。
启动服务并观察其状态
在本步骤中,我们将启动 docker-compose.yml 文件中定义的服务并观察其运行状态。
首先确保你位于创建 docker-compose.yml 文件的 ~/project 目录下:
cd ~/project
使用 docker-compose up 命令启动服务。-d 参数表示以分离模式运行容器,即容器将在后台运行:
docker-compose up -d
首次运行此命令时,如果系统中不存在所需镜像(nginx:latest 和 postgres:latest),Docker Compose 会先下载它们。根据网络状况,下载可能需要一些时间。下载完成后,将为 web 和 db 服务创建并启动容器。
你将看到输出信息显示网络、卷(虽然我们的简单示例中未定义)和容器正在被创建和启动。
使用 docker-compose ps 命令检查运行中服务的状态:
docker-compose ps
该命令列出当前目录下由 Docker Compose 管理的容器。你应该能看到 web 和 db 服务及其状态,正常应为 Up。
也可以使用标准 docker ps 命令查看系统中所有运行中的容器,包括由 Docker Compose 启动的:
docker ps
查找容器名称前缀为目录名(本例为 project)后接服务名的容器(如 project-web-1、project-db-1)。
要查看服务日志,可使用 docker-compose logs 命令。例如查看 web 服务日志:
docker-compose logs web
查看 db 服务日志:
docker-compose logs db
这对调试和理解容器内部运行情况很有帮助。
至此,你已成功启动 docker-compose.yml 文件中定义的服务,并通过 docker-compose ps 观察了其运行状态。
使用 docker compose wait 等待服务停止
在本步骤中,我们将探索 docker compose wait 命令,该命令用于阻塞直至服务达到特定状态。默认情况下,docker compose wait 会等待服务停止。
首先确保上一步中的服务正在运行。你可以使用 docker-compose ps 进行验证:
cd ~/project
docker-compose ps
你应该能看到 web 和 db 服务都显示为 Up 状态。
现在打开一个新的终端窗口或标签页。保持当前终端窗口开启,稍后我们将用它来停止服务。
在新终端窗口中,导航至 ~/project 目录:
cd ~/project
运行 docker compose wait 命令。该命令会阻塞并等待,直到当前目录下 docker-compose.yml 文件中定义的所有服务停止:
docker compose wait
你会注意到该命令似乎卡住了。这是正常现象,因为当前服务正在运行。docker compose wait 命令正在等待它们停止。
现在切换回原始终端窗口(服务正在运行的窗口)。我们将使用 docker-compose down 命令停止服务。该命令会停止并移除由 docker-compose up 创建的容器、网络和卷:
cd ~/project
docker-compose down
观察原始终端窗口的输出。你将看到指示容器正在被停止和移除的信息。
现在切换回运行 docker compose wait 的新终端窗口。当另一个终端中的 docker-compose down 命令停止服务后,本窗口中的 docker compose wait 命令将检测到服务已停止并退出。
你应该能看到新终端窗口重新出现命令提示符。这演示了 docker compose wait 如何阻塞直至指定服务(默认为所有服务)停止。
你已成功使用 docker compose wait 实现了阻塞直至项目中所有服务停止的功能。
使用 docker compose wait 指定服务等待
在上一步中,我们使用 docker compose wait 等待所有服务停止。本步骤将学习如何使用该命令等待特定服务达到指定状态。
首先,让我们用 docker-compose up -d 重新启动服务。确保位于 ~/project 目录:
cd ~/project
docker-compose up -d
使用 docker-compose ps 验证两个服务都在运行:
docker-compose ps
现在打开一个新的终端窗口或标签页,我们将用它来演示等待特定服务。
在新终端窗口中导航至 ~/project 目录:
cd ~/project
通过在 docker compose wait 命令后指定服务名,可以限定等待范围。例如仅等待 web 服务停止:
docker compose wait web
与上一步类似,该命令会因 web 服务正在运行而阻塞。
切换回原始终端窗口,我们将仅停止 web 服务。使用 docker stop 命令配合容器名操作(可通过 docker ps 查看容器名,通常类似 project-web-1):
cd ~/project
docker stop project-web-1
如果容器名不同,请替换实际的 project-web-1。
观察原始终端窗口的输出,将看到 web 容器正在停止的提示。
切换回运行 docker compose wait web 的新终端窗口。当 web 服务停止后,该命令将检测到状态变化并退出。
此时新终端窗口应恢复命令提示符。注意即使 db 服务仍在运行,docker compose wait web 也已退出。
要确认 db 服务仍在运行,请返回原始终端执行:
cd ~/project
docker-compose ps
你将看到 db 服务显示为 Up 状态,而 web 服务已不在列表中或显示为停止状态。
最后停止剩余的 db 服务:
cd ~/project
docker-compose down
你已成功使用 docker compose wait 实现了阻塞直至特定服务停止的功能。
使用 docker compose wait 配合--down-project 选项
在这最后一步中,我们将探索 docker compose wait 的 --down-project 选项。该选项适用于需要等待服务停止后自动关闭整个项目的场景。
首先确保上一步骤中的服务已停止。你可以使用 docker-compose ps 进行验证:
cd ~/project
docker-compose ps
如果仍有服务在运行,使用以下命令停止它们:
docker-compose down
现在让我们以 detached 模式重新启动服务:
cd ~/project
docker-compose up -d
验证两个服务是否都在运行:
docker-compose ps
接下来我们将使用带 --down-project 选项的 docker compose wait 命令。该命令会等待所有服务停止,然后自动执行 docker-compose down:
docker compose wait --down-project
与之前使用 docker compose wait 类似,该命令会因服务正在运行而阻塞。
现在打开一个新的终端窗口或标签页。在这个新终端中,我们将手动停止服务。
在新终端窗口中导航至 ~/project 目录:
cd ~/project
使用以下命令停止服务:
docker-compose down
观察新终端窗口的输出,你将看到容器正在被停止和移除的提示信息。
现在切换回运行 docker compose wait --down-project 的原始终端窗口。当另一个终端中的 docker-compose down 命令停止服务后,docker compose wait 命令将检测到这一变化。由于使用了 --down-project 选项,它会自动继续关闭项目(即移除容器、网络和卷)。
你将在原始终端窗口看到与手动执行 docker-compose down 时类似的输出。项目关闭后,docker compose wait 命令将退出。
你已成功使用带 --down-project 选项的 docker compose wait 命令实现了等待服务停止后自动关闭项目的功能。
总结
在本实验中,我们学习了如何使用 docker compose wait 命令来阻塞直至服务停止。我们首先安装了 Docker Compose 并创建了一个简单的 docker-compose.yml 文件,其中定义了两个服务:web 和 db。这个配置为我们演示 wait 命令的功能提供了必要的环境。
随后我们探索了如何使用 docker compose wait 来阻塞直至 docker-compose.yml 文件中定义的所有服务停止。我们还学习了如何通过指定服务名称来仅等待特定服务停止,以及如何使用 --down-project 选项来等待整个项目被关闭。这些步骤展示了 docker compose wait 命令在管理 Docker Compose 服务生命周期方面的灵活性和实用性。



