docker restore失败 - 当使用活动TCP连接检查点时 - criu

时间:2016-06-13 20:09:28

标签: tcp docker restore checkpoint seccomp

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

1 个答案:

答案 0 :(得分:0)

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

您可以尝试的一件事是在&#34; docker-checkpoint-restore&#34;中提供新的基于1.12的检查点/恢复版本。我的github repo的分支(我将尽快编写预编译版本)。 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中的检查点目录。