0

我正在使用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 和其他文件。提前致谢

4

1 回答 1

0

我认为最可能的解释是两个容器需要具有相同的 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/<container_id>/checkpoints.

于 2016-06-13T21:31:14.810 回答