Docker基于Checkpoint的实时迁移遇OCI runtime错误求助
我之前在Ubuntu 16.04上折腾Docker Checkpoint实时迁移的时候也踩过类似的OCI runtime坑,给你几个我当时排查解决的方向,你可以挨个试:
先确认两台主机的Docker环境完全一致
Checkpoint作为实验性功能,版本差异很容易触发奇怪的报错。先在两台主机上分别跑:docker version要确保Client和Server的版本号完全匹配。另外检查实验性功能是否都正常开启:查看
/etc/docker/daemon.json里有没有"experimental": true配置,要是没有加上,然后重启Docker服务:systemctl restart docker检查Checkpoint文件的完整性与权限
传输过程中很容易出现文件丢包或者权限不对的情况。建议在源主机先把checkpoint目录打包再传输:tar czf my-checkpoint.tar.gz ./path/to/checkpoint-dir传到目标主机解压后,检查文件权限是否和Docker运行用户一致(一般是
root:root或者docker:docker),如果不对就修正:chown -R root:root ./path/to/checkpoint-dir确保两台主机的基础镜像完全一致
目标主机必须拥有和源主机完全相同的容器基础镜像,包括镜像ID和标签。在两台主机上分别执行docker images对比,要是目标主机没有,从源主机导出镜像:docker save -o my-image.tar your-image-name:tag传到目标主机后导入:
docker load -i my-image.tar抓取详细的错误日志定位根源
单纯的"OCI runtime error"太笼统,要抓具体报错信息。启动容器的时候加上debug日志级别:docker start --checkpoint=your-checkpoint-name --log-level debug your-container-name或者直接查看Docker daemon的实时日志:
journalctl -u docker.service -f日志里会明确指出是cgroup配置问题、网络命名空间缺失,还是checkpoint文件损坏等具体原因。
检查内核版本与Criu依赖模块
Docker Checkpoint依赖Criu工具,而Criu对内核版本和模块有要求。先对比两台主机的内核版本:uname -r尽量保持版本一致。然后检查是否加载了必要的内核模块:
lsmod | grep criu如果没有输出,手动加载模块:
modprobe criu也可以单独安装Criu工具确保依赖完整:
apt update && apt install criu核对容器的特殊配置与命名空间
如果源容器使用了自定义网络、绑定主机端口、共享PID/IPC命名空间等特殊配置,目标主机需要提前同步这些环境:- 比如自定义网络:先在目标主机创建相同的网络
docker network create --subnet=xxx.xxx.xxx.xxx/24 your-network-name - 绑定的主机端口要确保未被占用,用
netstat -tulpn | grep your-port检查
- 比如自定义网络:先在目标主机创建相同的网络
内容的提问来源于stack exchange,提问作者user9513505

