通过多种方式拉取不同平台的docker镜像

通过多种方式拉取不同平台的docker镜像

Scroll Down

0、

众所周知,arm架构现在越来越受到追捧,个人电脑系列如macbook的m1、m1 pro、m1 max都是arm架构,而服务器系列主要群体则是各大云厂商,如国内的华为鲲鹏系列、天地超云的arm系列等等,慢慢的arm也算走上了快车道。

1、docker manifest

从镜像创建容器的过程中,镜像的底层架构必须与Docker宿主机的架构一致,否则会报错如dockers exec user process caused "exec format error"。所以在制作和使用容器镜像的时候就需要根据架构平台来进行区分。而docker manifest特性则能够向用户提供构建镜像的操作系统和架构等信息,以便用户更好的判断使用合适的镜像。

image manifest 描述文件,主要存在于registry中作为docker镜像的元数据文件,在 pull、push、save、load 中作为镜像结构和基础信息的描述文件。在镜像被 pull 或者 load 到宿主机时、manifest被转为了本地镜像配置文件config。

docker提供了manifest子命令,但是该命令只是实验性的功能,官方文档说该命令不该被使用到生产环境下。比如以下两图展示了 开启/未开启 实验功能的区别:

no_manifest

docker_manifest

从 Docker 20.10 开始,实验性 CLI 功能默认启用,无需配置即可启用。低版本开启docker manifest的方法这里不再赘述,可以参考这里Manifest实现多CPU架构Docker镜像

docker manifest inspect -v image_name使用该命令可以查看镜像的manifest信息,-v参数用来输出一些额外信息,例如镜像架构

image.png

2、拉取指定平台镜像的方法

2.1 命令行指定
# 示例
docker pull --platform=arm64/amd64 nginx:alpine

--platform:该参数用于拉取指定架构的镜像,也是实验性功能,开启manifest功能后就会出现。通过该参数可以手动指定需要的CPU平台镜像,而不用自动去识别

2.2 通过sha256值进行拉取

有时候当需要用到不同架构的公共镜像时,也不知道该镜像有没有多架构版本(当然大多公共镜像都有多架构版本哈)也不知道该公共镜像的tag是怎么命名的。这样编写Dockerfile的时候也不知道FROM要怎么写。

其实这时候就可以来到镜像平台搜索一下该镜像,根据该镜像的sha256值进行拉取。如下:

image.png
比如我们在docker官网找到了nginx:alpine的镜像,但是alpine就已经是这个镜像的tag了,本地环境如果不支持--platform参数的情况下该怎么拉取指定的arm64或者amd64架构的镜像呢?
答案就是sha256值

比如我们这里想要arm版本的alpine镜像,首先点击该镜像链接,跳转到镜像描述界面
image.png

这里显示了该镜像的sha256值
image.png

IMAGE_NAME:TAG@sha256:SHA256_VALUE

然后不管是Dockerfile还是docker cli都可以通过该sha256值来拉取该镜像,如下

image.png

image.png

参考:

1、docker manifest
2、docker镜像关键概念
image.png