我正在使用cr-defunct checkpoint restore(基于 Ross Boucher 的反馈)从源代码构建 1.10.0-dev 以获取检查点/恢复功能。
当我检查一个没有任何活动 TCP 连接的容器,然后将其恢复到新创建的容器时,我没有任何问题。但是,如果存在活动的 TCP 连接,则还原将失败。失败可能是由于其他原因...我不确定。但在restore.log 中弹出TCP 失败。这是我导致这种情况发生的方式
启动一个 docker 容器(我使用 alpine-sshd)作为基础镜像
docker run -d --security-opt seccomp:unconfined --name a1 alpine-sshd
然后,我 ssh 进入容器。我已经设置了用户
ssh abc@172.17.0.2
因此,现在该容器的端口 22 上有一个活动的 TCP 连接,我可以通过进入容器并在容器内执行“netstat -na”来验证它
现在,我使用创建一个新容器(不启动它)
docker create --security-opt seccomp:unconfined --name=a3 alpine-sshd
"docker ps -a" 显示两个容器 a1 和 a3
接下来,我使用 checkpoint 选项检查 a1 容器。--leave-running 标志没有影响,因为它没有在实际错误所在的还原中使用
docker checkpoint --image-dir=/tmp/ABC a1
然后我使用 /tmp/ABC 恢复
docker restore --force=true --image-dir=/tmp/ABC a3
这会导致以下错误
Error response from daemon: Cannot restore container a3: cantstart: Cannot start container c40adc.....<snip ID>...: criu failed: type NOTIFY error 0
log file: /var/lib/docker/0.0/containers/c40adc...<snip ID>../criu.work/restore.log
restore.log 有以下值得注意的错误:
14: Restoring TCP connection
14: Restoring TCP connection id 13 ino 153c9
14: Setting 1 queue seq to 2533629009
14: Setting 2 queue seq to 1507997351
14: Error (sk-inet.c:721): Can't bind inet socket (id 19): Cannot assign requested address
10: Error (cr-restore.c:1350): 14 exited, status=1
在日志文件的底部
10: Restored
Error (cr-restore.c:1352): 20710 killed by signal 9
Error (cr-restore.c:2182): Restore failed
现在,我不需要恢复网络——尽管拥有它会很有用。现在,我只想在具有活动网络连接的先前检查点映像上进行稳定恢复。
请注意,如果我在没有 ssh/TCP 连接的情况下执行整个序列,它会很好地工作。
任何帮助将不胜感激。如果需要,我可以提供完整的 restore.log 和其他文件。提前致谢