docker“即时热恢复”依赖criu实现全量检查点与恢复,需linux x86_64、启用config_checkpoint_restore等内核选项、安装criu、开启docker实验特性;容器须规避--privileged等不兼容配置;恢复命令docker start --checkpoint实为docker checkpoint restore的封装,可毫秒级重建运行状态。
利用 docker start 结合 checkpoints 实现应用的“即时热恢复”,本质上是借助 docker 的检查点(checkpoint)与恢复(restore)机制,将容器运行时状态持久化并快速重建,跳过常规启动流程。但需注意:docker 原生命令 docker start 本身不支持直接恢复 checkpoint;真正起作用的是 docker checkpoint restore,而 docker start 只适用于已暂停(paused)或已停止(stopped)但未 checkpoint 的容器。
确认环境是否支持 Checkpoint/Restore
Docker 的 checkpoint 功能依赖底层 CRIU(Checkpoint/Restore in Userspace),仅在 Linux x86_64 系统上稳定可用,且对内核版本、cgroup 版本(推荐 cgroup v1)、系统配置有严格要求。
- 检查内核是否启用必要选项:
CONFIG_CHECKPOINT_RESTORE=y、CONFIG_UNIX=y、CONFIG_INET=y等(多数主流发行版默认开启) - 验证 CRIU 是否就绪:
docker checkpoint info应返回有效信息;若报错 “CRIU is not available”,需安装criu包(如 Ubuntu 下sudo apt install criu) - 确保 Docker daemon 启动时启用实验特性:
--experimental=true,并在/etc/docker/daemon.json中添加"experimental": true后重启服务
创建可 checkpoint 的容器
并非所有容器都支持 checkpoint。为提高成功率,应避免使用不兼容特性:
- 禁用内存交换(
--memory-swappiness=0) - 不挂载
/dev/mem、/proc/sysrq-trigger等敏感路径 - 避免使用
--privileged、--pid=host、--network=host(推荐使用 bridge 网络) - 优先选择轻量、无复杂系统调用的应用(如 Nginx、Redis、简单 Python Web 服务)
- 启动示例:
docker run -d --name myapp --memory=512m --cpus=1.0 -p 8080:80 nginx:alpine
执行 checkpoint 并实现“热恢复”流程
Checkpoint 是将运行中容器的内存、进程树、网络栈等状态序列化到磁盘;后续 restore 可近乎瞬时回到该精确时刻——这才是“热恢复”的核心。
- 触发检查点:
docker checkpoint create myapp chk-20240501(生成目录/var/lib/docker/containers/<id>/checkpoints/chk-20240501</id>) - 停止原容器(非必须,但推荐):
docker stop myapp - 立即恢复(即“热恢复”):
docker start --checkpoint chk-20240501 myapp—— 注意:此命令实际等价于docker checkpoint restore --checkpoint-dir /var/lib/docker/containers/<id>/checkpoints/chk-20240501 myapp</id> - 恢复后容器进程 ID、内存布局、TCP 连接状态(如 ESTABLISHED)均保持原样,响应延迟通常在毫秒级
实用技巧与常见问题
真实场景中需关注可靠性与自动化适配:
- 增量 checkpoint 不可用:Docker 当前只支持全量 checkpoint,频繁执行会占用较多磁盘和 I/O,建议按业务节奏(如每日低峰期)定期保存关键状态
-
文件系统一致性:checkpoint 不保证应用层数据落盘。若应用有未刷盘的写缓存(如数据库 WAL 未 sync),恢复后可能丢失最后几秒数据。应在 checkpoint 前主动触发应用级 flush(如 Redis 的
SAVE) - 跨主机恢复受限:CRIU 要求源宿主机内核版本、CPU 微架构(如 AVX 指令集)、cgroup 配置高度一致,生产中一般仅用于单机故障快速自愈
-
集成进启动脚本:可编写 wrapper 脚本,在应用启动前检测是否存在有效 checkpoint 目录,有则优先执行
docker start --checkpoint,否则走常规docker run











