此实验场景全面概述了 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
命令会导致立即终止而不进行任何清理。