🚀 从零到一:我在服务器上部署企业级镜像仓库 Harbor 的全过程记录
一、 前言:为什么我需要一个私有镜像仓库? 🤔
在我的微服务项目 hx-health-cloud 的开发过程中,我遇到了一个经典的需求:我需要一个地方来统一、安全地管理我们团队构建的所有 Docker 镜像。直接使用公共的 Docker Hub 不仅有速率限制,更重要的是,将包含业务代码的镜像放在公网上,始终存在安全隐患。
经过一番调研,我决定放弃轻量级的 registry 方案,直接一步到位,选择云原生计算基金会 (CNCF, Cloud Native Computing Foundation) 的毕业项目——Harbor,来为我的测试环境搭建一个功能强大的企业级私有镜像仓库。
这篇文章,将完整记录我从一台全新的 Ubuntu 服务器开始,直到成功部署并运行 Harbor 的每一个步骤、每一个命令、甚至每一次深入源码的思考。
二、 准备阶段:兵马未动,粮草先行 🛠️
在开始“施工”之前,我先确保我的“地基”是稳固的。
- 服务器就位 🖥️:我准备了一台运行 Ubuntu 22.04 LTS (Long Term Support, 长期支持) 的虚拟机,IP (Internet Protocol, 互联网协议) 地址为
192.168.31.73。这台机器满足 Harbor 的最低要求(2核/4G内存)。 - SSH 登录 💻:我通过
ssh dgq@192.168.31.73成功登录到服务器。系统提示我有 279 个更新可以应用,还有一个重要的提醒*** System restart required ***。对于一个测试环境,我决定暂时忽略它们,专注于 Harbor 的部署。 - 安装关键工具
jq🔧:我知道 Harbor 的自动化安装脚本需要从 GitHub API (Application Programming Interface, 应用程序编程接口) 获取信息,而jq是一个解析 JSON (JavaScript Object Notation, JavaScript对象表示法) 的神器。我执行了以下命令来安装它:
终端输出显示,sudo apt update && sudo apt install -y jqapt更新了软件包列表,并成功安装了jq及其依赖libjq1和libonig5。一切顺利!
三、 核心步骤:自动化与配置的艺术 🎨
第一步:【自动化】一键获取最新版 Harbor
我不想手动去 GitHub 的 Release 页面翻找最新版本和下载链接。于是,我使用了下面这个非常酷的自动化脚本,它能帮我搞定一切。
我直接在终端完整地复制、粘贴并执行了这段脚本:
#!/bin/bash
# --- 脚本开始 ---
echo "🚀 正在查询 Harbor 最新稳定版本..."
# 1. 使用 GitHub API 获取最新 release 的信息
LATEST_RELEASE_URL=$(curl -s https://api.github.com/repos/goharbor/harbor/releases/latest)
# 2. 使用 jq 解析出在线安装包 (online-installer) 的下载链接
DOWNLOAD_URL=$(echo "$LATEST_RELEASE_URL" | jq -r '.assets[] | select(.name | contains("online-installer")) | .browser_download_url')
# 3. 检查是否成功获取到 URL
if [ -z "$DOWNLOAD_URL" ]; then
echo "❌ 错误:无法自动获取最新的 Harbor 下载链接。请检查网络连接或手动访问 https://github.com/goharbor/harbor/releases"
exit 1
fi
# 4. 从 URL 中提取文件名
FILENAME=$(basename "$DOWNLOAD_URL")
echo "✅ 找到最新版本文件: $FILENAME"
echo "开始下载,请稍候..."
# 5. 使用 wget 下载文件,并显示进度条
wget -q --show-progress "$DOWNLOAD_URL"
# 6. 检查下载是否成功
if [ $? -ne 0 ]; then
echo "❌ 错误:文件下载失败。"
exit 1
fi
echo "✅ 下载完成,正在解压..."
# 7. 解压下载的 tgz 文件
tar xzvf "$FILENAME"
# 8. 检查解压是否成功
if [ $? -ne 0 ]; then
echo "❌ 错误:文件解压失败。"
exit 1
fi
echo "🎉 成功!Harbor 安装文件已准备就绪,位于 'harbor' 目录中。"
echo "下一步:请进入 'harbor' 目录并配置 'harbor.yml' 文件。"
# --- 脚本结束 ---
终端的输出让我非常满意,它完美地执行了我的意图:
🚀 正在查询 Harbor 最新稳定版本...
✅ 找到最新版本文件: harbor-online-installer-v2.14.0.tgz
开始下载,请稍候...
harbor-online-installer-v2.14.0.tgz 100%[===================>] 11.54K --.-KB/s in 0.02s
✅ 下载完成,正在解压...
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl
🎉 成功!Harbor 安装文件已准备就绪,位于 'harbor' 目录中。
太棒了!脚本自动帮我找到了最新的 v2.14.0 版本,并完成了下载和解压。我甚至都不需要知道版本号是多少!
第二步:个性化配置 harbor.yml
这是整个过程中唯一需要我手动“创作”的部分。
-
进入
harbor目录并创建配置文件:cd harbor cp harbor.yml.tmpl harbor.yml -
编辑配置文件:
我习惯性地输入vim harbor.yml,结果系统提示Command 'vim' not found。这是一个小插曲,说明我的服务器是一个非常纯净的环境。系统友好地提示我可以用sudo apt install vim来安装。不过,为了不节外生枝,我选择了另一个预装的编辑器nano:nano harbor.yml -
我的配置决策:
在nano编辑器中,我进行了以下关键修改:hostname: 我没有使用域名,因为这只是一个内部测试环境。我直接将其设置为我服务器的 IP 地址:192.168.31.73。http.port: 为了避免与服务器上可能存在的其他服务(如 Nginx)冲突,我将默认的80端口改为了81。https: 我用#注释掉了整个https配置块。因为这是内部测试,暂时不需要配置复杂的 HTTPS (HyperText Transfer Protocol Secure, 安全超文本传输协议)。(注意:这在生产环境中是绝对不推荐的!)harbor_admin_password: 我设置了一个简单的初始密码Harbor12345。database.password: 我也为数据库设置了一个密码root123。- 其他配置(如
data_volume)我都保留了默认值。
配置完成后,我使用
cat harbor.yml命令检查了一遍,确保修改无误。
第三步:执行安装,见证奇迹的时刻 ✨
一切准备就绪,我以 sudo 权限运行了 Harbor 的安装脚本:
sudo ./install.sh
终端的输出就像一部精彩的戏剧,上演了 Harbor 的诞生过程:
-
[Step 0 & 1] 环境检查 ✅:脚本首先检查了
docker和docker-compose是否存在。根据我的终端日志,它确认了我的环境版本,这对于问题排查至关重要。- Docker Version:
28.4.0 - Docker Compose Version:
v2.40.0
这里有一个非常巧妙的技术细节。通过直接查看
common.sh源码,我发现了check_dockercompose函数的真实逻辑。它设计得非常健壮:- 它会优先尝试检测
docker compose(V2) 命令。 - 当它在我的系统中成功检测到 V2 版本后(输出了
v2.40.0),它会动态地将内部用于执行命令的变量,从 V1 的docker-compose修改为 V2 的docker compose。 - 如果 V2 不存在,它才会去检测 V1 命令。
这意味着,尽管脚本的
install.sh文件中可能有一个 V1 的默认值,但它在运行时,是真真正正地使用了我系统中的 V2 插件来完成所有后续操作。这确保了脚本对新旧环境的强大兼容性。 - Docker Version:
-
[Step 2 & 3] 环境与配置准备 ⚙️:脚本拉取了一个名为
goharbor/prepare的工具镜像。这个镜像是 Harbor 安装的“瑞士军刀”,它读取我的harbor.yml,然后动态生成了所有服务(Nginx, Core, Registry, DB…)所需的配置文件,以及最终的docker-compose.yml。- 一个重要的警告出现了:
WARNING:root:WARNING: HTTP protocol is insecure.。这正是我预料到的,因为它检测到我禁用了 HTTPS。对于测试环境,我可以接受这个风险。
- 一个重要的警告出现了:
-
[Step 4] 启动 Harbor 🚀:
- 拉取镜像: 脚本开始从 Docker Hub 拉取 Harbor 运行所需的所有服务镜像。
redis,registryctl,proxy,postgresql… 看着一个个Pulled完成,非常有成就感。 - 启动容器: 镜像准备就绪后,脚本使用
docker compose启动了所有服务。harbor-log,redis,harbor-db… 十个容器相继Started。
- 拉取镜像: 脚本开始从 Docker Hub 拉取 Harbor 运行所需的所有服务镜像。
-
最终的礼炮 🎉:
屏幕上打印出了那句最令人期待的话:✔ ----Harbor has been installed and started successfully.----成功了!整个过程自动化程度非常高,我需要做的只是修改一份配置文件。
四、 验证与展望 🔭
我现在可以通过浏览器访问 http://192.168.31.73:81,使用 admin 和我设置的密码 Harbor12345 登录我的私有镜像仓库了。
接下来,我就可以为我的 hx-health-cloud 项目创建私有项目,并将 hx-auth, hx-gateway 等服务的镜像推送到这里,实现开发、测试流程的闭环。
这次部署经历非常顺畅,Harbor 的自动化安装脚本做得非常出色。它再次证明了,选择一个优秀的、社区成熟的开源项目,能极大地提升我们的工作效率。
总结与图表分析
表格总结
| 步骤 | 核心任务 | 使用的命令/工具 | 关键输出/结果 | 备注 |
|---|---|---|---|---|
| 准备阶段 | 登录服务器 & 安装 jq | ssh, sudo apt install -y jq | ✅ jq 安装成功 | jq 是自动化脚本的关键依赖 |
| 第一步 | 自动下载并解压最新版 | curl, jq, wget, tar | ✅ harbor 目录及安装文件就绪 | 实现了版本解耦,无需手动查找 |
| 第二步 | 个性化配置 | cp, nano harbor.yml | ✅ harbor.yml 配置完成 | 关键:修改 hostname 和密码 |
| 第三步 | 执行安装 | sudo ./install.sh | ✅ 所有 Harbor 容器成功启动 | 脚本自动化了所有复杂操作 |
| 验证阶段 | 访问 UI & 推送镜像 | 浏览器, docker login/push | ✅ 成功登录并推送镜像 | 证明整个仓库功能正常 |
Mermaid 流程图:Harbor 部署之路
Sequence Diagram: install.sh 脚本的内部工作流
State Diagram: Harbor 服务的状态
Class Diagram: Harbor 核心组件简化关系

