5.4.4 容器迁移的流程
从5.4.3节的示例可以知道,在同一个架构下,很容易实现容器的迁移,也就是把容器提交为镜像,然后把镜像推送到仓库,其他的服务器可以从仓库下载这个镜像,然后从这个镜像创建容器,这样就实现了容器的迁移,过程如图5-12所示。
图5-12 同架构容器迁移
但是,在不同的架构下,直接使用其他架构的镜像会出现错误,因为镜像包含的软件本身也与架构相关,在一个架构下生成的镜像,在其他的架构中是无法直接运行的。但是,镜像也可以使用Dockerfile生成,可以修改一个架构下的Dockerfile文件,使其在其他架构下也可以生成相同功能的镜像。
这里通过在x86架构和鲲鹏架构下分别构建一个Redis5.0.9的镜像,演示不同架构之间容器的迁移。
1.x86架构Redis镜像构建
步骤1:准备x86架构服务器的容器环境,参考5.4.3节Docker的安装部分。
步骤2:创建/data/redis/文件夹,然后在该文件夹内创建Dockerfile文件,命令如下:
mkdir -p /data/redis/ cd /data/redis/ vim Dockerfile
步骤3:在Dockerfile文件内输入构建指令,保存并退出,指令如下:
构建文件指令简介:
FROM:构建基于系统的镜像,这里使用的是基于CentOS的精简镜像,体积较小。
ENV:设置环境变量,这里把下载网址和文件名称设置成环境变量,方便制作不同Redis版本的镜像。
RUN:要执行的指令。本构建文件中,RUN指令执行的过程如下:
(1)使用yum安装必需的依赖项。
(2)删除了yum的缓存文件。
(3)使用wget下载redis的tar源码包。
(4)解压源码包到源码目录。
(5)删除tar包。
(6)使用make命令编译redis源码,编译时使用-j"$nproc"指定使用的核心数量。
(7)使用make install安装。
(8)删除源码目录。
VOLUME:创建挂载点/data。
WORKDIR:设置工作目录,这里把/data设置为工作目录。
EXPOSE:声明服务端口,这里把Redis提供服务的6379端口声明为服务端口。
CMD:设置容器启动后默认执行的命令及其参数,这里默认启动Redis服务。
步骤4:创建Redis镜像,命令如下:
docker build -t x86/centos_redis:5.0.9 .
构建过程所需时间较长,最后构建成功后的回显如下:
步骤5:查看新构建的镜像,命令及回显如下:
可以看到新的镜像x86/centos_redis:5.0.9。
步骤6:创建/data/redis/data/文件夹,使用x86/centos_redis:5.0.9镜像运行容器,容器名称为x86_redis,命令如下:
创建成功后,查看容器运行状态,命令及回显如下:
容器状态为Up,表示已经正常运行了。
步骤7:使用redis-cli连接redis容器,然后输入ping,正常会返回PONG,命令及回显如下:
[root@ecs-x86 redis]#docker exec - it x86_redis redis-cli 127.0.0.1:6379> ping PONG
步骤8:测试set/get方法,指令及回显如下:
127.0.0.1:6379> set x86 hello OK 127.0.0.1:6379> get x86 "hello"
这表明x86架构下使用镜像x86/centos_redis:5.0.9运行容器成功。
2.鲲鹏架构Redis镜像构建
步骤1:准备鲲鹏架构服务器的容器环境,可以使用5.4.3节安装的环境。
步骤2:创建/data/redis/文件夹,然后在该文件夹内创建Dockerfile文件,命令如下:
mkdir -p /data/redis/ cd /data/redis/ vim Dockerfile
步骤3:在Dockerfile文件内输入构建指令,保存并退出,指令如下:
可以看出,鲲鹏架构的Dockerfile文件指令和x86架构的指令基本类似,主要区别在两个部分,一个是构建基于的镜像,这里选择的是Debian系统;另一个是apt-install,用来取代CentOS中的yum。除此之外,其他指令基本一致。
步骤4:创建Redis镜像,命令如下:
docker build -t arm64v8/debian_redis:5.0.9 .
构建过程也需要较长时间,最后出现Successfully built表示构建成功了显示信息如下:
步骤5:查看新构建的镜像,命令及回显如下:
可以看到新的镜像arm64v8/debian_redis:5.0.9。
步骤6:创建/data/redis/data/文件夹,使用arm64v8/debian_redis:5.0.9镜像运行容器,容器名称为kunpeng_redis,命令如下:
创建成功后,查看容器运行状态,命令及回显如下:
可以看到kunpeng_redis已经成功运行。
步骤7:使用redis-cli连接redis容器,输入ping,正常会返回PONG,然后测试set/get方法,命令及回显如下:
这表明鲲鹏架构下redis服务运行成功了。
3.基于本地镜像构建Redis镜像
在使用Dockerfile构建新镜像时,除了可以基于仓库的镜像,也可以基于本地的镜像。这里创建一个生成Redis5.0.9镜像的Dockerfile文件,使用在5.4.3节中创建的arm64v8/centos4make镜像作为基础镜像。下面列出简化的步骤。
步骤1:进入鲲鹏服务器的/data/redis/文件夹。
步骤2:创建Dockerfile文件,文件指令如下:
步骤3:创建Redis镜像,命令如下:
docker build -t arm64v8/debian4make_redis:5.0.9 .
构建成功后的回显如下:
后续的创建容器、测试Redis服务的过程和本节第2段“鲲鹏架构Redis镜像构建”的步骤6、7、8类似,就不再演示了,有兴趣的读者可以自己试一下。