docker stop和docker kill有什么区别?


116

docker stop和之间有什么区别docker kill

Afaik,两者都会停止正在运行的容器。是docker stop尝试停止以正确方式在容器内运行的进程,同时docker kill发送终止信号吗?如果是这样,怎么会docker stop知道如何正确停止正在运行的进程。(由于每个过程的不同)

Answers:


112

docker stop是否试图以正确的方式停止在容器内运行的进程,而docker kill将发送kill信号?

基本上可以,区别是细微的,但在命令行参考中概述:

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

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

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

尽管无论如何都不强制执行,但是通常希望进程能够妥善处理SIGTERM并根据其职责执行正确的操作-由于正常关闭尝试花费的时间比宽限期长,因此很容易失败,这是要考虑数据完整性的问题最重要的(例如对于数据库);参见例如海顿少校的SIGTERM vs. SIGKILL了解更详细的解释:

收到SIGTERM后,应用程序可以确定其要执行的操作。虽然大多数应用程序将清理其资源并停止运行,但有些可能不会。接收到SIGTERM时,可以将应用程序配置为执行完全不同的操作。另外,如果应用程序处于不良状态(例如,等待磁盘I / O),则它可能无法对已发送的信号进行操作。


1
因此,如果我想对容器使用通用的关闭程序,那么我将不得不在主管/单元过程中遇到SIGTERM吗?
CMCDragonkai 2014年

这里的最佳做法是什么?我了解为什么我们会docker kill手工关闭以节省一些时间,但是在脚本中,尝试通过以下方式进行正常关闭并非总会更好docker stop吗?我仍然docker kill在脚本中看到很多。
丹尼斯

10

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

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

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


1
...但是,如果docker kill主进程仍在内存中进行任何未决的文件系统更改,则这些丢失将丢失,因此文件系统可能最终受损?
Arjan

显然,由于是突然停止,因此仅杀死时的更改将被保留。任何待处理的内容都会丢失。我的意思是,docker kill并不是真的...杀死容器,它停止了进程。就像您关闭计算机电源而不是关闭电源一样
awkwardarts 17-4-30

2
Docker容器不是VM,并且内核通过杀死保持活动。因此,到达内核的任何文件系统更改都将原封不动地提交。不可能损坏文件系统(从fsck的角度来看;应用程序可能不喜欢丢失一些写操作)。docker kill类似于杀死进程,而不是关闭计算机电源。
伊恩·豪森

3

以及之前添加的答案

表演事件docker events后运行docker stop

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

表演事件docker events后运行docker kill

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

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

该表具有更多详细信息。


1

类似于将插头从桌面拔下关闭计算机

就像拔掉插头意味着硬关闭电源一样,这docker kill意味着直接杀死my_container的方法,后者不会尝试先优雅地关闭进程。

关闭计算机意味着向OS发送信号以关闭所有进程,而这docker stop意味着向SIGTERM正在运行的容器发送信号以正常停止进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.