不同CPU架构下Docker Registry Mirror拉取多架构镜像的机制
多架构Docker镜像拉取与Registry Mirror运行逻辑
Docker多架构镜像(采用manifest list索引格式,hello-world就属于这类镜像)的拉取匹配逻辑由客户端主导,Registry Mirror本质是带缓存的镜像代理,本身不做架构适配决策,各场景的具体行为如下:
- 32位架构客户端B不会拉取到64位版本镜像。Docker客户端启动拉取流程时,会自动在请求中携带自身的CPU架构、操作系统类型版本等匹配标识,只会请求与本机运行环境兼容的镜像版本,不会拉取无法运行的64位镜像。
- Registry Mirror不会主动拉取32位版本镜像做缓存,仅做被动透传缓存:当客户端B发起拉取请求时,Mirror会先检查本地是否存在匹配32位架构的
hello-world镜像缓存,如果存在就直接返回;如果不存在,就向上游官方镜像仓库请求对应32位架构的镜像资源,拉取完成后在本地留存对应缓存,再返回给客户端B。后续再有32位客户端请求相同镜像时,就可以直接命中缓存返回。 - ARM架构客户端C、Apple M1架构客户端D的拉取逻辑和x86架构客户端完全一致:
- 客户端发起
docker pull命令后,自动在请求中携带本机对应的架构标识(普通ARM客户端携带对应arm/arm64版本标识,Apple M1属于arm64/v8架构,会携带对应匹配标识) - 请求先发送到配置的Registry Mirror,Mirror如果存有匹配该架构的镜像缓存,直接返回给客户端
- 如果Mirror本地没有对应缓存,就向上游源站拉取匹配当前客户端架构的镜像版本,完成本地缓存后再返回给客户端
- 不同架构的镜像缓存在Mirror上互相独立存储,不会跨架构返回,比如Mirror上缓存的64位x86版本
hello-world,永远不会返回给ARM架构或M1架构的客户端。
- 客户端发起
补充说明:只有使用不支持manifest list特性的老旧第三方Registry实现时,才可能出现跨架构返回错误镜像的问题。使用官方开源Docker Registry v2.3及以上版本部署的Mirror服务,完整支持多架构镜像的透传与按架构独立缓存,不会出现匹配错误。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

