如何配置Docker将非docker.io镜像拉取请求指向私有镜像缓存
Docker按源仓库配置镜像拉取代理的实现方案
Docker Engine 从20.10版本开始原生支持多仓库独立代理缓存配置,不需要替换运行时即可实现quay.io等第三方仓库的自动转发,具体配置方法如下:
原生配置方案(推荐,适用于Docker 20.10及以上版本)
你之前配置docker.io代理时使用的registry-mirrors字段是旧版本仅针对默认仓库(Docker Hub)的配置项,新版本新增的registries配置块可以为任意上游镜像仓库指定专属代理地址:
- 编辑Docker守护进程配置文件,默认路径为
/etc/docker/daemon.json - 按如下格式补充配置(保留你之前已经配置好的docker.io代理即可):
{ "registry-mirrors": ["https://docker.io.mylocalartifacts.com"], "registries": { "quay.io": { "mirrors": ["https://quay.io.mylocalartifacts.com"] } } }
如果后续需要新增gcr.io、ghcr.io等其他仓库的缓存代理,直接在registries块下按相同格式追加对应仓库和代理地址即可。
3. 保存配置后执行以下命令重启Docker生效:
systemctl daemon-reload systemctl restart docker
配置生效后,直接执行docker pull quay.io/<镜像名>:<标签>时,Docker会自动将请求转发到你配置的quay.io缓存地址,不需要手动修改镜像前缀。
注意事项:
- 如果你的制品服务器使用自签名HTTPS证书,需要提前将CA根证书放置到
/etc/docker/certs.d/quay.io.mylocalartifacts.com/目录下,否则会出现x509证书不信任的拉取错误。- 配置完成后可以执行
docker info命令,在返回结果的Registry Mirrors相关段落确认所有代理规则已经正常加载。
低版本兼容方案(适用于Docker 20.10以前版本)
如果你的集群使用的Docker版本低于20.10,不支持registries配置块,可以通过透明代理的方式实现无感知转发:
- 调整集群内部DNS(比如Kubernetes集群的CoreDNS服务),将
quay.io域名直接解析到你的制品服务器IP - 在制品服务器上配置443端口的SNI转发规则,识别到Host为
quay.io的请求时,自动走本地缓存逻辑响应镜像拉取请求 - 该方案完全不需要修改Docker侧的任何配置,拉取逻辑对Docker引擎透明,缺点是需要调整DNS规则和制品服务器的代理配置,维护成本略高于原生配置方案。
不建议在每个节点通过修改/etc/hosts的方式绑定域名,后续制品服务器地址变更时需要逐节点修改,运维成本极高。
内容的提问来源于stack exchange,提问作者Jean-Pascal J.
相关产品推荐
相关产品推荐

