1. docker manifest簡介
使用鏡像創建一個容器,該鏡像必須與 Docker 宿主機系統架構一致,例如x86_64 架構的系統中只能使用x86_64的鏡像創建容器。
docker manifest特性可支持用戶在不同系統架構的機器上分別運行不同的架構的鏡像。這一點基本不需要用戶做任何適配,非常的方便。
manifest list是一個鏡像清單列表,用於存放多個不同os/arch的鏡像信息;主要用到manifest的目的,其實還是多用於存放不同的os/arch信息,也就是方便我們在不同的CPU架構(arm或者x86)或者操作系統中,通過一個鏡像名稱拉取對應架構或者操作系統的鏡像, ( 這個尤其是在K8S中,對於異構CPU的服務器中的鏡像顯得尤為有效。)
注:manifest文件僅僅是針對於已經在倉庫中的鏡像!!! 換句話說,就是這個鏡像是剛從倉庫中pull下來的!如果這個鏡像是自己build的,需要先push到倉庫中,否則,這個鏡像是沒有manifest文件的!!同樣的,如果你pull了一個鏡像,tag了一下,再去看這個manifest文件,也是沒有的,因為tag后的鏡像不在鏡像倉庫中。
2. docker manifest 開啟
manifest是個實驗功能,所以需要在docker中進行打開。
2.1 首先修改docker配置(如果文件不存在就新建,存在的話就追加配置,記得追加時檢查下逗號別忘)
#如果沒有配置文件的話,新建 mkdir /root/.docker #進入docker配置目錄 cd /root/.docker/ #修改配置文件 vi config.json
添加如下配置信息
{
"auth": {}, "experimental": "enabled" }
2.2 開啟manifest實驗特性
#如果沒有配置文件的話,新建 vi /etc/docker/daemon.json
添加如下配置信息
{
"registry-mirrors": ["https://r9xxm8z8.mirror.aliyuncs.com","https://registry.docker-cn.com"], "experimental": true }
registry-mirrors : 添加阿里雲加速源,也可以直接 [ ];
experimental : 開啟實驗功能;
注:registry-mirrors 必填項,沒有的話重啟docker時直接報錯
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
2.3 重加載服務配置並重啟docker
#重新加載服務的配置文件 systemctl daemon-reload #重啟docker systemctl restart docker
2.4 測試manifest是否開啟
#測試manifest是否開啟
docker manifest
#查看docker是否開啟experimental功能
docker version
或
docker system info
如上顯示已開啟。
3. 拉取指定平台鏡像
3.1 方法一
如上manifest實驗功能開啟后,可通過如下命令拉取其他CPU平台的鏡像。
#X86平台docker拉取arm鏡像 docker pull --platform=arm64 鏡像名:版本 #示例 docker pull --platform=arm64 nginx:latest
--platform:該參數是用於拉取指定平台的鏡像,也是實驗性功能,在開啟manifest功能后就會出現。通過該參數可以手動指定需要的CPU平台鏡像,而不用自動去識別。
3.2 方法二
通過鏡像的 sha256值拉取(大概率會失敗)
#通過sha256值拉取鏡像 docker pull nginx:stable-perl@sha256:a48175e7029f0ae21b8b4e2526d6c3dd7278a8479be0e666d729b6234108f4e1
4. docker manifest 常用命令及操作
4.1 查看已有鏡像的manifest
#查看已有鏡像的manifest
docker manifest inspect --insecure nginx
4.2 創建manifest鏡像信息
#創建manifest鏡像信息
docker manifest create --insecure xxx/nginx:latest xxx/nginx:nginx-arm64 xxx/nginx:nginx-x86
--insecure :這個命令主要是防止你遠程倉庫沒有Https證書的問題,最好加上
xxx/nginx:latest :統一架構后的鏡像地址,可有可無
xxx/nginx:nginx-arm64 :已經在倉庫中有的鏡像地址
xxx/nginx:nginx-x86 :已經在倉庫中有的鏡像地址
如果不想新建manifest list鏡像地址,而是想用已有的鏡像地址,那么可以參考這個命令:
# 使用已有的鏡像地址
docker manifest create --insecure --amend xxx/nginx:nginx-arm64 xxx/nginx:nginx-x86
--amend選項,將x86的架構信息增加到了arm64架構中。
4.3 提交manifest鏡像信息
將這個manifest提交到倉庫中
#將manifest鏡像信息提交到倉庫中
docker manifest push xxx/nginx:latest
#驗證下鏡像信息是否被提交
docker manifest inspect xxx/nginx:latest
文章整合至:https://blog.csdn.net/lhc0602/article/details/116596006、https://blog.csdn.net/sullivan_jia/article/details/117520304