【问题标题】:docker restore fails - when checkpointed with active TCP connections - criudocker restore 失败 - 当使用活动 TCP 连接设置检查点时 - criu
【发布时间】: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


【解决方案1】:

我认为最可能的解释是两个容器需要具有相同的 IP 地址才能使 tcp 连接恢复正常工作。不幸的是,这在 docker 1.10 中并不容易实现。

您可以尝试的一件事是在我的 github 存储库的“docker-checkpoint-restore”分支中构建基于 1.12 的新版本的检查点/恢复(我将尝试尽快发布预编译版本)。 Docker 1.12 允许您在创建容器时请求 IP。检查点/恢复 API 略有变化:

# to create
$ docker checkpoint create <container_id> <checkpoint_name>

# to restore
$ docker start --checkpoint <checkpoint_name> <container_id>

请注意,如果您想在这个新系统中创建一个新容器,目前您必须复制位于/var/lib/docker/containers/&lt;container_id&gt;/checkpoints 的检查点目录。

【讨论】:

  • 谢谢。因此,我使用相同的instructions from SaiedKazemi 编译了 docker-checkpoint-restore。我还必须克隆 containerd 并编译它以创建 containerdcontainerd-shimctr。我还必须安装runc(我使用 apt-get install 来安装)。使用 sudo dockerd 调用 dockerd 没问题,但前提是我创建了符号链接 docker-containerddocker-containerd-shim。之后,docker run 抱怨找不到docker-runc - 解决了使用符号链接
  • 最后,我可以调用docker run,但它失败了——抱怨shim error: open pid: no such file or directorygithub docker 上有几个帖子,但没有明确的解决方案。我会尽力追查问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多