飞羽

Docker容器热迁移-本机迁移
本文主要讲解在Linux下,如何使用CRIU对Docker容器进行热迁移。
扫描右侧二维码阅读全文
13
2019/06

Docker容器热迁移-本机迁移

本文主要讲解在Linux下,如何使用CRIU对Docker容器进行热迁移。

Docker容器热迁移

Docker容器热迁移-本机迁移.jpg

前言


本文需要用到容器、CRIU这两个工具,不了解CRIU的请看下面两篇文章。

容器热迁移介绍


点击了解容器热迁移

简单介绍

Pavel Emelyanov是SWsoft旗下虚拟化软件Virtuozzo的首席工程师,是OpenVZ内核的核心维护者,也是CRIU项目的作者。在2015年于西班牙首都巴塞罗那举行的DockerCon上,Pavel分享了容器热迁移的实现方式和难点。

容器热迁移难点

你需要了解这么几个问题,否则会出现意想不到的错误。


CRIU要求很严格,跨服务器迁移需要你Docker版本、Linux内核、CRIU版本一致,否则会报缺少文件什么的错误。

我使用的版本

  • Docker版本为
[root@localhost test]# docker version
Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77156
 Built:             Sat May  4 02:34:58 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 02:02:43 2019
  OS/Arch:          linux/amd64
  Experimental:     true
  • CRIU版本为
[root@localhost test]# criu -V
Version: 3.12
GitID: v3.12-148-gef4f031
  • 内核版本为:
[root@localhost test]# uname -r
3.10.0-957.21.2.el7.x86_64
[root@localhost test]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 


我使用的是这个版本,如果跨服务器都必须是一样的版本,我并不能保证一定可以,我自己实验是成功的。

开始

首先,需要配置docker的daemon.json文件为:

[root@localhost test]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"experimental": true
}

重启docker

systemctl restart docker

运行docker镜像(以busybox为例)

[root@localhost ~]# docker run -d --name looper2 --security-opt seccomp:unconfined busybox          /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
#运行命令
c86b61b9165e9d85c9cd366fc0312ff0e6f81f161fb720ccf9ef5d34eb96066c

保存docker运行状态


保存完毕后,容器会自动stop

[root@localhost ~]# docker checkpoint create looper2 looper2
looper2


使用docker ps -a查看docker运行状态

查看checkpoint镜像


我自己的查看不了,但是之后的还原没有问题,有谁解决了教教我

root@localhost ~]# docker checkpoint ls looper2
Error response from daemon: open /var/lib/docker/containers/c86b61b9165e9d85c9cd366fc0312ff0e6f81f161fb720ccf9ef5d34eb96066c/checkpoints/looper2/config.json: no such file or directory


但是可以在镜像文件里查看

[root@localhost ~]# ls /var/lib/docker/containers/c86b61b9165e9d85c9cd366fc0312ff0e6f81f161fb720ccf9ef5d34eb96066c/checkpoints/
looper2

恢复docker容器运行状态


本机恢复很简单,只需要一个命令即可恢复

[root@localhost ~]# docker start --checkpoint looper2 looper2
#容器运行状态恢复
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c86b61b9165e        busybox             "/bin/sh -c 'i=0; wh…"   6 minutes ago       Up 2 seconds                            looper2
# 查看容器运行状态

本机迁移完毕


如果想要跨服务器热迁移,请看以下文章:

文章名: 《Docker容器热迁移-本机迁移》

文章链接:https://blog.8086k.cn/archives/40/

联系方式:1412981048@qq.com

除特别注明外,文章均为飞羽小随笔原创,转载时请注明本文出处及文章链接
Last modification:June 13th, 2019 at 05:25 pm
如果觉得我的文章对你有用,请随意赞赏

3 comments

  1. chxpu Google Chrome 86.0.4240.198 Windows 10

    你好,我想问一下,我做了这个实验,但是结果是重新start之后还是从checkpoints之前的数字开始,重0开始 比如0 1 2 3 4 5 6 7 0 1 2 3

    1. 张俊龙 Edge 87.0.664.75 Windows 10
      @chxpu

      我也是这样的,这样算成功吗

  2. jojo Google Chrome 57.0.2987.98 Windows 10
    该评论仅登录用户及评论双方可见

Leave a Comment Cancel reply