如何使用 docker compose kill 命令强制停止服务

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose kill 命令强制停止 Docker Compose 文件中定义的服务。我们将首先准备一个包含多个服务的简单 Compose 文件,并使用 docker compose up 启动这些服务。

接下来,你将探索 docker compose kill 命令的不同使用方式:强制停止所有服务、强制停止特定服务,以及使用不同信号强制停止服务。通过这个动手实践,你将获得使用 kill 命令管理 Docker Compose 服务的实用知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555081{{"如何使用 docker compose kill 命令强制停止服务"}} docker/logs -.-> lab-555081{{"如何使用 docker compose kill 命令强制停止服务"}} docker/pull -.-> lab-555081{{"如何使用 docker compose kill 命令强制停止服务"}} end

准备包含多个服务的简单 Compose 文件

在本步骤中,我们将准备一个定义多个服务的简单 Docker Compose 文件。Docker Compose 是一个允许你定义和运行多容器 Docker 应用程序的工具。虽然当前虚拟机已预装 Docker,但尚未安装 Docker Compose,我们需要先进行安装。

首先安装 Docker Compose。我们将下载最新稳定版本并赋予可执行权限:

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
sudo chmod +x /usr/local/bin/docker-compose

通过检查版本号验证安装是否成功:

docker-compose --version

控制台应显示版本信息,确认 Docker Compose 已正确安装。

接下来创建项目目录并进入:

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

在该目录下创建 docker-compose.yml 文件,我们将使用 nano 编辑器进行编辑:

nano docker-compose.yml

nano 编辑器中粘贴以下内容。该文件定义了两个服务:webredisweb 服务使用 nginx 镜像,并将容器的 80 端口映射到主机的 8080 端口;redis 服务使用 redis 镜像:

version: "3.8"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  redis:
    image: redis

粘贴完成后,按 Ctrl + X,然后按 Y,最后按 Enter 保存文件。

启动服务前需要先拉取 docker-compose.yml 中定义的镜像:

docker pull nginx
docker pull redis

这些命令将从 Docker Hub 下载 nginxredis 镜像。

使用 docker compose up 启动服务

在本步骤中,我们将使用 docker compose up 命令启动 docker-compose.yml 文件中定义的服务。该命令会构建、(重新)创建、启动并连接到服务的容器。

请确保你位于创建 docker-compose.yml 文件的目录 ~/project/my-compose-app 中:

cd ~/project/my-compose-app

运行以下命令启动服务。-d 参数表示以分离模式运行容器,即容器将在后台运行且不会占用终端:

docker-compose up -d

你将看到输出信息,显示网络、卷(如有)和容器正在被创建和启动。

使用 docker ps 命令验证容器是否正在运行:

docker ps

该命令会列出所有运行中的容器。你应该能看到 web (nginx) 和 redis 两个容器的条目。

你也可以使用 docker-compose logs 命令查看服务日志:

docker-compose logs

这将显示所有服务的日志。如需查看特定服务的日志,可以添加服务名称,例如 docker-compose logs web

最后,由于我们将 nginx 容器的 80 端口映射到了主机的 8080 端口,你可以使用 curl 访问 8080 端口的 localhost 来查看默认的 Nginx 欢迎页面:

curl localhost:8080

输出中应该会显示 Nginx 欢迎页面的 HTML 内容。

使用 docker compose kill 强制停止所有服务

在本步骤中,我们将学习如何使用 docker compose kill 命令强制停止 docker-compose.yml 文件中定义的所有运行中服务。与优雅停止容器并移除资源的 docker compose down 不同,docker compose kill 会向容器发送指定信号使其立即强制停止。

请确保你位于 ~/project/my-compose-app 目录中:

cd ~/project/my-compose-app

要强制停止所有服务,只需运行不带服务名称参数的 docker compose kill 命令。默认情况下,该命令会向容器发送 SIGKILL 信号:

docker-compose kill

你将看到输出信息,显示容器正在被强制停止。

再次使用 docker ps 命令验证容器是否已停止:

docker ps

此时列表中应该不再显示 web (nginx) 和 redis 容器,因为它们已被停止。

你也可以使用 docker ps -a 查看所有容器(包括已停止的)。应该能看到状态为 "Exited" 的 my-compose-app-web-1my-compose-app-redis-1 容器:

docker ps -a

使用 docker compose kill 强制停止特定服务

在本步骤中,我们将学习如何通过 docker compose kill 命令后接服务名称的方式,强制停止 docker-compose.yml 文件中定义的特定服务。

首先,让我们重新启动服务以便有容器可供停止。请确保你位于 ~/project/my-compose-app 目录中:

cd ~/project/my-compose-app
docker-compose up -d

使用 docker ps 命令确认两个容器都在运行:

docker ps

现在,我们仅强制停止 web 服务。通过在 docker compose kill 命令后添加服务名称 web 来实现:

docker-compose kill web

你将看到输出信息,显示 web 容器正在被强制停止。

再次使用 docker ps 命令验证只有 web 容器被停止:

docker ps

此时应该只看到 redis 容器显示为运行状态,web 容器不应出现在运行中容器列表里。

你也可以使用 docker ps -a 查看所有容器(包括已停止的)。my-compose-app-web-1 容器的状态应为 "Exited",而 my-compose-app-redis-1 容器应仍显示为 "Up":

docker ps -a

使用 docker compose kill -s 通过不同信号强制停止服务

在本步骤中,我们将探索如何使用带有 -s 标志的 docker compose kill 命令向容器发送特定信号。默认情况下,docker compose kill 会发送 SIGKILL 信号立即终止进程,但有时你可能希望发送其他信号(如 SIGTERM),该信号会请求进程优雅终止。

首先确保服务正在运行。进入项目目录并以分离模式启动服务:

cd ~/project/my-compose-app
docker-compose up -d

使用 docker ps 验证两个容器都在运行:

docker ps

现在,我们使用 SIGTERM 信号强制停止所有服务。通过 -s 标志后接信号名称实现:

docker-compose kill -s SIGTERM

你将看到输出信息,显示容器正在通过指定信号被终止。

使用 docker ps 命令确认容器已停止:

docker ps

此时 webredis 容器都不应出现在运行列表中。

通过 docker ps -a 可以查看已退出的容器:

docker ps -a

发送不同信号的能力对于实现更可控的关闭过程非常有用,如果容器内应用配置了信号处理程序,这将允许它们在退出前执行清理任务。

最后,要清理已停止的容器及 Docker Compose 创建的网络,可以使用 docker compose down 命令:

docker-compose down

该命令将停止并移除 docker-compose.yml 文件中定义的容器、网络和卷。

总结

在本实验中,我们学习了如何准备一个定义多个服务(webredis)的简单 Docker Compose 文件,并安装了 Docker Compose。随后,我们使用 docker compose up 命令启动了这些服务。接着,我们探索了如何使用 docker compose kill 强制停止 Compose 文件中定义的所有运行服务,以及如何通过 docker compose kill <service_name> 针对特定服务进行强制终止。最后,我们学习了如何在终止过程中使用 -s 标志(如 docker compose kill -s SIGKILL)向服务发送不同的信号。