Paused 状态是通过 cgroups freezer 冻结进程,内存数据完整驻留 RAM 但不可访问;恢复时仅解除冻结标志,毫秒级续执行,不涉及磁盘 I/O 或状态重建,也不能替代持久化。

容器处于 Paused 状态时,并非真正“停止”,而是被 Linux 的 cgroups freezer 子系统冻结:所有进程暂停执行、不调度、不消耗 CPU,但内存数据完整保留在物理 RAM 中,不写入磁盘,也不释放。
Paused 的本质是进程冻结,不是内存快照
不同于 docker commit 生成镜像,Pause 不保存容器文件系统或内存内容为新镜像。它只通过 cgroup.freeze 接口向内核发出冻结指令,对应进程的 task_struct 被标记为 TASK_FROZEN,调度器跳过它们。此时:
- 进程堆栈、堆内存、打开的文件描述符、网络连接状态(如 TCP ESTABLISHED)全部原样驻留内存
- 容器 rootfs 和挂载点未变动,无新层生成
-
docker ps显示状态为Paused,docker top查不到进程,ps在宿主机也看不到其线程
内存不会被交换或丢弃,但不可访问
冻结后,内存页仍由容器的 memory cgroup 管理,不会被 kernel swap out(除非全局内存压力极大且 cgroup 允许 swap),也不会被其他进程复用。但用户态无法读写——因为进程上下文被挂起,页表项虽存在,但无执行流触发缺页或访问。简单说:内存没丢,只是“锁在柜子里”,钥匙被收走了。
Resume 恢复极快,因无需加载或重建
执行 docker unpause 时,仅解除 cgroup 冻结标志,内核将进程状态从 TASK_FROZEN 切回 TASK_INTERRUPTIBLE 或运行态,几毫秒内即可继续执行,就像从未中断过。这和重启容器、从镜像重加载、或恢复 checkpoint(如 CRIU)有本质区别:
- 无磁盘 I/O,不读镜像层
- 不重新初始化网络栈或挂载
- 应用内部状态(如 JVM 堆对象、数据库连接池、socket 缓冲区)完全连续
它不是内存镜像,也不能替代持久化
Pause 不能用于备份或迁移。一旦宿主机重启、OOM Killer 杀掉 frozen 进程、或手动 docker kill,内存内容立即丢失。若需保存运行时状态,应使用:
-
docker checkpoint(需启用 CRIOU)——真正序列化内存与执行上下文到磁盘 - 应用层快照(如 Redis
SAVE、PostgreSQLpg_basebackup) - 外部存储同步(如将内存数据定时刷入 DB 或对象存储)








