- 多架構支持的挑戰 :隨著異構計算(如 ARM、x86、RISC-V 等)的普及,開發者需要為不同硬件平臺提供對應的鏡像,傳統方式需維護多個版本(如
image:v1-amd64
和image:v1-arm64
),導致版本管理復雜。 - Docker 的解決方案 :通過 Manifest List(清單列表) 將多架構鏡像合并到單一版本下,用戶只需拉取
image:v1
,Docker 會自動匹配當前平臺對應的鏡像。
Docker合并多架構鏡像到一個鏡像方案
拉取鏡像
先將不同架構的鏡像拉取到本地
docker pull registry.cn-guangzhou.aliyuncs.com/devyunze/linux_amd64_nginx:1.26.3docker pull registry.cn-guangzhou.aliyuncs.com/devyunze/linux_arm64_v8_nginx:1.26.3
修改鏡像名
將不同架構鏡像的 repository 修改一致,在tag 標簽里做版本和架構的區分。
docker image tag registry.cn-guangzhou.aliyuncs.com/devyunze/linux_amd64_nginx:1.26.3 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_amd64docker image tag registry.cn-guangzhou.aliyuncs.com/devyunze/linux_arm64_v8_nginx:1.26.3 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_arm64
推送鏡像
這里使用的是阿里云的容器鏡像服務,但是不管使用哪家企業提供的鏡像服務,其操作過程都是一樣的,將本地的修改好名稱的鏡像推送上去。
docker push registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_arm64docker push registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_amd64
創建清單
docker manifest create registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_arm64 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3_amd64
推送清單
docker manifest push registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
刪除清單
docker manifest rm registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
驗證
arm64架構環境拉取amd64架構鏡像驗證
docker pull --platform linux/amd64 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
運行鏡像驗證
docker run -d --name=nginx-test -p 80:80 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
運行鏡像時可以看到,已經有警告提示信息說架構不匹配了。這就證明拉取到鏡像的確實是amd64架構的鏡像。
arm64架構環境拉取arm64架構鏡像驗證
先清理上一步測試的容器和鏡像。
關閉并刪除之前測試的容器和鏡像。
docker stop d23741cd8db3docker rm d23741cd8db3docker rmi registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
拉取arm64鏡像
docker pull --platform linux/arm64 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
運行鏡像驗證
docker run -d --name=nginx-test -p 80:80 registry.cn-guangzhou.aliyuncs.com/devyunze/nginx:1.26.3
可以看到容器運行成功,并成功訪問到nginx。
證明此次拉取到鏡像的確實是arm64架構的鏡像。
至此將多個架構鏡像合并到一個鏡像里的操作可以宣告成功了。