dockerhub上有很多官方的鏡像,支持多平臺。本文進行簡單介紹。
下載
以 busybox 爲例,官方鏡像地址爲: https://hub.docker.com/_/busybox?tab=tags 。可以查看各種平臺的各種版本。如圖1所示。
下載一個 arm v7 版本的:
docker pull busybox:glibc@sha256:783d05e2c73f48d4499387b807caf11b0b3afef5e17e225643b4b4558b21e221
通過 docker images | grep busybox
查看其鏡像 ID 爲 2128ff41e8e1。如下:
busybox <none> 2128ff41e8e1 12 days ago 2.68 MB
只有鏡像ID,沒有鏡像名稱,打標籤:
docker tag 2128ff41e8e1 latelee/armbusybox:v7
這個鏡像無法在x86上運行。提示:
standard_init_linux.go:178: exec user process caused "exec format error"
docker 19.03 版本已經支持多平臺鏡像的構建。因故未實驗。
上傳
前一小節,我們在拉取鏡像時,指定了 sha256 的值,以示區別,但實際上,docker pull
可以根據當前的系統選擇不同的鏡像,以拉取 nginx 命令爲例:
docker pull nginx
在不同系統(如arm、x86、x86_64)執行,得到的鏡像是不同的,且匹配當前系統。因爲官方的 nginx 支持了不同系統,詳情參考 https://hub.docker.com/_/nginx?tab=tags 。
這利益於 docker manifest 機制。
下面嘗試製作支持多平臺的鏡像,對用戶而言鏡像名稱相同,docker 拉取時根據執行命令時的架構判斷選擇。
1、開啓實驗特性:
export DOCKER_CLI_EXPERIMENTAL=enabled
2、製作不同鏡像。
3、上傳鏡像
docker push latelee/webgin latelee/amd64webgin
docker push latelee/webgin latelee/armwebgin
4、製作
先創建:
# docker manifest create latelee/webgin latelee/amd64webgin latelee/armwebgin
Created manifest list docker.io/latelee/webgin:latest
再標註不同平臺:
docker manifest annotate latelee/webgin latelee/amd64webgin --os linux --arch x86_64
docker manifest annotate latelee/webgin latelee/armwebgin --os linux --arch armv7l
可查看詳情:
docker manifest inspect latelee/webgin
最後推送:
docker manifest push latelee/webgin
注1:在不同的系統實驗,發現arch字段名稱不同,有時用x86_64可以,但有時用amd64可以,一些示例:arm、ppc64le、arm64。
注2:如果錯誤創建了manifest(如名稱不同的鏡像,但內容一致,打標籤不同,認爲是2個,實際是一個),再更新似乎更新不了。方法:找另一臺新的機器,重新步驟。
注3:不需要下載到本地,但需要dockerhub上存在。鏡像似乎的確要存在於dockerhub上。
注4:因周知之原因,dockerhub網絡不太穩定,可能需要多次嘗試。
如不存在,無法下載,比如本身不存在arm版本,但卻在 arm 系統中拉取:
docker pull latelee/webgin
latest: Pulling from latelee/webgin
latest: Pulling from latelee/webgin
latest: Pulling from latelee/webgin
no matching manifest for linux/arm in the manifest list entries