Paused状态是cgroups freezer冻结容器进程,内存常驻且仅限本cgroup;系统休眠是内核级电源管理,整机暂停并依赖硬件待机。二者机制、作用域和触发方式完全不同,不可互换或混淆。

容器Paused状态和系统休眠(Suspend)在表现上看似相似——进程不响应、资源占用暂停、恢复后继续运行——但二者底层机制完全不同,不存在直接关联。Docker的pause是Linux cgroups freezer子系统的用户态封装,而系统休眠是内核级电源管理行为,作用域、触发条件和影响范围均不重叠。
Paused本质:cgroups freezer控制进程冻结
Docker pause命令实际调用的是cgroups v1的freezer.state接口(或cgroups v2的freezer.freeze),将容器内所有进程置于FROZEN状态。此时:
- 进程被挂起,不参与调度,CPU时间片完全剥夺
- 内存页保持常驻,不交换(swap)也不释放
- 文件描述符、网络连接、信号队列等内核对象全部保留
- 仅影响目标cgroup内的进程,对宿主机其他进程无干扰
系统休眠:整机电源状态切换
系统休眠(如systemctl suspend)由内核ACPI子系统驱动,将当前内存镜像保存至RAM(S3)或磁盘(hibernate),然后切断大部分硬件供电。其特点是:
- 所有用户态进程、内核线程、容器、宿主机服务一并暂停
- 内存内容靠少量待机电流维持(S3)或写入磁盘(S4)
- 恢复时从快照重建整个内核上下文,非单个cgroup恢复
- Docker守护进程本身也会被中断,容器状态依赖于守护进程重启后的reconcile逻辑
关键区别与常见误解
很多人误以为“宿主机休眠后容器自动Paused”,其实并非如此:
- 休眠前容器若处于running状态,唤醒后仍为running(只要守护进程正常恢复)
- Pause是主动、细粒度、可编程的操作;休眠是全局、被动、硬件相关的动作
- Pause后容器仍能被
docker ps识别为“Paused”状态;休眠期间docker ps根本无法执行(系统无响应) - Pause不改变容器生命周期事件(如healthcheck暂停但不触发fail);休眠可能导致健康检查超时、连接中断、应用内部定时器错乱
实际使用中的注意事项
在开发或测试中需注意两者的叠加影响:
- 不要依赖Pause模拟休眠场景——它不触发电源管理路径,无法测试RTC唤醒、USB热插拔、驱动重载等行为
- 若宿主机频繁休眠,建议关闭Docker自动启动或配置
restart=unless-stopped避免唤醒后容器异常 - Pause适合调试阻塞问题或临时隔离容器;休眠适合节能或移动设备场景,二者目的不同,不可互换
- 使用
docker container checkpoint(需CRiU支持)才能实现类似休眠的“状态持久化+恢复”,但这是另一套机制










