暂停与停止 docker

pause vs stop in docker

我想了解命令 docker stop ContainerIDdocker pause ContainerID 之间的区别。根据 this page 它们都用于暂停现有的 Docker 容器。

docker pause 暂停(即发送 SIGSTOP)暂停(读取:暂停)容器中的所有进程[s]。

docker stop 停止(即发送 SIGTERM,如果需要 SIGKILL)到 conrainer[s] 的主进程。

docker pause命令挂起指定容器中的所有进程。在 Linux 上,这使用了 cgroups freezer。传统上,当挂起进程时,使用 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 恢复)来实现作业控制。

以及对之前添加的答案的补充

运行 docker eventsdocker stop 显示事件后

  • kill(信号 15):其中信号 15 = SIGTERM
  • 停止

运行 docker eventsdocker pause 之后只显示一个事件

  • 暂停

另外 docker pause 在容器暂停时仍会保留内存部分。恢复容器时使用此内存。 docker stop 释放容器停止后使用的内存。

This table 有更多细节。

当 运行 容器发出 docker 暂停命令时,SIGSTOP 信号被传递,允许容器内的进程(基本上是容器本身)处于暂停状态。 因此,当发出 docker unpause 时,SIGCONT 信号将传递给容器进程以恢复容器进程。

当向运行容器发出docker停止命令时,SIGTERM信号被传递给容器进程停止并停止容器。

因此,当 docker pause 被发送到一个容器,并且 docker 服务被重新启动时,分配给它的 cgroups 被释放。 (因为 SIGTERM 被传递给所有容器进程) 所以在重启后,unpause 不会有帮助,因为容器已停止。