Entity Relationship Diagram: Harbor 核心数据实体
思维导图 (Markdown 格式)
- Harbor 私有镜像仓库部署实战
- 一、 准备阶段 🛠️
- 服务器: Ubuntu 22.04 LTS, IP:
192.168.31.73 - 登录: 通过 SSH 成功登录
- 安装依赖: 使用
apt安装jq工具
- 服务器: Ubuntu 22.04 LTS, IP:
- 二、 核心部署步骤 🎨
- 1. 自动化下载 (第一步)
- 方式: 使用包含
curl和jq的 Shell 脚本 - 目的: 自动获取 GitHub 最新稳定版的
online-installer - 结果: 成功下载并解压
harbor-online-installer-v2.14.0.tgz
- 方式: 使用包含
- 2. 个性化配置 (第二步)
- 文件:
harbor.yml(由harbor.yml.tmpl复制而来) - 编辑器: 使用
nano(因为vim未预装) - 关键修改:
hostname:192.168.31.73(使用 IP)http.port:81(避免端口冲突)https: 注释掉 (测试环境简化)harbor_admin_password:Harbor12345database.password:root123
- 文件:
- 3. 执行安装 (第三步)
- 命令:
sudo ./install.sh - 过程:
-
- 环境检查 (Docker
28.4.0, Docker Composev2.40.0)
- 环境检查 (Docker
-
- 配置准备 (使用
goharbor/prepare镜像)
- 配置准备 (使用
-
- 启动服务 (拉取所有镜像并用
docker compose up启动)
- 启动服务 (拉取所有镜像并用
-
- 结果: 终端显示
Harbor has been installed and started successfully
- 命令:
- 1. 自动化下载 (第一步)
- 三、 验证与后续 ✅
- 访问: 浏览器打开
http://192.168.31.73:81 - 登录: 用户名
admin,密码Harbor12345 - 后续操作:
- 创建项目 (如
hx-health-cloud) docker logindocker push推送业务镜像
- 创建项目 (如
- 访问: 浏览器打开
- 四、 总结 🏁
- 自动化脚本 极大简化了下载流程
harbor.yml是唯一需要手动配置的核心install.sh封装了所有复杂性,实现了“一键部署”
- 一、 准备阶段 🛠️
155

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



