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

Gee*_*Jan 157 docker

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

Afaik,两者都会停止正在运行的容器。是否docker stop试图以正确的方式停止容器内运行的进程,同时docker kill会发送终止信号?如果是这样,如何docker stop知道如何正确停止正在运行的进程。(因为这因过程而异)

Ste*_*pel 146

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

基本上是的,差异很小,但在命令行参考中概述:

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

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

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

虽然无论如何都没有强制执行,但通常希望进程能够SIGTERM优雅地处理并根据其职责做正确的事情 - 由于正常关闭尝试花费的时间比宽限期长,这很容易失败,如果数据完整性是需要考虑的最重要的(例如对于数据库);有关更详细的说明,请参见例如海登少校的SIGTERM 与 SIGKILL

一旦收到 SIGTERM,应用程序就可以确定它想要做什么。虽然大多数应用程序会清理它们的资源并停止,但有些可能不会。当收到 SIGTERM 时,应用程序可能被配置为做一些完全不同的事情。此外,如果应用程序处于错误状态,例如等待磁盘 I/O,它可能无法对发送的信号采取行动。

  • 因此,如果我想要一个通用的容器关闭程序,我必须在主管/运行过程中捕获 SIGTERM 吗? (2认同)

小智 16

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

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

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

  • Docker 容器不是虚拟机,内核通过 kill 保持活动状态。因此,任何已到达内核的文件系统更改都将完整提交。应该不可能损坏文件系统(在 fsck 意义上;应用程序可能不喜欢丢失一些写入)。`docker kill` 类似于杀死一个进程,*不*关闭计算机。 (3认同)

fab*_*aws 6

除了之前添加的答案

运行docker eventsdocker stop显示事件

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

运行docker eventsdocker kill显示事件

  • 杀死(信号 9):其中信号 9 = SIGKILL
  • 死(退出代码 137)

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

该表包含更多详细信息。