本文主要讲解在Linux下,如何使用CRIU对Docker容器进行热迁移。
Docker容器热迁移
前言
本文需要用到容器、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
# 查看容器运行状态
本机迁移完毕
如果想要跨服务器热迁移,请看以下文章:
你好,我想问一下,我做了这个实验,但是结果是重新start之后还是从checkpoints之前的数字开始,重0开始 比如0 1 2 3 4 5 6 7 0 1 2 3
我也是这样的,这样算成功吗