我应该使用哪个命令?'docker kill' 还是 'docker stop'?

31

如果容器内运行的进程无法停止,docker stop会失败吗?如果我使用docker kill,容器内的未保存数据能被保留吗?

相比于docker killdocker stop是否耗时?我想关闭容器,但又不想丢失任何数据(不希望杀死或停止进程的过程延迟太高)。

4个回答

35
行参考: docker stop:停止运行中的容器(发送SIGTERM信号,然后在宽限期后发送SIGKILL信号)[...] 容器内的主进程将接收到SIGTERM信号,并在宽限期后接收到SIGKILL信号。[强调我的]

docker kill:终止运行中的容器(发送SIGKILL信号,或指定的信号)[...] 容器内的主进程将被发送SIGKILL信号,或使用--signal选项指定的任何信号。[强调我的]

您可以从这篇文章中获取更多信息:《docker stop》和《docker kill》之间有什么区别?

11

Docker 停止命令:当您执行 docker stop 命令时,一个硬件信号将发送到该容器内部的进程。在 docker stop 的情况下,我们发送 SIGTERM 信号,它是终止信号的缩写,这是一个消息,将被进程接收,告诉它在自己的时间内关闭。

SIGTERM 用于在容器中停止进程并关闭容器时,您希望给容器内的进程一点时间来关闭自身并进行一些清理。

许多不同的编程语言都具有监听代码库中这些信号的能力,一旦收到该信号,您可以尝试做一些清理工作,或者保存一些文件、发出一些消息等。

enter image description here

另一方面,docker kill 命令会向容器内主运行进程发出 SIGKILL 或终止信号,因此 kill 命令表示必须立即关闭,无法再执行任何其他操作。 enter image description here

理想情况下,我们总是使用docker stop命令停止容器,以便其中运行的进程有一点时间来关闭自身,否则如果容器似乎已经挂起并且没有响应docker stop命令,则可以使用docker kill命令。

关于docker stop的一个小特别之处或有趣之处是:当对容器发出docker stop命令时,如果容器在10秒内没有自动停止,则docker将自动退回到发出docker kill命令。

因此,实际上,在docker stop中,我们表现得很好,但它只有10秒钟的时间来实际关闭。

一个好的例子可能是ping命令。 sudo docker run busybox ping google.com 现在,如果您想要停止容器,如果您使用docker stop container_id,您将看到在获取关闭之前需要等待10秒,因为ping命令不能正确响应SIGTERM消息。换句话说,ping命令实际上无法说“噢,我明白你想让我关闭了”。

所以,在等了这10秒钟之后,终究会向其发送kill信号,告诉它:“嘿,ping,你完成了,请自行关闭。”

但是,如果您使用docker kill container_id,您将看到它立即死亡。


7

你应该使用docker stop,因为它会优雅地停止容器,就像关闭笔记本电脑一样,而不是强制关闭 - 就像从电池中断电。

但是,如果需要花费超过10秒钟来优雅地停止容器,Docker会强制关闭(杀死进程)。


6

docker stop 命令会向进程发送SIGTERM(终止信号),然后Docker将有10秒钟的时间来清理,例如保存文件或发出一些消息。

当容器被锁定且无响应时,请使用 docker kill 命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接