🚀 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,一顿操作猛如虎:
sudo nano /etc/docker/daemon.json- 添加了
"insecure-registries": ["192.168.31.73:81"] sudo systemctl restart docker
然后,我信心满满地回到我的 Mac 上,再次运行 ./deploy-split.sh。结果… 同样的错误再次出现!
这时我才恍然大悟:我刚刚的操作,只是让服务器自己信任了 Harbor。但这没用啊!真正需要发起连接、需要信任这个 HTTP 地址的,是我的本地开发机——我的 MacBook Pro!
这个过程就像:
- Harbor 服务器:是“银行金库” 🏦。
- 我的 MacBook Pro:是“运钞车” 🚚。
- 我的错误操作:我跑去告诉“金库”的保安:“嘿,你所在的这条‘普通公路’(HTTP) 是安全的!” 保安说:“我知道啊,可这跟我没关系,是‘运钞车’不肯开过来。”
四、 最终的解决方案:给“运钞车”颁发“普通公路通行证” ✅
我终于找到了正确的方向:必须配置发起请求的客户端,也就是我 Mac 上的 Docker Desktop。
操作步骤如下:
-
打开 Docker Desktop 🐳。
-
进入设置:点击屏幕右上角菜单栏的 Docker 图标 ➡️ Settings (设置)。
-
找到 Docker 引擎配置:在左侧导航栏中,点击 Docker Engine。
-
编辑
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" ] } -
应用并重启 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 流程图:排错心路历程
Sequence Diagram: Docker Push 失败与成功的交互
State Diagram: Docker 客户端对仓库的信任状态
Class Diagram: 简化的部署脚本与环境关系

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

被折叠的 条评论
为什么被折叠?



