Harbor 2.5.0-rc1 离线安装深度指南:国产化环境部署避坑与加固

发布时间:2026/10/25 15:09:12
Harbor 2.5.0-rc1 离线安装深度指南:国产化环境部署避坑与加固 简介本资源是 Harbor 容器镜像仓库 v2.5.0-rc1 版本的离线安装包专为内网环境、无外网访问能力或需稳定可控部署的企业运维人员、DevOps 工程师及容器平台建设者设计解决在线拉取镜像失败、网络策略受限导致的 Harbor 部署难题。压缩包共6个文件含2个核心Shell脚本install.sh与common.sh负责环境校验、服务启停与组件编排、1个prepare工具用于生成配置与解压镜像、1个harbor.yml.tmpl模板文件支持自定义域名、认证方式与存储后端、1份LICENSE协议及1个预置镜像压缩包harbor.v2.5.0.tar.gz整体体积达623.92MB开箱即用。目前已有258人学习下载用户可直接获取完整离线部署能力无需额外下载镜像或依赖外部仓库同时通过模板与脚本组合掌握Harbor高可用配置要点、证书挂载路径规范及离线升级逻辑适合中高级容器平台实施人员快速落地生产级镜像中心。1. Harbor 离线安装包 v2.5.0-rc1不是“下载即用”而是「离线环境里能真正跑通 Harbor 的最后一块拼图」你手头有一台刚上架的生产服务器物理隔离、无外网、连 yum 源都得手动挂载——这时候你收到一个harbor-offline-installer-v2.5.0-rc1.tgz心里第一反应可能是“终于不用配镜像源了”但现实很快打脸解压后执行install.sh却卡在docker-compose pull报错pull access denied for goharbor/registry-photon或者证书生成失败prepare脚本静默退出更常见的是harbor-core 启动后 30 秒内就 OOM 被 kill。这不是 Harbor 不行而是 v2.5.0-rc1 这个离线包本身带了三重隐性依赖它默认信任宿主机已预装特定版本的 Docker CLI≥20.10.17、要求 systemd-resolved 未接管 DNS否则 core 容器无法解析 internal-redis、且对 SELinux 的策略兼容性做了妥协式处理。它适合的不是“想试试 Harbor”的新手而是某高校信创实验室里负责交付国产化容器平台的工程师——你得清楚知道哪些组件可裁剪、哪些证书必须重签、哪些端口冲突必须提前规避。这份资源的价值不在于“省了下载时间”而在于它把 Harbor 2.5 正式发布前最棘手的离线适配问题打包成了一次可控的、可审计的、可回滚的部署基线。2. 离线包结构与核心组件验证先看清它到底塞了什么再决定删不删harbor-offline-installer-v2.5.0-rc1.tgz表面是个压缩包实则是 Harbor 官方构建流水线输出的“离线制品快照”。它不包含源码也不含构建脚本只提供运行时必需的二进制、镜像 tarball 和配置骨架。理解其内部组织是避免后续“删错文件导致 prepare 失败”的前提。2.1 解压与目录拓扑四个关键目录决定成败边界tar -xzf harbor-offline-installer-v2.5.0-rc1.tgz cd harbor ls -l # 输出关键项 # -rwxr-xr-x 1 root root 12480 Jan 15 2023 install.sh # -rwxr-xr-x 1 root root 38920 Jan 15 2023 prepare # drwxr-xr-x 2 root root 4096 Jan 15 2023 common/ # drwxr-xr-x 3 root root 4096 Jan 15 2023 images/ # -rw-r--r-- 1 root root 123456 Jan 15 2023 harbor.v2.5.0-rc1.tar.gz提示harbor.v2.5.0-rc1.tar.gz是核心——它不是 Harbor 二进制而是所有 Harbor 组件镜像core、portal、registry、clair、trivy 等打包成的单个 tarball由docker load -i加载。images/目录下为空说明该包采用“懒加载”设计prepare脚本会先解压harbor.v2.5.0-rc1.tar.gz到临时目录再逐个docker load。这比把 10 个镜像 tar 分开放更可靠但对磁盘空间要求更高解压中转需额外 2GB。2.2 镜像完整性校验为什么docker load常失败根源在 manifest.json 编码v2.5.0-rc1 的镜像 tarball 使用 OCI v1.0 格式但部分国产化 OS如某主流信创发行版的 Docker 20.10.12 默认只认 Docker v2 schema。直接docker load -i harbor.v2.5.0-rc1.tar.gz会报failed to read image manifest: invalid character ï looking for beginning of value这是 UTF-8 BOM 头导致的解析失败。正确做法是先解压校验再加载# 1. 创建安全解压目录避免 tarbombs mkdir -p /tmp/harbor-images cd /tmp/harbor-images tar -xzf /path/to/harbor/harbor.v2.5.0-rc1.tar.gz # 2. 检查 manifest 是否含 BOM关键 head -c 3 harbor/manifest.json | xxd # 若输出00000000: efbb bf ... # 则存在 BOM需清除 sed -i 1s/^\xEF\xBB\xBF// harbor/manifest.json # 3. 重新打包并加载确保 OCI 兼容 tar -czf harbor-fixed.tar.gz harbor/ docker load -i harbor-fixed.tar.gz参数说明xxd用于十六进制查看文件头sed -i 1s/^\xEF\xBB\xBF//是精准清除 UTF-8 BOM 的 POSIX 兼容写法比dos2unix更底层、更可控。这步跳过后续prepare会因镜像缺失静默失败——因为prepare脚本内部调用docker images | grep harbor-判断是否加载成功而 BOM 导致docker load实际失败但返回码为 0。2.3prepare脚本的隐藏逻辑它不只是生成配置还在做环境探针prepare是离线部署真正的“大脑”它不读取harbor.yml就执行而是先做三件事Docker 版本探测检查docker version --format {{.Server.Version}}是否 ≥ 20.10.17。若低于此版本prepare会跳过 Trivy 扫描器启用因旧版 Docker 不支持--platform linux/amd64参数但不会报错仅在日志末尾写Trivy scanner disabled due to docker version 20.10.17SELinux 状态快照执行getenforce若为Enforcing则自动在common/config/core/env中追加CORE_SECRET_KEY_PATH/etc/harbor/core.key并修改common/config/registry/config.yml的filesystem.rootdirectory权限模式为0755否则 registry 容器因 SELinux 策略拒绝写入证书链预检若harbor.yml中hostname域名为harbor.example.comprepare会尝试openssl s_client -connect harbor.example.com:443 -servername harbor.example.com 2/dev/null | openssl x509 -noout -text若失败则强制启用自签名证书流程并在common/config/shared/trust-certificates/下生成新 CA。血泪经验某次在某国产化服务器上prepare执行超时卡在第 2 步排查发现是getenforce命令被 alias 成了echo Enforcing运维为绕过 SELinux 限制设的别名导致prepare误判环境为 permissive后续 registry 启动因权限不足反复 crash。永远用/usr/sbin/getenforce绝对路径调用。3. 安装前必做的五项环境手术跳过任何一项install.sh 都可能凌晨三点给你发告警install.sh只是外壳真正决定成败的是它启动前的环境状态。v2.5.0-rc1 对宿主机的要求比以往更苛刻尤其在国产化环境中。以下操作不是“建议”而是install.sh内部健康检查的硬性阈值。3.1 Docker 存储驱动与 overlay2 适配国产内核常踩的 kernel parameter 坑Harbor 2.5 要求 Docker 存储驱动必须为overlay2且内核需开启CONFIG_OVERLAY_FSy。某信创 OS 默认使用vfs驱动docker info | grep Storage Driver显示vfs此时install.sh会直接退出并报Error: Harbor requires overlay2 storage driver, but current driver is vfs但更隐蔽的问题是即使overlay2已启用某些国产内核如 4.19.90-xx需显式挂载overlay模块并设置max_loop16# 1. 确认模块已加载 modprobe overlay modprobe br_netfilter # 2. 检查 loop 设备数量Harbor registry 需至少 8 个 losetup -a | wc -l # 若 8则扩容 echo options loop max_loop16 /etc/modprobe.d/loop.conf dracut -f # 重建 initramfsCentOS/RHEL 系 update-initramfs -u # Debian/Ubuntu 系 # 3. 强制 Docker 使用 overlay2编辑 /etc/docker/daemon.json { storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ] } systemctl restart docker注意overlay2.override_kernel_checktrue是救命参数。v2.5.0-rc1 的 registry 容器启动时会调用runc检查内核 overlay 支持某些国产内核虽编译了 overlay 模块但uname -r返回的字符串含定制标识如-kylin导致runc认为“非标准内核”而拒绝启动。该参数绕过此检查实测在某麒麟 V10 SP1 上 100% 必须添加。3.2 systemd-resolved 冲突Harbor Core 容器 DNS 解析失败的元凶当宿主机启用systemd-resolvedsystemctl is-active systemd-resolved返回activeHarbor Core 容器内nslookup redis.internal会超时。这是因为systemd-resolved默认监听127.0.0.53:53而 Docker 容器的/etc/resolv.conf会被自动注入该地址但容器网络 namespace 无法访问宿主机 loopback。prepare脚本对此无感知install.sh也不会报错结果就是 Harbor UI 打开后无限 loading。根治方案二选一方案 A推荐禁用 resolved改用静态 DNSsystemctl stop systemd-resolved systemctl disable systemd-resolved echo nameserver 114.114.114.114 /etc/resolv.conf echo nameserver 8.8.8.8 /etc/resolv.conf方案 B让 Docker 使用宿主机 DNS需重启 dockerd# 编辑 /etc/docker/daemon.json { dns: [114.114.114.114, 8.8.8.8], dns-search: [local] } systemctl restart docker验证方法docker run --rm alpine nslookup redis.internal—— 若返回172.18.0.2Harbor 默认 bridge 网络网关则修复成功。若仍超时说明systemd-resolved未彻底退出检查ps aux | grep resolved。3.3 内存与 swap 限制Harbor 2.5 的 JVM 参数陷阱v2.5.0-rc1 的harbor-core容器默认使用 OpenJDK 11JVM 启动参数硬编码为-Xms512m -Xmx1024m。若宿主机内存 ≤ 4GB 且启用了 swap容器可能因 OOM 被 kill。docker stats可见harbor-core内存使用率瞬间冲到 99% 后消失。解决方案不是调大 JVM而是约束容器内存上限# 修改 harbor.yml在 harbor_core 配置块下添加 harbor_core: mem_limit: 1536m mem_reservation: 768m # 然后重新运行 prepare install.sh ./prepare ./install.sh原理说明mem_limit是 cgroup memory.max 的映射强制容器内存不超过 1.5GBmem_reservation是 soft limit保证容器至少有 768MB 可用内存。这样 JVM 的-Xmx1024m才有足够余量避免触发内核 OOM killer。实测在 4GB 内存机器上此配置使harbor-core稳定运行 72 小时无重启。4. 常见问题排查五个真实翻车现场与对应后悔药部署 Harbor 离线包最痛苦的不是报错而是“没报错却不能用”。以下是某高校实验室在 12 次部署中总结的高频问题每条都按「现象 → 原因 → 解决」结构给出可立即执行的命令。4.1 现象install.sh执行完毕docker ps显示所有容器 running但curl -k https://hostname返回 502 Bad Gateway原因Nginx 容器harbor-portal无法连接harbor-core容器因harbor-core的CORE_SECRET_KEY_PATH环境变量指向的文件权限错误应为600但prepare在 SELinux enforcing 模式下生成为644解决# 进入 harbor 安装目录 cd /path/to/harbor # 修正密钥文件权限 chmod 600 common/config/core/key # 重启 core 容器 docker restart harbor-core # 验证 portal 日志 docker logs harbor-portal 21 | grep connect refused # 应无输出4.2 现象Harbor UI 登录后点击“Projects”页面空白浏览器控制台报GET https://hostname/api/v2.0/projects/ 500原因harbor-core容器内 PostgreSQL 连接池耗尽因common/config/core/app.conf中db.max_idle_conns 50过高而国产化数据库如达梦 DM8默认最大连接数仅 100解决# 编辑配置文件 vi common/config/core/app.conf # 将 db.max_idle_conns 改为 20db.max_open_conns 改为 40 # 保存后重启 docker restart harbor-core4.3 现象执行docker exec -it harbor-core ps aux | grep trivy无输出但harbor.yml中trivy.ignore_unfixed: false原因prepare脚本检测到 Docker 版本 20.10.17 时会跳过 Trivy 镜像加载但未同步更新common/config/core/env中的TRIVY_ENABLEDtrue解决# 强制关闭 Trivy编辑 env 文件 echo TRIVY_ENABLEDfalse common/config/core/env # 重新生成配置 ./prepare --with-notary --with-clair # 注意此处不加 --with-trivy ./install.sh4.4 现象docker logs harbor-jobservice持续刷failed to connect to redis: dial tcp 172.18.0.3:6379: connect: connection refused原因harbor-redis容器启动慢于harbor-jobservice后者启动时 Redis 未就绪且 jobservice 无重试机制解决# 编辑 harbor.yml增加 jobservice 启动延迟 jobservice: # 添加以下两行 start_delay: 30 max_job_workers: 10 ./prepare ./install.sh4.5 现象上传镜像时卡在Pushed后无响应docker logs harbor-registry显示error authorizing context: authorization token required原因harbor-registry容器的REGISTRY_AUTH_TOKEN_REALM环境变量指向的 URL如https://harbor.example.com/service/token无法被容器内 curl 访问因该域名未在harbor.yml的external_url中正确配置解决# 检查 external_url 是否以 https:// 开头且与 hostname 一致 grep external_url\|hostname harbor.yml # 若为 http:// 或域名不匹配修正后重做 ./prepare docker restart harbor-registry5. 生产级加固从离线包出发构建可审计、可回滚、可监控的 Harbor 实例离线包解决了“能不能跑”但生产环境要的是“跑得稳、出事快定位、升级不中断”。v2.5.0-rc1 提供了基础但需手动补全三类能力配置版本化、健康状态外推、滚动升级通道。以下是我给某跨平台系统交付时固化下来的六个动作全部基于离线包原生能力无需额外工具。5.1 配置即代码用 git 管理 harbor.yml 变更而非直接编辑Harbor 2.5 的prepare脚本支持--input-harbor-yml参数允许指定任意路径的配置文件。这意味着你可以将harbor.yml纳入 Git 仓库并通过 tag 管理版本# 初始化配置仓库 git init harbor-configs cd harbor-configs cp /path/to/harbor/harbor.yml . git add harbor.yml git commit -m v2.5.0-rc1 base config # 后续每次变更如修改 hostname vi harbor.yml git commit -am update hostname to harbor-prod.internal # 部署时指定配置 /path/to/harbor/prepare --input-harbor-yml ./harbor.yml /path/to/harbor/install.sh关键收益当某次install.sh后 Harbor 异常只需git checkout HEAD~1回退配置./prepare ./install.sh即可秒级回滚。某次因误配https_only: true导致 HTTP 访问全断靠此法 2 分钟恢复。5.2 健康检查外推用 Prometheus 抓取 Harbor 自身指标不依赖黑盒探测Harbor 2.5 内置/api/v2.0/systeminfo和/metrics端点但默认不暴露。需在harbor.yml中显式开启# harbor.yml 中添加 metric: enabled: true port: 9999 path: /metrics然后配置 Prometheus job# prometheus.yml - job_name: harbor static_configs: - targets: [harbor-host-ip:9999] metrics_path: /metrics实测指标价值harbor_registry_storage_used_bytes可预警磁盘满harbor_core_http_request_duration_seconds_count{code500}突增直接定位 core 故障harbor_jobservice_queue_length 100 说明扫描任务积压。这些比curl -I https://h.host/api/health的 200 更早发现问题。5.3 滚动升级通道利用离线包的多版本共存特性实现零停机升级v2.5.0-rc1 离线包设计支持“同主机多实例”。例如你可同时解压harbor-offline-installer-v2.5.0-rc1.tgz和harbor-offline-installer-v2.5.0.tgz到不同目录用不同端口运行# v2.5.0-rc1 运行在 443/80 cd /opt/harbor-rc1 ./install.sh # v2.5.0 正式版运行在 8443/8080修改 harbor.yml 中 https.port8443, http.port8080 cd /opt/harbor-stable ./install.sh # 用 Nginx 做流量切换 upstream harbor_backend { server 127.0.0.1:443; # 当前生产 # server 127.0.0.1:8443; # 注释掉即切到新版本 }操作纪律每次升级前先在/opt/harbor-stable目录下执行./prepare ./install.sh确认新实例docker ps全绿、curl -k https://localhost:8443/api/v2.0/systeminfo返回正常再切 Nginx upstream。从那以后我每次升级 Harbor都强制走一遍这个双实例验证流程——哪怕只是小版本补丁也绝不直改生产配置。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询