环境
- ubuntu18.04,内核:4.15.0-142-generic【ubuntu20.04不可用,ubuntu16.04不可下载docker17了】
- docker:17.06.0-ce【太高版本不可】
- criu:3.14
- 两台虚拟机ip:服务端【192.168.80.212】、客户端【192.168.80.211】
- 应用对应的版本,亲测有效!
docker安装
- 镜像使用阿里云镜像:ubuntu镜像-ubuntu下载地址-ubuntu安装教程-阿里巴巴开源镜像站 (aliyun.com)
- 使用deb进行安装,安装包下载:Index of linux/ubuntu/dists/xenial/pool/stable/amd64/ (docker.com)
- 命令:
dpkg -i docker-ce_17.06.0~ce-0~ubuntu_amd64.deb.deb
进行安装。 - docker启动实验特性:编辑
/etc/docker/daemon.json
,添加{"experimental":true}
。
criu安装
-
安装的依赖包:【可能会少】
protobuf-compiler protobuf-c-compiler protobuf-c-compiler python-protobuf gcc build-essential asciidoc libprotobuf-dev libprotobuf-c-dev libnl-3-dev libcap-dev libnet-dev libbsd-dev pkg-config
-
criu安装包下载:http://download.openvz.org/criu
-
进入criu文件夹,进行安装:
make
、cp ./criu/criu /usr/local/bin
-
检查是否安装成功
criu check
或者criu check --all
【出现下列问题,并不影响checkpoint操作】
NFS共享文件夹
共享文件夹为:/home/container
,提前在两个虚拟机创建文件夹
服务端
- 安装NFS服务器:
apt-get install nfs-kernel-server
;开启文件夹权限:chmod -R 777 /home/container
- 编辑文件/etc/exports,允许客户端192.168.80.211挂载:
/home/container 192.168.80.211(rw,sync,no_root_squash,no_subtree_check)
;使文件生效:exportfs -rv
。 - 重启NFS服务:
exportfs -rv
、/etc/init.d/nfs-kernel-server restart
。 - 设置firewalld
- 开启防火墙,允许所有传入和传出连接:
ufw enable
、ufw default allow incoming
、ufw default allow outgoing
- 允许客户端接入:
ufw allow from 192.168.80.211 to any port nfs
- 开启防火墙,允许所有传入和传出连接:
客户端
- 安装NFS客户端:
apt-get install nfs-common
- 挂载文件夹:
mount -t nfs 192.168.80.212:/home/container /home/container
测试:
服务端:
- 运行容器:
docker run -d --name looper busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
- 中断程序,在/home/container/目录下存储容器的运行状态:
docker checkpoint create --checkpoint-dir=/home/container/ looper checkpoint
客户端:
- 创建新容器,但是不启动:
docker create --name looper1 busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
- 恢复容器:
docker start --checkpoint-dir=/home/container/56cb0db59a64455010d48a5bbe1fb71e343f904a6e05cd56842baadafb2dfb34/checkpoints/ --checkpoint=checkpoint looper1
【注意路径,到checkpoints目录下】
两台虚拟机中容器的运行状态查询:【我两台虚拟机之间是克隆的,所以名字没改】