dockerhub上有很多官方的镜像,支持多平台。本文进行简单介绍。
下载
以 busybox 为例,官方镜像地址为: https://hub.docker.com/_/busybox?tab=tags 。可以查看各种平台的各种版本。如图1所示。
下载一个 arm v7 版本的:
1 | docker pull busybox:glibc@sha256:783d05e2c73f48d4499387b807caf11b0b3afef5e17e225643b4b4558b21e221 |
通过 docker images | grep busybox
查看其镜像 ID 为 2128ff41e8e1。如下:
1 | busybox <none> 2128ff41e8e1 12 days ago 2.68 MB |
只有镜像ID,没有镜像名称,打标签:
1 | docker tag 2128ff41e8e1 latelee/armbusybox:v7 |
这个镜像无法在x86上运行。提示:
1 | standard_init_linux.go:178: exec user process caused "exec format error" |
docker 19.03 版本已经支持多平台镜像的构建。因故未实验。
上传
前一小节,我们在拉取镜像时,指定了 sha256 的值,以示区别,但实际上,docker pull
可以根据当前的系统选择不同的镜像,以拉取 nginx 命令为例:
1 | docker pull nginx |
在不同系统(如arm、x86、x86_64)执行,得到的镜像是不同的,且匹配当前系统。因为官方的 nginx 支持了不同系统,详情参考 https://hub.docker.com/_/nginx?tab=tags 。
这利益于 docker manifest 机制。
下面尝试制作支持多平台的镜像,对用户而言镜像名称相同,docker 拉取时根据执行命令时的架构判断选择。
1、开启实验特性:
1 | export DOCKER_CLI_EXPERIMENTAL=enabled |
2、制作不同镜像。
3、上传镜像
1 | docker push latelee/webgin latelee/amd64webgin |
4、制作
先创建:
1 | # docker manifest create latelee/webgin latelee/amd64webgin latelee/armwebgin |
再标注不同平台:
1 | docker manifest annotate latelee/webgin latelee/amd64webgin --os linux --arch x86_64 |
可查看详情:
1 | docker manifest inspect latelee/webgin |
最后推送:
1 | docker manifest push latelee/webgin |
注1:在不同的系统实验,发现arch字段名称不同,有时用x86_64可以,但有时用amd64可以,一些示例:arm、ppc64le、arm64。
注2:如果错误创建了manifest(如名称不同的镜像,但内容一致,打标签不同,认为是2个,实际是一个),再更新似乎更新不了。方法:找另一台新的机器,重新步骤。
注3:不需要下载到本地,但需要dockerhub上存在。镜像似乎的确要存在于dockerhub上。
注4:因周知之原因,dockerhub网络不太稳定,可能需要多次尝试。
如不存在,无法下载,比如本身不存在arm版本,但却在 arm 系统中拉取:
1 | docker pull latelee/webgin |