Docker配置特定仓库镜像后无法通过镜像拉取MCR仓库镜像的问题咨询
嗨,我完全懂你的困扰——防火墙卡着只能用内部镜像,结果拉MCR的镜像时,用全路径就直接跳过配置的镜像连外网,用短名称又怕不小心拉到Docker Hub的同名镜像,确实挺闹心的。
咱们先搞清楚问题出在哪:你之前用的registry-mirrors是全局镜像配置,它只对「不带仓库域名的镜像请求」生效(比如nginx:1这种默认指向Docker Hub的镜像)。当你指定了完整的仓库域名(比如mcr.microsoft.com/mssql/server:2017-latest),Docker会直接尝试访问这个域名,完全忽略全局的registry-mirrors,这就是为什么你拉取时会超时——它硬要连外部的MCR,被防火墙挡在外头了。
那怎么解决呢?Docker从1.13版本开始就支持给特定仓库域名绑定专属镜像,你只需要修改daemon.json,新增mirrors字段来做精准映射:
修改后的daemon.json应该长这样:
{ "registry-mirrors": [ "https://registry_1_docker_io.example.com" ], "mirrors": { "mcr.microsoft.com": [ "https://mcr_microsoft_com.example.com" ] } }
这里的mirrors是个键值对:键是你要映射的目标仓库域名(比如mcr.microsoft.com),值是对应的内部镜像地址数组。配置完之后,只要你拉取mcr.microsoft.com/开头的镜像,Docker就会自动走你配置的内部镜像,再也不会直接去连外部的MCR了。
修改完配置后,别忘了重启Docker服务让配置生效:
# 针对Ubuntu、CentOS这类用systemd的系统 sudo systemctl restart docker
现在你再试试拉取MCR的全路径镜像:
docker pull mcr.microsoft.com/mssql/server:2017-latest
这次应该就能正常通过内部镜像拉取到了。
至于你担心的「短名称可能拉到错误仓库」的问题,现在有了专属镜像配置后,最稳妥的方式就是始终用全路径拉取MCR镜像,这样能明确指定来源,完全不会和Docker Hub的镜像混淆。要是你实在习惯用短名称,也可以在daemon.json里加registry-search字段指定仓库搜索顺序,但全路径拉取是最不容易出错的选择。
最后关于日志里「尝试所有代理」的问题:配置了专属镜像后,Docker只会针对特定仓库使用对应的镜像,不会再全局遍历所有镜像,这样就彻底避免了从错误仓库拉取镜像的风险。
备注:内容来源于stack exchange,提问作者SWilk

