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
意味着发送信号终端向正在运行的容器发出信号以正常停止进程。