此实验场景全面概述了 Docker 的 stop 和 kill 命令之间的差异,包括它们的行为、用例和实际示例。了解这些差异对于正确的容器管理至关重要,尤其是在确保应用程序正常关闭时。
简介
在 Docker 中,stop 和 kill 命令都用于终止正在运行的容器,但它们的工作方式不同:
docker stop:首先发送 SIGTERM 信号,允许进程在终止前进行清理。如果进程未在指定的超时(默认为 10 秒)内终止,Docker将发送SIGKILL信号以强制停止该进程。docker kill:立即发送 SIGKILL 信号,终止进程而不进行任何清理。
使用 docker stop
步骤 1:运行有处理 SIGTERM 的进程的容器
使用 Ubuntu 映像运行容器,模拟处理 SIGTERM 信号的进程:
1  | docker run --name graceful-termination \  | 
命令分解
docker run:
创建和启动新容器的主要 Docker 命令。
--name graceful-termination:将容器命名为 graceful-termination,以便于管理和引用。
-d:以分离模式运行容器,这意味着它将在后台运行。
ubuntu:latest:指定要使用的 Docker 映像,在本例中为最新版本的 Ubuntu 映像。
/bin/bash -c:
在容器内启动 Bash shell 以执行以下脚本。
1  | trap 'echo SIGTERM received; exit 0' SIGTERM; while :; do echo 'Running'; sleep 1; done  | 
trap 'echo SIGTERM received; exit 0' SIGTERM:设置陷阱以捕获 SIGTERM 信号。收到此信号时,将打印消息“SIGTERM received”,脚本以状态 0 退出,表示正常关闭。while :; do echo 'Running'; sleep 1; done:每秒打印“Running”的无限循环。这会使容器保持运行,直到停止。
步骤 2:停止容器
使用 docker stop 命令终止容器:
1  | docker stop graceful-termination  | 
步骤 3:检查容器日志
检查日志以验证容器内的进程如何处理 SIGTERM 信号:
1  | docker logs graceful-termination  | 
1  | ...  | 
日志应显示进程已收到 SIGTERM 信号、执行 trap 命令、打印“已收到 SIGTERM”并正常退出。
使用 docker kill
步骤 1:运行有处理 SIGTERM 的进程的容器
运行与之前类似的容器:
1  | docker run --name force-termination \  | 
步骤 2:终止容器
使用 docker kill 命令终止容器:
1  | docker kill force-termination  | 
步骤 3:检查容器日志
检查日志以验证容器内进程被 SIGKILL 终止时的行为:
1  | docker logs force-termination  | 
1  | ...  | 
日志应显示连续的“正在运行”消息,而没有任何“收到 SIGTERM”的迹象,表明该进程被 SIGKILL 信号突然终止。
差异总结
发送的信号:
stop:首先发送SIGTERM,如果进程未在超时内终止,则发送SIGKILL。kill:立即发送SIGKILL。
正常关闭:
stop:允许进程处理信号并执行清理操作。kill:不允许任何处理或清理。
用例:
stop:用于正常关闭应用程序。kill:用于强制终止无响应的容器。
通过检查容器日志,我们可以清楚地看到行为上的差异。
stop 命令允许应用程序处理终止信号,而 kill 命令会导致立即终止而不进行任何清理。