目录
前言
这篇博客主要总结一下,我最近用docker在centos7虚拟机上部署Elasticsearch时遇到的国内镜像源失效、 SSL 证书拦截导致官方连接失败,且直接使用国内镜像源路径错误,最终通过配置阿里云镜像加速器彻底解决,如果只想学习怎么配置镜像加速器,直接看最后一个小结即可。
配置的国内镜像失效
虽然我们在docker的配置文件daemon.json中配置了多个国内镜像源,但是如果出现以下几种情况,docker会自动退回到从docker官方仓库中拉取镜像,并不是强制使用配置的镜像源拉取镜像。
- 若/etc/docker/daemon.json文件中镜像源配置存在拼写错误、结构不正确等问题,会导致 Docker 无法正确识别和使用配置的镜像源,从而只能从官方仓库拉取。此外,配置完成后如果没有重启 Docker 服务,新的配置也不会生效。
- 国内镜像源未同步或不稳定:某些官方镜像可能在国内镜像源中尚未同步,或者国内镜像源本身存在不稳定、已失效等情况。例如https://registry.docker-cn.com就经常出现不可用的情况,此时 Docker 会转而从官方仓库拉取镜像。
- 镜像名称和标签特性:部分特殊的镜像 tag 或 namespace,如docker-library下的镜像,可能会绕过加速器设置,直接从官方仓库拉取
这是几种比较常见的国内镜像源失效的原因,因此,不是配置了国内镜像源就万事大吉
SSL证书拦截(故障原因)
-
虽然配置的国内镜像源失效,但是docker仍会从官方仓库中正常拉取指定镜像,只是速度可能比较慢,但是我在拉取Elasticsearch镜像时发生了如下错误

-
看起来是网络连接错误,好像是dns解析 域名错误,网络问题很好排查,我们直接通过ping命令,ping镜像域名,看看能不能ping通,能ping通就是基础网络连接没问题,ping不同就是dns配置问题。

-
可以看到网络是可以ping通的,说明dns域名解析和基础网络连接时没有问题的,我们再通过 openssl s_client 工具深度检查 HTTPS 连接,发现关键异常:
bash# 其他镜像排查https问题,只需要替换这个命令中的域名即可 openssl s_client -connect docker.elastic.co:443 -showcerts输出核心错误:
bashdepth=0 O = Acme Co, CN = Kubernetes Ingress Controller Fake Certificate verify error:num=21:unable to verify the first certificate -
现在问题原因就比较清晰了,是https应用层建立连接失败,原因简单说,https是在建立安全连接时,会检查对方携带回来的证书,如果证书校验不通过就会停止建立连接。
-
这次碰到的问题是,网络中存在 中间人设备(如公司代理、防火墙、Kubernetes Ingress 控制器),其会强制拦截所有 HTTPS 流量,并将目标服务器的合法 SSL 证书替换为自签名的 "伪造证书"(本次为 Kubernetes Ingress Controller Fake Certificate)
-
Docker 遵循 HTTPS 安全协议,会校验证书的合法性 ------ 当发现证书并非 Elastic 官方签发时,直接拒绝建立连接,导致镜像拉取失败
解决SSL问题
指定国内镜像
-
想到的第一个办法就是还是不从官方仓库中拉取镜像,首选还是从国内镜像仓库中拉取镜像,因此,我们在拉取镜像时可以直接指定镜像源,本次我指定的是阿里镜像源
bashdocker pull registry.cn-hangzhou.aliyuncs.com/elastic-stack/elasticsearch:7.17.20 -
但是指定镜像源拉取镜像还是失败,原因是elastic-stack 命名空间下并未存储 7.17.20 版本的 Elasticsearch 镜像

-
因此,直接使用国内镜像源的痛点就是镜像版本不全 ,多数国内镜像源仅同步镜像的热门版本,路径难寻:不同厂商的镜像命名空间不统一(如阿里云可能在 library/ 下,网易云在 elastic/ 下),需逐一搜索验证,效率低。
阿里镜像加速器(最终方案)
最后还是通过配置阿里镜像加速器解决了这个问题,让镜像加速器代理我们从官方仓库中拉取镜像,然后发给我们。
镜像加速器作用
- 阿里云镜像加速器并非提供 "镜像副本",而是作为 官方仓库的代理缓存------ 当 Docker 拉取官方镜像时,请求会先经过加速器,由加速器从官方仓库获取镜像并缓存,再转发给本地 Docker
- 该方案会绕开网络中的 SSL 拦截:本地 Docker 连接的是阿里云加速器(HTTPS 证书合法),而非直接连接镜像的官方仓库
- 并且我们不需要修改镜像的路径,直接保持镜像的原路径拉取镜像即可
- 阿里云作为大型云服务商,其服务器网络通常不会有证书拦截问题,能直接与 Elastic 官方仓库建立合法的 HTTPS 连接
配置方式
-
登录阿里云官网阿里云容器镜像服务,按照指示注册账号,登录
-
点击左侧镜像加速器

-
点进来之后,复制你的专属加速器地址

-
通过vim或者其他方式修改docker配置文件
/etc/docker/daemon.json内容,将复制的镜像加速器地址放在镜像列表第一个,配置完成后,你的配置文件应该是这样的内容

-
重启docker,让其能够加载变更后的配置文件内容
bashsudo systemctl daemon-reload sudo systemctl restart docker -
重新拉取镜像,
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.20,成功。
