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,成功。

相关推荐
bloglin999998 小时前
启动容器报错ls: cannot access ‘/docker-entrypoint-initdb.d/‘: Operation not permitted
docker·容器·eureka
songjxin9 小时前
离线部署kubernetes v1.34.3
云原生·容器·kubernetes
yBmZlQzJ10 小时前
免费内网穿透-端口转发配置介绍
运维·经验分享·docker·容器·1024程序员节
JH307310 小时前
docker 新手入门:10分钟搞定基础使用
运维·docker·容器
天河归来11 小时前
在本地windows电脑使用Docker搭建xinference环境
docker·语言模型·容器
算力魔方AIPC12 小时前
使用 Docker 一键部署 PaddleOCR-VL: 新手保姆级教程
运维·docker·容器
熊出没12 小时前
Kubernetes 实操命令大全
云原生·容器·kubernetes
Ghost Face...13 小时前
Docker实战:从安装到多容器编排指南
运维·docker·容器
TSAI14 小时前
Docker Swarm 集群部署 Eureka 服务注册中心:高可用微服务架构的基石
spring cloud·docker
不惑_14 小时前
Windows 安装 Docker 和 Docker Compose 完整教程
windows·docker·容器