我的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

猜你喜欢

转载自blog.csdn.net/subfate/article/details/106799145