如何使用 docker compose wait 命令阻塞直至服务停止

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何高效使用 docker compose wait 命令来管理 Docker Compose 服务的生命周期。我们将从创建一个包含多个服务的基础 docker-compose.yml 文件开始,并观察服务启动后的初始状态。

随后,你将探索 docker compose wait 的核心功能——阻塞执行直到项目中的所有服务停止。我们将演示如何使用该命令等待特定服务停止,最后展示如何结合 docker compose wait--down-project 选项实现完整的项目关闭与等待操作。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} docker/stop -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} docker/rm -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} docker/logs -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} docker/create -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} docker/volume -.-> lab-555097{{"如何使用 docker compose wait 命令阻塞直至服务停止"}} end

创建包含多个服务的简易 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:latestpostgres:latest),Docker Compose 会先下载它们。根据网络状况,下载可能需要一些时间。下载完成后,将为 webdb 服务创建并启动容器。

你将看到输出信息显示网络、卷(虽然我们的简单示例中未定义)和容器正在被创建和启动。

使用 docker-compose ps 命令检查运行中服务的状态:

docker-compose ps

该命令列出当前目录下由 Docker Compose 管理的容器。你应该能看到 webdb 服务及其状态,正常应为 Up

也可以使用标准 docker ps 命令查看系统中所有运行中的容器,包括由 Docker Compose 启动的:

docker ps

查找容器名称前缀为目录名(本例为 project)后接服务名的容器(如 project-web-1project-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

你应该能看到 webdb 服务都显示为 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 文件,其中定义了两个服务:webdb。这个配置为我们演示 wait 命令的功能提供了必要的环境。

随后我们探索了如何使用 docker compose wait 来阻塞直至 docker-compose.yml 文件中定义的所有服务停止。我们还学习了如何通过指定服务名称来仅等待特定服务停止,以及如何使用 --down-project 选项来等待整个项目被关闭。这些步骤展示了 docker compose wait 命令在管理 Docker Compose 服务生命周期方面的灵活性和实用性。