介绍
在本实验中,你将学习如何使用 docker compose stop 命令来管理 Docker Compose 文件中定义的服务。我们将从准备一个简单的 Docker Compose 项目开始,包括安装 Docker Compose 和创建一个基础的 docker-compose.yml 文件。
完成项目设置后,你将练习启动 Compose 文件中定义的服务。实验的核心内容是使用 docker compose stop 命令来停止所有运行中的服务、停止特定服务以及通过指定超时时间来停止服务。这些实践操作将帮助你掌握使用 Docker Compose 控制多容器 Docker 应用生命周期的实用技能。
准备一个简单的 Docker Compose 项目
在这一步中,我们将准备一个简单的 Docker Compose 项目。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序的服务,然后只需一条命令就能根据配置创建并启动所有服务。
由于 LabEx 环境中没有预装 Docker Compose,我们需要先安装它。我们将下载 Docker Compose 二进制文件并赋予可执行权限。
首先,让我们下载 Docker Compose 二进制文件。我们将使用 curl 下载最新稳定版本:
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
该命令会下载适用于你系统架构的 Docker Compose 二进制文件,并保存到 /usr/local/bin/docker-compose。
接下来,我们需要使下载的二进制文件可执行:
sudo chmod +x /usr/local/bin/docker-compose
该命令为 Docker Compose 二进制文件添加执行权限。
现在,让我们通过检查 Docker Compose 版本来验证安装:
docker-compose --version
你应该能在输出中看到已安装的 Docker Compose 版本,确认安装成功。
现在 Docker Compose 已安装完成,让我们创建一个简单的 Docker Compose 项目。我们将为项目创建一个目录,然后在其中创建 docker-compose.yml 文件。
首先,在你的主目录下创建一个名为 my-compose-app 的目录:
mkdir ~/project/my-compose-app
进入新创建的目录:
cd ~/project/my-compose-app
现在,我们将创建 docker-compose.yml 文件。这个文件将定义我们应用程序的服务。我们将使用 nano 来创建和编辑文件:
nano docker-compose.yml
在 nano 编辑器中,粘贴以下内容:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: tail -f /dev/null
让我们解析这个 docker-compose.yml 文件:
version: '3.8'指定 Docker Compose 文件格式版本services:定义组成你应用程序的服务web:定义一个名为web的服务image: nginx:latest指定该服务将使用nginx:latestDocker 镜像。如果本地没有该镜像,Docker Compose 会从 Docker Hub 拉取ports:将主机的 80 端口映射到web容器的 80 端口
app:定义一个名为app的服务image: ubuntu:latest指定该服务将使用ubuntu:latestDocker 镜像command: tail -f /dev/null指定app容器启动时运行的命令。该命令使容器保持运行状态而不会退出
按 Ctrl + X,然后按 Y,最后按 Enter 保存文件。
在启动服务之前,我们需要确保所需的 Docker 镜像可用。虽然 Docker Compose 会在镜像不存在时自动拉取,但提前显式拉取镜像是个好习惯,特别是在网络受限的环境中或为了更快的启动速度。
让我们拉取 nginx:latest 镜像:
docker pull nginx:latest
该命令会从 Docker Hub 下载 nginx:latest 镜像。
接着,拉取 ubuntu:latest 镜像:
docker pull ubuntu:latest
该命令会从 Docker Hub 下载 ubuntu:latest 镜像。
现在,你已经成功准备了一个简单的 Docker Compose 项目,包含 web 和 app 两个服务,并拉取了所需的 Docker 镜像。
启动 Compose 文件中定义的服务
在这一步中,我们将启动上一步创建的 docker-compose.yml 文件中定义的服务。Docker Compose 提供了一个简单的命令来构建、创建并启动配置中的所有服务。
请确保你位于包含 docker-compose.yml 文件的 ~/project/my-compose-app 目录中:
cd ~/project/my-compose-app
要启动服务,我们将使用 docker-compose up 命令。默认情况下,该命令会在前台启动容器并打印每个容器的日志:
docker-compose up
运行此命令时,Docker Compose 会执行以下操作:
- 在当前目录查找
docker-compose.yml文件 - 为每个服务构建或拉取必要的 Docker 镜像(如果尚未可用)
- 创建并启动每个服务的容器
- 在终端显示所有运行中容器的日志
你将看到网络和容器被创建并启动的输出信息。来自 web (nginx) 和 app (ubuntu) 容器的日志将会显示。
由于我们希望服务在后台运行以便继续使用终端,可以按 Ctrl + C 停止当前执行。
要在分离模式(后台)下运行服务,我们可以使用带 -d 标志的 docker-compose up 命令:
docker-compose up -d
该命令会在后台启动服务,并打印已创建容器的名称。
现在服务已在后台运行,你可以使用 docker ps 命令检查运行中的容器状态:
docker ps
你应该会看到两个正在运行的容器:一个是 web 服务(基于 nginx 镜像),另一个是 app 服务(基于 ubuntu 镜像)。输出信息将显示容器的 ID、镜像、状态和端口等详细信息。
要验证 web 服务是否可访问,我们可以使用 curl 访问运行在 80 端口的 nginx 服务器。由于我们将主机的 80 端口映射到了 web 容器的 80 端口,可以直接从 LabEx 虚拟机访问:
curl http://localhost:80
你应该能看到 nginx 网络服务器提供的默认 HTML 内容,这确认了 web 服务正在运行且可访问。
停止所有运行中的服务
在本步骤中,我们将学习如何停止当前作为 Docker Compose 项目一部分运行的所有服务。Docker Compose 提供了一个便捷命令来停止 docker-compose.yml 文件中定义的所有容器。
请确保你位于包含 docker-compose.yml 文件的 ~/project/my-compose-app 目录中:
cd ~/project/my-compose-app
要停止所有运行中的服务,我们使用 docker-compose down 命令。该命令会停止并移除 docker-compose.yml 文件中定义的容器、网络和卷:
docker-compose down
运行此命令时,Docker Compose 会执行以下操作:
- 优雅地停止运行中的容器
- 移除已停止的容器
- 移除 Docker Compose 为本项目创建的网络
- 移除
docker-compose.yml文件中定义的所有卷(除非明确指定保留)
你将看到容器和网络被停止并移除的输出信息。
运行 docker-compose down 后,可以使用 docker ps 命令验证容器是否已停止运行:
docker ps
该命令会列出当前运行中的容器。由于我们已停止所有服务,输出中不应出现 web 或 app 容器。如果系统没有其他容器运行,输出应仅显示标题行或为空。
当你完成 Docker Compose 项目后,使用 docker-compose down 停止服务是清理项目资源的标准方式。
停止指定服务
在本步骤中,我们将学习如何停止 Docker Compose 项目中的特定服务,而不是一次性停止所有服务。当你只需要重启或停止应用程序的单个组件时,这个功能特别有用。
首先,确保我们的服务正在运行。导航到项目目录并以分离模式启动服务:
cd ~/project/my-compose-app
docker-compose up -d
使用 docker ps 验证 web 和 app 服务是否都在运行:
docker ps
你应该能看到两个容器都显示为运行状态。
现在,我们只停止 app 服务。要停止特定服务,我们使用 docker-compose stop 命令后接服务名称:
docker-compose stop app
该命令会向 app 服务的容器发送停止信号,并等待其优雅地停止。
运行命令后,再次检查容器状态:
docker ps
现在你应该只能看到 web 容器仍在运行,app 容器应该已从运行容器列表中消失。
要确认 app 容器已停止,也可以使用 docker ps -a 命令,它会显示包括已停止容器在内的所有容器:
docker ps -a
你应该能看到 app 容器显示为 Exited 状态。
停止特定服务可以让你在不影响其他组件的情况下管理应用程序的单个部分。这在开发过程中或需要排查特定服务问题时特别有帮助。
带超时停止服务
在本步骤中,我们将探讨如何使用指定超时时间来停止服务。当你停止容器时,Docker 会向容器内的主进程发送 SIGTERM 信号,给予其优雅关闭的时间。如果进程未在指定时间内退出,Docker 将发送 SIGKILL 信号强制终止。默认超时时间为 10 秒,你可以通过 docker-compose stop 或 docker-compose down 命令的 -t 或 --timeout 参数调整这个超时时间。
首先,确保我们的服务正在运行。导航到项目目录并以分离模式启动服务:
cd ~/project/my-compose-app
docker-compose up -d
验证两个服务是否都在运行:
docker ps
现在,让我们以 5 秒超时停止 web 服务:
docker-compose stop -t 5 web
该命令指示 Docker Compose 在发送 SIGTERM 信号后,最多等待 5 秒让容器优雅停止。如果容器未在 5 秒内停止,Docker 将发送 SIGKILL 信号。
你将看到 web 服务正在停止的输出信息。
再次检查容器状态:
docker ps
现在应该只能看到 app 容器在运行,web 容器应已停止。
同样地,你可以在使用 docker-compose down 停止所有服务时应用超时设置。让我们以 3 秒超时停止所有服务:
docker-compose down -t 3
该命令会尝试停止 docker-compose.yml 文件中定义的所有服务,为每个容器提供最多 3 秒的优雅停止时间,之后将强制停止。
执行命令后验证是否没有容器在运行:
docker ps
输出应显示没有运行中的容器。
使用超时选项非常重要,它能确保你的应用程序在停止前有足够时间执行清理任务,避免数据损坏或其他问题。
总结
在本实验中,我们学习了如何准备一个简单的 Docker Compose 项目。这包括通过下载二进制文件并赋予可执行权限来安装 Docker Compose,然后验证安装是否成功。接着我们创建了项目目录和 docker-compose.yml 文件来定义应用程序的服务。
我们还学习了如何使用 docker compose stop 命令来管理 Compose 文件中定义的服务生命周期。这包括启动所有服务、停止所有运行中的服务、停止特定服务以及使用指定超时时间来停止服务。



