从零到一:我在服务器上部署企业级镜像仓库 Harbor 的全过程记录

🚀 从零到一:我在服务器上部署企业级镜像仓库 Harbor 的全过程记录

一、 前言:为什么我需要一个私有镜像仓库? 🤔

在我的微服务项目 hx-health-cloud 的开发过程中,我遇到了一个经典的需求:我需要一个地方来统一、安全地管理我们团队构建的所有 Docker 镜像。直接使用公共的 Docker Hub 不仅有速率限制,更重要的是,将包含业务代码的镜像放在公网上,始终存在安全隐患。

经过一番调研,我决定放弃轻量级的 registry 方案,直接一步到位,选择云原生计算基金会 (CNCF, Cloud Native Computing Foundation) 的毕业项目——Harbor,来为我的测试环境搭建一个功能强大的企业级私有镜像仓库。

这篇文章,将完整记录我从一台全新的 Ubuntu 服务器开始,直到成功部署并运行 Harbor 的每一个步骤、每一个命令、甚至每一次深入源码的思考。

二、 准备阶段:兵马未动,粮草先行 🛠️

在开始“施工”之前,我先确保我的“地基”是稳固的。

  1. 服务器就位 🖥️:我准备了一台运行 Ubuntu 22.04 LTS (Long Term Support, 长期支持) 的虚拟机,IP (Internet Protocol, 互联网协议) 地址为 192.168.31.73。这台机器满足 Harbor 的最低要求(2核/4G内存)。
  2. SSH 登录 💻:我通过 ssh dgq@192.168.31.73 成功登录到服务器。系统提示我有 279 个更新可以应用,还有一个重要的提醒 *** System restart required ***。对于一个测试环境,我决定暂时忽略它们,专注于 Harbor 的部署。
  3. 安装关键工具 jq 🔧:我知道 Harbor 的自动化安装脚本需要从 GitHub API (Application Programming Interface, 应用程序编程接口) 获取信息,而 jq 是一个解析 JSON (JavaScript Object Notation, JavaScript对象表示法) 的神器。我执行了以下命令来安装它:
    sudo apt update && sudo apt install -y jq
    
    终端输出显示,apt 更新了软件包列表,并成功安装了 jq 及其依赖 libjq1libonig5。一切顺利!

三、 核心步骤:自动化与配置的艺术 🎨

第一步:【自动化】一键获取最新版 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

这是整个过程中唯一需要我手动“创作”的部分。

  1. 进入 harbor 目录并创建配置文件

    cd harbor
    cp harbor.yml.tmpl harbor.yml
    
  2. 编辑配置文件
    我习惯性地输入 vim harbor.yml,结果系统提示 Command 'vim' not found。这是一个小插曲,说明我的服务器是一个非常纯净的环境。系统友好地提示我可以用 sudo apt install vim 来安装。不过,为了不节外生枝,我选择了另一个预装的编辑器 nano

    nano harbor.yml
    
  3. 我的配置决策
    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 的诞生过程:

  1. [Step 0 & 1] 环境检查 ✅:脚本首先检查了 dockerdocker-compose 是否存在。根据我的终端日志,它确认了我的环境版本,这对于问题排查至关重要。

    • Docker Version: 28.4.0
    • Docker Compose Version: v2.40.0

    这里有一个非常巧妙的技术细节。通过直接查看 common.sh 源码,我发现了 check_dockercompose 函数的真实逻辑。它设计得非常健壮:

    1. 它会优先尝试检测 docker compose (V2) 命令
    2. 当它在我的系统中成功检测到 V2 版本后(输出了 v2.40.0),它会动态地将内部用于执行命令的变量,从 V1 的 docker-compose 修改为 V2 的 docker compose
    3. 如果 V2 不存在,它才会去检测 V1 命令。

    这意味着,尽管脚本的 install.sh 文件中可能有一个 V1 的默认值,但它在运行时,是真真正正地使用了我系统中的 V2 插件来完成所有后续操作。这确保了脚本对新旧环境的强大兼容性。

  2. [Step 2 & 3] 环境与配置准备 ⚙️:脚本拉取了一个名为 goharbor/prepare 的工具镜像。这个镜像是 Harbor 安装的“瑞士军刀”,它读取我的 harbor.yml,然后动态生成了所有服务(Nginx, Core, Registry, DB…)所需的配置文件,以及最终的 docker-compose.yml

    • 一个重要的警告出现了:WARNING:root:WARNING: HTTP protocol is insecure.。这正是我预料到的,因为它检测到我禁用了 HTTPS。对于测试环境,我可以接受这个风险。
  3. [Step 4] 启动 Harbor 🚀:

    • 拉取镜像: 脚本开始从 Docker Hub 拉取 Harbor 运行所需的所有服务镜像。redis, registryctl, proxy, postgresql… 看着一个个 Pulled 完成,非常有成就感。
    • 启动容器: 镜像准备就绪后,脚本使用 docker compose 启动了所有服务。harbor-log, redis, harbor-db… 十个容器相继 Started
  4. 最终的礼炮 🎉:
    屏幕上打印出了那句最令人期待的话:

    ✔ ----Harbor has been installed and started successfully.----
    

    成功了!整个过程自动化程度非常高,我需要做的只是修改一份配置文件。

四、 验证与展望 🔭

我现在可以通过浏览器访问 http://192.168.31.73:81,使用 admin 和我设置的密码 Harbor12345 登录我的私有镜像仓库了。

接下来,我就可以为我的 hx-health-cloud 项目创建私有项目,并将 hx-auth, hx-gateway 等服务的镜像推送到这里,实现开发、测试流程的闭环。

这次部署经历非常顺畅,Harbor 的自动化安装脚本做得非常出色。它再次证明了,选择一个优秀的、社区成熟的开源项目,能极大地提升我们的工作效率。


总结与图表分析

表格总结
步骤核心任务使用的命令/工具关键输出/结果备注
准备阶段登录服务器 & 安装 jqssh, sudo apt install -y jqjq 安装成功jq 是自动化脚本的关键依赖
第一步自动下载并解压最新版curl, jq, wget, tarharbor 目录及安装文件就绪实现了版本解耦,无需手动查找
第二步个性化配置cp, nano harbor.ymlharbor.yml 配置完成关键:修改 hostname 和密码
第三步执行安装sudo ./install.sh✅ 所有 Harbor 容器成功启动脚本自动化了所有复杂操作
验证阶段访问 UI & 推送镜像浏览器, docker login/push✅ 成功登录并推送镜像证明整个仓库功能正常
Mermaid 流程图:Harbor 部署之路
开始: 准备服务器
安装依赖 'jq'
运行自动化脚本下载Harbor
下载并解压成功?
进入 'harbor' 目录
配置 'harbor.yml' 文件
运行 'install.sh' 脚本
所有容器启动成功?
通过浏览器访问UI
登录并推送镜像进行验证
部署成功 🎉
检查网络或脚本错误
检查Docker或配置错误
Sequence Diagram: install.sh 脚本的内部工作流
用户"安装脚本""goharbor/prepare""Docker Compose"sudo ./install.sh检查环境 (Docker, Compose)拉取并运行读取 harbor.yml, 生成所有配置文件返回生成的配置调用 'docker compose up -d'拉取所有服务镜像创建并启动所有容器返回启动成功信息显示 "Harbor installed successfully"用户"安装脚本""goharbor/prepare""Docker Compose"
State Diagram: Harbor 服务的状态
执行 install.sh
所有容器启动成功
执行 docker compose down
执行 docker compose up
日常使用
卸载
未安装
安装中
运行中
已停止
Class Diagram: Harbor 核心组件简化关系

在这里插入图片描述

Entity Relationship Diagram: Harbor 核心数据实体
PROJECTintproject_idPKstringnameboolis_publicREPOSITORYintrepo_idPKintproject_idFKstringnameARTIFACTintartifact_idPKintrepo_idFKstringtagstringdigestUSER包含包含管理
思维导图 (Markdown 格式)
  • Harbor 私有镜像仓库部署实战
    • 一、 准备阶段 🛠️
      • 服务器: Ubuntu 22.04 LTS, IP: 192.168.31.73
      • 登录: 通过 SSH 成功登录
      • 安装依赖: 使用 apt 安装 jq 工具
    • 二、 核心部署步骤 🎨
      • 1. 自动化下载 (第一步)
        • 方式: 使用包含 curljq 的 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: Harbor12345
          • database.password: root123
      • 3. 执行安装 (第三步)
        • 命令: sudo ./install.sh
        • 过程:
            1. 环境检查 (Docker 28.4.0, Docker Compose v2.40.0)
            1. 配置准备 (使用 goharbor/prepare 镜像)
            1. 启动服务 (拉取所有镜像并用 docker compose up 启动)
        • 结果: 终端显示 Harbor has been installed and started successfully
    • 三、 验证与后续 ✅
      • 访问: 浏览器打开 http://192.168.31.73:81
      • 登录: 用户名 admin,密码 Harbor12345
      • 后续操作:
        • 创建项目 (如 hx-health-cloud)
        • docker login
        • docker push 推送业务镜像
    • 四、 总结 🏁
      • 自动化脚本 极大简化了下载流程
      • harbor.yml 是唯一需要手动配置的核心
      • install.sh 封装了所有复杂性,实现了“一键部署”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值