Docker 拉取镜像:SSL 拦截与国内镜像源失效问题解决

目录

前言

这篇博客主要总结一下,我最近用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

    输出核心错误:

    bash 复制代码
    depth=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问题

指定国内镜像

  1. 想到的第一个办法就是还是不从官方仓库中拉取镜像,首选还是从国内镜像仓库中拉取镜像,因此,我们在拉取镜像时可以直接指定镜像源,本次我指定的是阿里镜像源

    bash 复制代码
    docker pull registry.cn-hangzhou.aliyuncs.com/elastic-stack/elasticsearch:7.17.20
  2. 但是指定镜像源拉取镜像还是失败,原因是elastic-stack 命名空间下并未存储 7.17.20 版本的 Elasticsearch 镜像

  3. 因此,直接使用国内镜像源的痛点就是镜像版本不全 ,多数国内镜像源仅同步镜像的热门版本,路径难寻:不同厂商的镜像命名空间不统一(如阿里云可能在 library/ 下,网易云在 elastic/ 下),需逐一搜索验证,效率低。

阿里镜像加速器(最终方案)

最后还是通过配置阿里镜像加速器解决了这个问题,让镜像加速器代理我们从官方仓库中拉取镜像,然后发给我们。

镜像加速器作用

  • 阿里云镜像加速器并非提供 "镜像副本",而是作为 官方仓库的代理缓存------ 当 Docker 拉取官方镜像时,请求会先经过加速器,由加速器从官方仓库获取镜像并缓存,再转发给本地 Docker
  • 该方案会绕开网络中的 SSL 拦截:本地 Docker 连接的是阿里云加速器(HTTPS 证书合法),而非直接连接镜像的官方仓库
  • 并且我们不需要修改镜像的路径,直接保持镜像的原路径拉取镜像即可
  • 阿里云作为大型云服务商,其服务器网络通常不会有证书拦截问题,能直接与 Elastic 官方仓库建立合法的 HTTPS 连接

配置方式

  1. 登录阿里云官网阿里云容器镜像服务,按照指示注册账号,登录

  2. 点击左侧镜像加速器

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

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

  5. 重启docker,让其能够加载变更后的配置文件内容

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  6. 重新拉取镜像,docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.20,成功。

相关推荐
醉卧雕龙舫 、9 小时前
五.docker环境搭建实例
docker
缘的猿11 小时前
kubectl 学习心得:从入门到实践的 K8s 命令行掌控之旅
云原生·容器·kubernetes
老友@12 小时前
Docker 部署 Node.js + Playwright 项目,实现浏览器截图、打印和下载
docker·容器·node.js·playwright
2401_8401922712 小时前
什么是ingress?
docker·容器·kubernetes
攀小黑14 小时前
docker 容器内nacos(若依plus打包)连接另一台内网服务器显示数据库连接失败
服务器·数据库·docker
晚风 -14 小时前
idea中Docker一键自动化部署
docker·容器·自动化
Hilaku15 小时前
前端开发,真的有必要学Docker吗?
前端·javascript·docker
Java陈序员16 小时前
代码检测器!一款专门揭露屎山代码的质量分析工具!
docker·go
落日漫游16 小时前
ArgoCD与Helm:云原生部署对比解析
java·容器·kubernetes