区分 Docker stop 和 Kill

此实验场景全面概述了 Dockerstopkill 命令之间的差异,包括它们的行为、用例和实际示例。了解这些差异对于正确的容器管理至关重要,尤其是在确保应用程序正常关闭时。

简介

Docker 中,stopkill 命令都用于终止正在运行的容器,但它们的工作方式不同:

  • docker stop:首先发送 SIGTERM 信号,允许进程在终止前进行清理。如果进程未在指定的超时(默认为 10 秒)内终止,Docker 将发送 SIGKILL 信号以强制停止该进程。
  • docker kill:立即发送 SIGKILL 信号,终止进程而不进行任何清理。

使用 docker stop

步骤 1:运行有处理 SIGTERM 的进程的容器

使用 Ubuntu 映像运行容器,模拟处理 SIGTERM 信号的进程:

1
2
3
docker run --name graceful-termination \
-d ubuntu:latest \
/bin/bash -c "trap 'echo SIGTERM received; exit 0' SIGTERM; while :; do echo 'Running'; sleep 1; done"

命令分解

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
2
3
4
5
...
Running
Running
Running
SIGTERM received

日志应显示进程已收到 SIGTERM 信号、执行 trap 命令、打印“已收到 SIGTERM”并正常退出。

使用 docker kill

步骤 1:运行有处理 SIGTERM 的进程的容器

运行与之前类似的容器:

1
2
3
docker run --name force-termination \
-d ubuntu:latest \
/bin/bash -c "trap 'echo SIGTERM received; exit 0' SIGTERM; while :; do echo 'Running'; sleep 1; done"

步骤 2:终止容器

使用 docker kill 命令终止容器:

1
docker kill force-termination

步骤 3:检查容器日志

检查日志以验证容器内进程被 SIGKILL 终止时的行为:

1
docker logs force-termination
1
2
3
4
...
Running
Running
Running

日志应显示连续的“正在运行”消息,而没有任何“收到 SIGTERM”的迹象,表明该进程被 SIGKILL 信号突然终止。

差异总结

发送的信号:

  • stop:首先发送 SIGTERM,如果进程未在超时内终止,则发送 SIGKILL
  • kill:立即发送 SIGKILL

正常关闭:

  • stop:允许进程处理信号并执行清理操作。
  • kill:不允许任何处理或清理。

用例:

  • stop:用于正常关闭应用程序。
  • kill:用于强制终止无响应的容器。

通过检查容器日志,我们可以清楚地看到行为上的差异。

stop 命令允许应用程序处理终止信号,而 kill 命令会导致立即终止而不进行任何清理。