`docker stop` 和 `docker kill` 有什么区别?

`docker stop` 和 `docker kill` 有什么区别?

docker stop和有什么区别docker kill

据我所知,两者都会停止正在运行的容器。 它会docker stop尝试以正确的方式停止容器内运行的进程,而docker kill会发送终止信号吗? 如果是这样,如何docker stop知道如何正确停止正在运行的进程?(因为这因进程而异。)

答案1

是不是 docker stop 会尝试以正确的方式停止容器内运行的进程,而 docker kill 会发送终止信号?

基本上是的,区别很微妙,但在命令行参考:

  • docker stop停止正在运行的容器(发送 SIGTERM,然后在宽限期后发送 SIGKILL)[...] 容器内的主进程将收到 SIGTERM,并在宽限期后收到 SIGKILL。[强调我的]
  • docker kill终止正在运行的容器(发送SIGKILL,或者指定的信号) [...] 容器内的主进程将被发送 SIGKILL,或者任何用选项--signal 指定的信号。[强调我的]

因此stop尝试通过发送标准POSIX 信号 SIGTERM,而kill默认情况下只是终止进程(但也允许发送任何其他信号):

SIGTERM 信号发送给进程以请求其终止。与 SIGKILL 信号不同,它可以被进程捕获并解释或忽略。这允许进程执行良好的终止,释放资源并在适当的情况下保存状态。应该注意的是,SIGINT 与 SIGTERM 几乎相同。

虽然没有强制执行,但通常希望进程能够SIGTERM根据其职责从容地处理并做正确的事情 - 但是这很容易失败,因为从容关闭尝试花费的时间比宽限期更长,如果数据完整性至关重要(例如对于数据库),则需要考虑这一点;例如,参见 Major Hayden 的SIGTERM 与 SIGKILL更详细的解释:

应用程序可以决定在收到 SIGTERM 后要做什么。虽然大多数应用程序会清理资源并停止,但有些应用程序可能不会。应用程序可以配置为在收到 SIGTERM 时执行完全不同的操作。此外,如果应用程序处于不良状态(例如等待磁盘 I/O),它可能无法对发送的信号采取行动。

答案2

docker kill将突然停止主入口点进程/程序。

docker stop会尝试优雅地阻止它(会礼貌地询问:P)

在这两种情况下,文件系统更改都将保留(在停止或终止时),因此如果您docker start <container>这样做,它将从那里继续。

答案3

除了之前添加的答案之外

追随docker events表演docker stop活动

  • kill (信号 15):其中信号 15 = SIGTERM
  • 停止

追随docker events表演docker kill活动

  • kill (信号 9):信号 9 = SIGKILL
  • 死亡(退出代码 137)

docker stop在终止进程之前有一个超时时间。默认为 10 秒。

这张表有更多细节。

答案4

这类似于拔掉桌面的插头并关闭计算机。

就像拔掉插头意味着硬关闭电源,docker kill意味着直接杀死 my_container,而这并不会先尝试正常关闭进程。

关闭计算机意味着向操作系统发送信号以关闭所有进程,而关闭计算机docker stop意味着发送信号终端向正在运行的容器发出信号以正常停止进程。

相关内容