我的docker隨筆20:多平臺docker鏡像下載

dockerhub上有很多官方的鏡像,支持多平臺。本文進行簡單介紹。

下載

以 busybox 爲例,官方鏡像地址爲: https://hub.docker.com/_/busybox?tab=tags 。可以查看各種平臺的各種版本。如圖1所示。
圖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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章