docker kill 和 stop 有什么区别


看官方的文档中这样描述:
docker stop
Stop a running container by sending SIGTERM and then SIGKILL after a grace period

docker kill
Kill a running container using SIGKILL or a specified signal

这两个究竟有什么区别呢?
已邀请:

shlallen - DaoCloud软件工程师,合伙人

赞同来自: oilbeater 徐新坤


有区别的,kill是不管容器同不同意,我直接执行kill -9,强行终止;stop的话,首先给容器发送一个TERM信号,让容器做一些退出前必须的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内,容器还是没有停止,再进行kill -9,强行终止。

徐新坤 - 京东商城-TIG-JDOS团队

赞同来自: oilbeater OhMyDock


同意shlallen的回答。我具体一些,可以参考daemon/daemon/container.go。
stop的函数为:

<pre>func (container *Container) Stop(seconds int) error {
if !container.IsRunning() {
return nil
}

// 1. Send a SIGTERM
if err := container.killPossiblyDeadProcess(15); err != nil {
log.Infof("Failed to send SIGTERM to the process, force killing")
if err := container.killPossiblyDeadProcess(9); err != nil {
return err
}
}

// 2. Wait for the process to exit on its own
if _, err := container.WaitStop(time.Duration(seconds) * time.Second); err != nil {
log.Infof("Container %v failed to exit within %d seconds of SIGTERM - using the force", container.ID, seconds)
// 3. If it doesn't, then send SIGKILL
if err := container.Kill(); err != nil {
container.WaitStop(-1 * time.Second)
return err
}
}
return nil
</pre>}

可以看到,是发一个SIGTERM,让容器自己停。容器进程规定之间内不停,那么再调Kill()。

<pre>func (container *Container) Kill() error {
if !container.IsRunning() {
return nil
}

// 1. Send SIGKILL
if err := container.killPossiblyDeadProcess(9); err != nil {
return err
}

// 2. Wait for the process to die, in last resort, try to kill the process directly
if _, err := container.WaitStop(10 * time.Second); err != nil {
// Ensure that we don't kill ourselves
if pid := container.GetPid(); pid != 0 {
log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", common.TruncateID(container.ID))
if err := syscall.Kill(pid, 9); err != nil {
if err != syscall.ESRCH {
return err
}
log.Debugf("Cannot kill process (pid=%d) with signal 9: no such process.", pid)
}
}
}

container.WaitStop(-1 * time.Second)
return nil
</pre>}

Kill的代码,就是直接发SIGKILL。再不行,系统直接kill -9。

DockOne - DockOne官方账号

赞同来自: oilbeater


不解释了,这个问题这里可以找到:http://superuser.com/questions ... -kill

隔壁老王 - 腾讯云高级工程师

赞同来自: oilbeater


题主引用官方文档,已经说明了二者的区别。
这里有个链接https://labs.ctl.io/gracefully ... ners/,也是在讨论这个问题。我这里在抛砖引玉,大致展开一下。
docker stop,支持“优雅退出”。先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。
docker kill,发送SIGKILL信号,应用程序直接退出。

更进一步,线上应用优雅退出十分必要,docker stop也不是docker独有的设计,lxc和google borg系统都有类似设计。之前我负责的线上系统采用lxc发送具体信号支持应用优雅退出;Borg也可以在发送SIGKILL之前,发送SIGTERM信号通知任务。(borg原文:“Tasks can ask to be notified via a Unix SIGTERM signal before they are preempted by a SIGKILL, so they have time to clean up, save state, finish any currently-executing requests, and decline new ones.”)

shlallen - DaoCloud软件工程师,合伙人

赞同来自:


原来是刘兄哈,一开始我都没有人出来,哈哈

要回复问题请先登录注册