【发布时间】:2016-06-13 20:09:27
【问题描述】:
我正在使用 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
接下来,我使用检查点选项检查 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 和其他文件。提前致谢
【问题讨论】:
-
作为一个有点骇人听闻的答案,因为您明确声明您不一定需要恢复连接:您可以构建一个自定义版本的 criu,在调用 bind() 之前提前返回inet_bind() (sk-inet.c)。
-
仅供参考 - 所以这不是“传统的” C/R,网上有大量文章。我的目标实际上是将 TCP 连接代理到容器
a1,然后按需将一些连接移动到另一个容器a3。因此,一部分连接仍会在a1上终止,其目的是保持其运行。显然,新容器a3的 ipaddress 必须不同。只要应用程序状态从a1检查点并移动到a3,我应该能够为我想要实现的目标获得一些可行的东西。
标签: tcp docker restore checkpoint seccomp