我试图了解命令docker stop ContainerID
和docker pause ContainerID
之间的区别。根据this page,它们都用于暂停现有的Docker容器。
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使用pausing(及其对应的,通过SIGCONT恢复)来实现作业控制。
除了之前添加的答案
在docker events
展示事件后运行docker stop
在docker events
仅显示一个事件后运行docker pause
当容器暂停时,docker pause
仍将保留内存部分>当容器恢复时使用此内存。 docker stop
释放容器停止后使用的内存。
This table有更多细节。
docker pause
暂停(即发送SIGSTOP
)暂停(读取:暂停)容器中的所有进程[s]。
docker stop
停止(即发送SIGTERM
,如果需要SIGKILL
)到conrainer [s]的主要过程。
当使用docker pause命令发出运行容器时,传递SIGSTOP信号,该信号允许容器内的进程(基本上是容器本身)处于暂停状态。因此,当发布docker unpause时,SIGCONT信号将传递给容器进程以恢复容器进程。
当docker stop命令发送到正在运行的容器时,SIGTERM信号将传递给容器进程以停止和停止容器。
因此,当向容器发出docker pause并重新启动docker服务时,将释放分配给它的cgroup。 (因为SIGTERM被传递给所有容器进程)因此,在重新启动之后,由于容器停止,因此取消暂停将没有用处。