我试图了解命令docker stop ContainerID
和docker pause ContainerID
之间的区别。根据{{3}},这两个都用于暂停现有的Docker容器。
答案 0 :(得分:8)
docker pause
命令挂起指定容器中的所有进程。在Linux上,这使用cgroups冷冻机。传统上,在挂起进程时会使用SIGSTOP信号,从挂起的进程可以观察到
https://docs.docker.com/engine/reference/commandline/pause/
docker stop
命令。容器内的主进程将收到SIGTERM,并在宽限期之后收到SIGKILL。
https://docs.docker.com/engine/reference/commandline/stop/#options
SIGTERM
是终止信号。默认行为是终止进程,但也可以捕获或忽略它。目的是优雅地杀死进程,但首先让它有机会进行清理。
SIGKILL
是杀死信号。唯一的行为是立即终止该进程。由于该进程无法捕获信号,因此无法清除,因此这是万不得已的信号。
SIGSTOP
是暂停信号。唯一的行为是暂停该过程。信号不能被捕获或忽略。 Shell使用暂停(及其对应的通过SIGCONT恢复)来实现作业控制。
答案 1 :(得分:2)
以及之前添加的答案
在docker events
显示事件后运行docker stop
在docker events
之后运行docker pause
仅显示一个事件
docker pause
仍将在容器暂停时保留内存部分>恢复容器时将使用此内存。 docker stop
释放容器停止后使用的内存。
This table包含更多详细信息。
答案 2 :(得分:1)
docker pause
暂停(即发送SIGSTOP
)暂停(读取:暂停)容器中所有进程。
docker stop
停止(即,发送SIGTERM
,并在需要时SIGKILL
发送到conrainer的主要流程。
答案 3 :(得分:0)
向运行中的容器发出docker pause命令时,将传递SIGSTOP信号,该信号使容器内的进程(基本上是容器本身)处于暂停状态。 因此,当发出docker unpause指令时,SIGCONT信号将传递到容器进程以还原容器过程。
当向正在运行的容器发出docker stop命令时,SIGTERM信号将传递到容器进程以停止和停止容器。
因此,当向容器发出docker暂停,并且重新启动docker服务时,释放分配给它的cgroup。 (因为SIGTERM被传递到所有容器进程) 因此,重新启动后,由于容器已停止,因此取消暂停将无济于事。