Docker无法为busybox容器创建checkpoint问题咨询(已开启experimental)
Hey,我帮你理清楚Docker Checkpoint在BusyBox容器上的正确操作流程——这个功能确实有几个容易踩的坑,尤其是用轻量镜像的时候,光开experimental模式可不够。
正确操作步骤
1. 先搞定环境依赖(最容易忽略的点)
Docker的Checkpoint/Restore功能完全依赖**CRIU(Checkpoint/Restore In Userspace)**工具,而且需要内核支持对应的特性,这是很多人报错的根源:
- 安装CRIU:根据你的发行版来,比如Ubuntu/Debian跑
sudo apt install criu,CentOS/RHEL用sudo dnf install criu。没装的话,Docker根本没法执行checkpoint操作。 - 再次确认Experimental模式:你说已经开了,但再核对下——要么在Docker daemon启动参数里加
--experimental=true,要么在/etc/docker/daemon.json中添加"experimental": true,然后重启Docker服务:sudo systemctl restart docker。
2. 创建适配Checkpoint的BusyBox容器
你用的循环打印脚本没问题,但要注意避免终端依赖(比如不要用交互式启动),推荐用这条命令创建后台运行的稳定容器:
docker run -d --name busybox-loop busybox /bin/sh -c 'i=0; while true; do echo $i; i=$((i+1)); sleep 1; done'
用-d让容器后台运行,循环里加sleep 1避免进程过于繁忙,也能让CRIU更稳定地捕获状态。
3. 执行Checkpoint操作
等容器运行个几秒(让它打印几个数字,方便后续验证),然后执行checkpoint命令:
docker checkpoint create busybox-loop my-first-checkpoint
这里busybox-loop是你的容器名,my-first-checkpoint是给这个checkpoint起的自定义名称。如果成功的话,命令不会返回错误,checkpoint数据会存在Docker的容器存储目录里(默认路径是/var/lib/docker/containers/<容器ID>/checkpoints/)。
4. 验证Checkpoint:停止后恢复容器
先把原容器停掉:
docker stop busybox-loop
接着用刚才创建的checkpoint恢复容器:
docker start --checkpoint my-first-checkpoint busybox-loop
现在用docker logs -f busybox-loop查看日志,你会发现数字是从checkpoint时的位置继续打印,而不是从头开始——这就说明checkpoint成功了!
常见报错排查
如果之前操作报错,大概率是这几个原因:
- CRIU未安装:Docker会提示类似
exec: "criu": executable file not found in $PATH的错误,装上CRIU就能解决。 - 内核不支持CRIU特性:运行
criu check命令可以检查,它会列出缺失的内核选项(比如CONFIG_NAMESPACES、CONFIG_CHECKPOINT_RESTORE等),有些默认内核或者云主机可能没开启这些特性,这时候需要更换支持的内核或者使用兼容的环境。 - 容器进程有不兼容特性:比如用了交互式终端、挂载了不支持的文件系统,或者进程处于僵尸状态。BusyBox的后台循环脚本一般没问题,但如果是交互式启动的
sh,终端会话可能无法被checkpoint。
内容的提问来源于stack exchange,提问作者Anik Barua
相关产品推荐
相关产品推荐

