如果容器内运行的进程无法停止,docker stop
会失败吗?如果我使用docker kill
,容器内的未保存数据能被保留吗?
相比于docker kill
,docker stop
是否耗时?我想关闭容器,但又不想丢失任何数据(不希望杀死或停止进程的过程延迟太高)。
如果容器内运行的进程无法停止,docker stop
会失败吗?如果我使用docker kill
,容器内的未保存数据能被保留吗?
相比于docker kill
,docker stop
是否耗时?我想关闭容器,但又不想丢失任何数据(不希望杀死或停止进程的过程延迟太高)。
docker stop
:停止运行中的容器(发送SIGTERM信号,然后在宽限期后发送SIGKILL信号)[...] 容器内的主进程将接收到SIGTERM信号,并在宽限期后接收到SIGKILL信号。[强调我的]
docker kill
:终止运行中的容器(发送SIGKILL信号,或指定的信号)[...] 容器内的主进程将被发送SIGKILL信号,或使用--signal选项指定的任何信号。[强调我的]
您可以从这篇文章中获取更多信息:《docker stop》和《docker kill》之间有什么区别?
Docker 停止命令:当您执行 docker stop 命令时,一个硬件信号将发送到该容器内部的进程。在 docker stop 的情况下,我们发送 SIGTERM 信号,它是终止信号的缩写,这是一个消息,将被进程接收,告诉它在自己的时间内关闭。
SIGTERM 用于在容器中停止进程并关闭容器时,您希望给容器内的进程一点时间来关闭自身并进行一些清理。
许多不同的编程语言都具有监听代码库中这些信号的能力,一旦收到该信号,您可以尝试做一些清理工作,或者保存一些文件、发出一些消息等。
另一方面,docker kill 命令会向容器内主运行进程发出 SIGKILL 或终止信号,因此 kill 命令表示必须立即关闭,无法再执行任何其他操作。
理想情况下,我们总是使用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,您将看到它立即死亡。
你应该使用docker stop
,因为它会优雅地停止容器,就像关闭笔记本电脑一样,而不是强制关闭 - 就像从电池中断电。
但是,如果需要花费超过10秒钟来优雅地停止容器,Docker会强制关闭(杀死进程)。
docker stop
命令会向进程发送SIGTERM(终止信号),然后Docker将有10秒钟的时间来清理,例如保存文件或发出一些消息。
当容器被锁定且无响应时,请使用 docker kill
命令。