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類似,就不再演示了,有興趣的讀者可以自己試一下。