飞羽小随笔

Docker容器热迁移-本机迁移

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

Docker容器热迁移

前言

[scode type="blue"]
本文需要用到容器、CRIU这两个工具,不了解CRIU的请看下面两篇文章。
[/scode]
[post cid="36" /]

[post cid="37" /]

容器热迁移介绍

[scode type="yellow"]
点击了解容器热迁移
[/scode]

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

容器热迁移难点

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

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

我使用的版本

[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
[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) 

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

开始

首先,需要配置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运行状态

[scode type="blue"]
保存完毕后,容器会自动stop
[/scode]

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

[scode type="blue"]
使用docker ps -a查看docker运行状态
[/scode]

查看checkpoint镜像

[scode type="blue"]
我自己的查看不了,但是之后的还原没有问题,有谁解决了教教我
[/scode]

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

[scode type="blue"]
但是可以在镜像文件里查看
[/scode]

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

恢复docker容器运行状态

[scode type="blue"]
本机恢复很简单,只需要一个命令即可恢复
[/scode]

[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
# 查看容器运行状态

本机迁移完毕

[scode type="blue"]
如果想要跨服务器热迁移,请看以下文章:
[/scode]

[post cid="41" /]

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »