CI/CD 实战:修复 Docker 推送私有 Harbor 仓库的 HTTPS client 错误

🚀 CI/CD 实战:修复 Docker 推送私有 Harbor 仓库的 HTTPS client 错误

一、 问题的起点:自动化部署脚本的“红牌警告” 🟥

今天,我为我的微服务项目 hx-health-cloud 编写了一个非常酷的自动化部署脚本 deploy-split.sh。它的任务是:在我的 MacBook Pro 本地完成编译、构建 Docker 镜像,然后将镜像推送到我刚刚在服务器 (192.168.31.73) 上搭建好的 Harbor 私有仓库。

一切准备就绪,我满怀期待地在终端输入 ./deploy-split.sh 并按下回车。然而,迎接我的不是成功的喜悦,而是一行冰冷的红色错误信息:

==================== 本地阶段:编译、构建、推送镜像 ====================
Error response from daemon: Get "https://192.168.31.73:81/v2/": http: server gave HTTP response to HTTPS client

嗯?这是什么意思?🤔

二、 深入分析:当“加密通话”遇到“普通对话” 🕵️‍♂️

让我们像侦探一样,来解读一下这句错误日志:

  • HTTPS client: 这指的是我的“客户端”——也就是我 MacBook Pro 上的 Docker 引擎。它默认是一个非常注重安全的好孩子,尝试使用加密的 HTTPS (HyperText Transfer Protocol Secure, 安全超文本传输协议) 协议去和远端的仓库“通话”。
  • server gave HTTP response: 这指的是我的“服务器”——也就是我部署在 192.168.31.73:81 上的 Harbor 仓库。因为我为了测试环境的便捷,在 harbor.yml 中禁用了 HTTPS,所以它只会进行不加密的 HTTP (HyperText Transfer Protocol, 超文本传输协议) “普通对话”。

真相大白! 💥

我的 Mac 上的 Docker 客户端坚持要“加密通话”,但 Harbor 服务器只会“普通对话”,两者语言不通,连接自然就失败了。Docker 客户端出于安全考虑,直接拒绝了这次不安全的连接。

三、 错误的尝试:在服务器上“自言自-语” 🤦‍♂️

我的第一反应是:“既然是仓库不安全,那我就告诉服务器上的 Docker,让它自己信任自己!”

于是,我 SSH (Secure Shell, 安全外壳协议) 登录到服务器 192.168.31.73,一顿操作猛如虎:

  1. sudo nano /etc/docker/daemon.json
  2. 添加了 "insecure-registries": ["192.168.31.73:81"]
  3. sudo systemctl restart docker

然后,我信心满满地回到我的 Mac 上,再次运行 ./deploy-split.sh。结果… 同样的错误再次出现!

这时我才恍然大悟:我刚刚的操作,只是让服务器自己信任了 Harbor。但这没用啊!真正需要发起连接、需要信任这个 HTTP 地址的,是我的本地开发机——我的 MacBook Pro!

这个过程就像:

  • Harbor 服务器:是“银行金库” 🏦。
  • 我的 MacBook Pro:是“运钞车” 🚚。
  • 我的错误操作:我跑去告诉“金库”的保安:“嘿,你所在的这条‘普通公路’(HTTP) 是安全的!” 保安说:“我知道啊,可这跟我没关系,是‘运钞车’不肯开过来。”

四、 最终的解决方案:给“运钞车”颁发“普通公路通行证” ✅

我终于找到了正确的方向:必须配置发起请求的客户端,也就是我 Mac 上的 Docker Desktop。

操作步骤如下:

  1. 打开 Docker Desktop 🐳。

  2. 进入设置:点击屏幕右上角菜单栏的 Docker 图标 ➡️ Settings (设置)。

  3. 找到 Docker 引擎配置:在左侧导航栏中,点击 Docker Engine

  4. 编辑 daemon.json 配置文件
    我看到了一个 JSON (JavaScript Object Notation, JavaScript对象表示法) 编辑框,里面是我当前的配置。

    修改前:

    {
      "builder": {
        "gc": {
          "defaultKeepStorage": "20GB",
          "enabled": true
        }
      },
      "experimental": false
    }
    

    我小心翼翼地在 experimental 这一行的末尾加上一个逗号 ,,然后添加了 insecure-registries 字段。

    修改后:

    {
      "builder": {
        "gc": {
          "defaultKeepStorage": "20GB",
          "enabled": true
        }
      },
      "experimental": false,
      "insecure-registries": [
        "192.168.31.73:81"
      ]
    }
    
  5. 应用并重启 Docker
    点击右下角蓝色的 “Apply & Restart” 按钮。Docker Desktop 开始重启它的引擎,加载我刚刚颁发的“通行证”。

五、 见证奇迹:自动化脚本的绿色通道 🟢

在 Docker Desktop 重启完成后,我深吸一口气,回到终端,最后一次运行我的部署脚本:

./deploy-split.sh

这一次,终端的输出终于变得“可爱”起来:

==================== 本地阶段:编译、构建、推送镜像 ====================
Login Succeeded
...
The push refers to repository [192.168.31.73:81/library/hx-gateway-app]
...
==================== 服务器阶段:拉取镜像并启动容器 ====================
...
🎉 分离式部署完成!

成功了!我的自动化部署脚本终于打通了从本地到私有仓库的“最后一公里”。

六、 结语 🏁

这次排错经历是一个绝佳的教训,它深刻地提醒我:

Docker 的安全策略是客户端驱动的。谁发起请求,谁就需要配置信任规则。

insecure-registries 是我们处理内网或测试环境 HTTP 仓库时必须掌握的关键配置。希望我的这段从“踩坑”到“填坑”的经历,能帮助同样遇到这个问题的你,少走一些弯路。

Happy Dockering! 🐳


总结与图表分析

表格总结
阶段操作地点核心操作目的结果
初次尝试💻 本地 Mac运行 ./deploy-split.sh推送镜像到 Harbor失败,报 HTTPS client 错误
错误排查🖥️ 远程服务器修改服务器的 daemon.json让服务器信任自己的 HTTP 仓库无效,问题根源不在服务器
定位问题🧠 逻辑分析明确错误由客户端发起确认需修改本地 Mac 的 Docker 配置方向正确
最终解决💻 本地 Mac修改 Docker Desktop 的 daemon.json让本地 Docker 信任 HTTP 仓库成功,脚本顺利执行
Mermaid 流程图:排错心路历程
开始: 运行部署脚本
出现'HTTPS client'错误
错误判断: 以为是服务器问题
登录服务器, 修改其'daemon.json'
再次运行脚本
错误依旧?
重新分析: 错误由客户端发起
正确判断: 需修改本地Mac配置
修改本地Docker Desktop的'daemon.json'
重启本地Docker
再次运行脚本
部署成功 🎉
Sequence Diagram: Docker Push 失败与成功的交互
"本地Mac""Docker客户端"Harbordocker push 192.168.31.73:81/my-app默认使用 HTTPS[HTTPS] 请求 /v2/[HTTP] 响应协议不匹配, 拒绝连接返回 "http: server gave HTTP response to HTTPS client" 错误用户修改 daemon.json 并重启 Dockerdocker push 192.168.31.73:81/my-app配置允许 HTTP[HTTP] 请求 /v2/[HTTP] 响应 (200 OK)[HTTP] 推送镜像层响应成功返回 "Push Succeeded""本地Mac""Docker客户端"Harbor
State Diagram: Docker 客户端对仓库的信任状态
仅信任HTTPS
用户在 daemon.json 中
添加 insecure-registries
用户从 daemon.json 中
移除 insecure-registries
默认状态
信任特定HTTP
Class Diagram: 简化的部署脚本与环境关系

在这里插入图片描述

Entity Relationship Diagram: 部署流程中的实体
CLIENT_MACHINEstringhostnamePKstringosmacOSDOCKER_DAEMONDAEMON_JSONstringconfig_pathPKstringinsecure_registriesDEPLOY_SCRIPTHARBOR_REGISTRY运行配置调用通信
思维导图 (Markdown 格式)
  • CI/CD 实战:修复 Docker 推送私有 Harbor 仓库的 HTTPS client 错误
    • 一、 问题浮现 🟥
      • 场景: 在本地 Mac 运行 deploy-split.sh 自动化部署脚本
      • 目标: 推送 Docker 镜像到内网的 Harbor 仓库 (http://192.168.31.73:81)
      • 错误: http: server gave HTTP response to HTTPS client
    • 二、 深入分析 🕵️‍♂️
      • 客户端行为: 本地 Mac 的 Docker 默认使用 HTTPS
      • 服务器行为: Harbor 仓库配置为 HTTP
      • 结论: 客户端与服务器安全协议不匹配,导致连接被客户端拒绝
    • 三、 错误的排查弯路 🤦‍♂️
      • 误判: 以为是服务器端的问题
      • 操作: SSH 登录服务器,修改了服务器的 /etc/docker/daemon.json
      • 结果: 无效,因为发起请求的是本地 Mac,而非服务器自身
    • 四、 最终的正确解决方案 ✅
      • 核心原则: 谁是客户端,就配置谁
      • 操作平台: 本地 MacBook Pro
      • 步骤:
          1. 打开 Docker Desktop
          1. 进入 Settings -> Docker Engine
          1. 修改 daemon.json,添加 insecure-registries 字段
          "insecure-registries": [
            "192.168.31.73:81"
          ]
          
          1. 点击 “Apply & Restart”
    • 五、 成功验证 🟢
      • 重启 Docker Desktop 后,再次运行 ./deploy-split.sh
      • Login Succeeded,镜像推送成功
      • 自动化部署流程打通
    • 六、 总结与启示 🏁
      • 关键知识点: Docker 的安全策略是客户端驱动
      • 核心配置: insecure-registries 是解决 HTTP 仓库访问问题的标准方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值