容器化是一個私有雲部署中比較流行的方式,把產品的各個模塊打成docker鏡像,通過swarm, rancher或者k8s等架構完成整體的部署。但是存在一個問題,私有雲環境中存在x86,arm等不同的架構,所以在制作鏡像過程中需要根據架構拉取正確的基礎鏡像。從docker hub上拉取鏡像的時候會注意到在x86上拉取下來的就是x86的鏡像,在arm環境上拉取的就一定是arm的鏡像,這個功能簡單來說就是docker的多架構鏡像技術,網上的講解很多不再贅述,這里具體講一下怎么制作一個多架構鏡像。
產品發布大概上是"從git拉取代碼" -> "構建模塊鏡像" -> "發布到私有倉庫" -> "從私有倉庫拉取各模塊鏡像" -> "生成發布包" 這么個流程,所以為了能夠生成不同架構的發布包,在"構建模塊鏡像"步驟中,需要使用不同架構的構建機器來構建出不同架構的"鏡像"。
假如模塊名稱是"foo",私有倉庫的地址是"docker.artifactory.xxx.com",最終需要支持x86_64和arm64兩種環境,有兩套構建環境A(x86_64)和B(arm64)。
首先在A上構建鏡像docker.artifactory.xxx.com/foo:latest,並且發布到私有倉庫,鏡像名稱中加上架構名稱,
# 構建
docker build -t docker.artifactory.xxx.com/foo-x86_64:latest .
# 發布,如果私有倉庫需要認證,則先通過docker login登錄。
docker push docker.artifactory.xxx.com/foo-x86_64:latest
然后在B上重復這個過程,注意名稱的不一樣,
# 構建
docker build -t docker.artifactory.xxx.com/foo-arm64:latest .
# 發布,如果私有倉庫需要認證,則先通過docker login登錄。
docker push docker.artifactory.xxx.com/foo-arm64:latest
此時倉庫上可以看到服務於兩個不同架構的鏡像。
然后,我們利用docker manifest命令來制作多架構鏡像,這個命令目前還是實驗性質的,所以需要把docker的實驗模式打開。編輯~/.docker/config.json文件,加入如下配置,(以下步驟可以在任意能夠訪問到私有倉庫的機器上執行,不限於構建機器)
[root@arm-build scripts]# cat ~/.docker/config.json
{ "experimental": "enabled" }
執行docker version查看是否修改成功,
[root@arm-build scripts]# docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:27:52 2019 OS/Arch: linux/arm64 Experimental: true <-表示實驗模式已經打開
執行以下命令創建多架構鏡像,--insecure指令可以忽略https證書的檢查,
# 創建一個新的manifest,指定多架構鏡像的名稱,和具體的不同架構的鏡像名稱
docker manifest create --insecure docker.artifactory.xxx.com/foo:latest docker.artifactory.xxx.com/foo-x86_64:latest docker.artifactory.xxx.com/foo-arm64:latest
# 聲明不同架構鏡像對應的操作系統和cpu架構類型,其中x86_64需要用amd64來指定
docker manifest annotate docker.artifactory.xxx.com/foo:latest docker.artifactory.xxx.com/foo-x86_64:latest --os linux --arch amd64
docker manifest annotate docker.artifactory.xxx.com/foo:latest docker.artifactory.xxx.com/foo-arm64:latest --os linux --arch arm64
# 將manifest推送到私用倉庫中
docker manifest push --insecure docker.artifactory.xxx.com/foo:latest
完成之后邊可以通過docker.artifactory.xxx.com/foo:latest來在不同的架構環境里面拉取正確的鏡像了。
通過這幾條命令可以看出來多架構鏡像只是一個引用,根據客戶端的架構來選擇其中聲明好的鏡像。so easy~