简介本资源为面向国产化ARM架构环境的Harbor容器镜像仓库离线部署包适用于在信创服务器、麒麟/统信等国产操作系统上搭建私有镜像仓库的运维与DevOps人员。包内共6个文件以Shell安装脚本、配置模板、离线镜像压缩包及许可证文件为主涵盖一键安装、参数配置与镜像导入等环节压缩包整体约650MB可满足无外网环境下的完整部署需求。目前已有98人学习下载适合需要快速落地ARM平台Harbor服务的技术人员参考。借助该离线安装包读者可省去逐一下载依赖组件的繁琐过程直接完成Harbor v2.10.2的安装与初始化并依据配置模板调整端口、存储与认证等关键参数为后续镜像推送、权限管理和高可用扩展打下基础。1. 拿到 harbor-offline-installer-aarch64-v2.10.2.tgz 之后它到底解决什么场景如果你手里正好有一台鲲鹏、飞腾或者银河麒麟的 ARM 服务器又恰好被要求在内网里搭一套能推拉镜像的私有仓库那你大概率会搜到harbor-offline-installer-aarch64-v2.10.2.tgz这个包。它不是一个普通压缩包而是 Harbor 官方为 aarch64 架构准备的离线安装器——把镜像、compose 模板、配置脚本全打包在一起解压后一条命令就能起一套带 RBAC、镜像扫描、复制策略的企业级 registry。适合谁适合那些内网机器不能出公网、CPU 是 ARM 而不是 x86、又不想自己从零编译每个组件的运维或平台工程师。我见过太多人在 x86 上装 Harbor 很顺一换到 aarch64 就卡在镜像拉不下来或者组件起不来这个包就是给这种场景准备的后悔药。2. 拆包看结构离线安装器里到底装了什么2.1 解压后先别急着 install看清目录再动手拿到 tgz 之后第一件事不是tar -zxvf然后无脑./install.sh而是先看清楚里面有什么。这个包的结构和 x86 版本基本一致但镜像架构不同所以目录里的镜像 tar 包是 aarch64 的。常见做法是解压到一个独立目录比如/opt/harbor-offline然后进去看harbor子目录和prepare脚本。# 创建独立目录避免和已有 harbor 混淆 mkdir -p /opt/harbor-offline tar -zxvf harbor-offline-installer-aarch64-v2.10.2.tgz -C /opt/harbor-offline cd /opt/harbor-offline/harbor # 看目录结构确认镜像包和配置模板都在 ls -lh # 典型输出 # harbor.v2.10.2.tar.gz 镜像包aarch64 架构 # harbor.yml.tmpl 配置模板 # prepare 预处理脚本生成最终 compose 和配置 # install.sh 安装入口 # common.sh 公共函数逻辑说明harbor.v2.10.2.tar.gz是真正的镜像集合里面每个组件的镜像都是linux/arm64的这是和 x86 包最本质的区别。harbor.yml.tmpl是模板prepare会读取你改好的harbor.yml生成docker-compose.yml。参数上解压目录建议放在数据盘而不是系统盘因为后面镜像层会占不少空间默认/data是 Harbor 的数据根目录可以在harbor.yml里改。2.2 镜像包里的组件清单和版本对应关系这个离线包里的镜像不是随便凑的每个组件版本都和 Harbor v2.10.2 绑定。常见组件包括harbor-core、harbor-portal、harbor-jobservice、harbor-registry、harbor-dbPostgreSQL、harbor-redis、harbor-trivy扫描器、nginx前端代理。在 aarch64 上这些镜像必须全部是 arm64 构建否则docker load之后docker run会直接报exec format error。# 先看镜像包内容确认架构标签 tar -tzf harbor.v2.10.2.tar.gz | head -20 # 输出里会看到类似 # harbor-core:v2.10.2 # harbor-portal:v2.10.2 # ... # 加载镜像到本地 docker docker load -i harbor.v2.10.2.tar.gz # 加载后检查镜像架构必须是 arm64 docker inspect harbor-core:v2.10.2 --format {{.Architecture}} # 期望输出arm64逻辑说明docker load会把所有镜像导入本地这一步在离线环境里是必须的因为install.sh不会去外网拉。参数上--format {{.Architecture}}是快速验证架构的方法如果输出amd64说明你拿错包了。注意有些环境里 docker 的默认存储驱动是overlay2aarch64 上一般没问题但如果内核太老可能需要确认。2.3 配置 harbor.ymlhostname、数据目录和 HTTPS 的取舍harbor.yml是唯一需要你手动改的文件。最关键的三个参数hostname、data_volume、harbor_admin_password。hostname必须是你实际访问的 IP 或域名不能写localhost否则客户端推镜像时会解析失败。data_volume默认/data如果系统盘小就改到大盘。HTTPS 部分内网测试可以先注释掉https块只用 HTTP但生产环境建议配证书。# harbor.yml 关键片段 hostname: 192.168.1.100 # 改成你的 ARM 服务器 IP http: port: 80 # https: # port: 443 # certificate: /your/cert.crt # private_key: /your/cert.key harbor_admin_password: Harbor12345 # 首次登录后立刻改 data_volume: /data database: password: root123 # 内部数据库密码别用默认逻辑说明hostname决定客户端docker login的地址写错就是no such host。data_volume是镜像和数据库的落盘位置aarch64 服务器如果挂载了独立数据盘改这里最省事。harbor_admin_password是 admin 初始密码只在第一次初始化时生效后面改密码要在 UI 里操作。HTTPS 如果暂时不配客户端需要加insecure-registries这是后面避坑章节要讲的。3. 在 aarch64 上跑 install.sh从 prepare 到容器全绿3.1 先跑 prepare 再 install别跳步很多人直接./install.sh结果报错说docker-compose.yml不存在。正确顺序是先./prepare它会根据harbor.yml生成docker-compose.yml和一堆配置文件然后再./install.sh。prepare还会检查端口占用、目录权限、docker 版本。# 在 harbor 目录下执行 ./prepare # 输出会显示生成的文件和检查结果 # 如果报错通常是端口被占或目录权限不对 # 确认 docker-compose.yml 已生成 ls -l docker-compose.yml # 然后执行安装 ./install.sh逻辑说明prepare是幂等的可以反复跑每次都会重新生成配置。install.sh内部会调用docker compose up -d启动所有容器。参数上如果想让安装过程输出更详细可以加--with-trivy之类的选项但 v2.10.2 默认已经包含 trivy不需要额外指定。注意install.sh执行时间取决于机器性能aarch64 上一般 1 到 3 分钟。3.2 验证容器状态和端口监听安装完成后第一件事是docker compose ps看所有容器是不是Up状态然后ss -tlnp看 80 和 443 端口有没有监听。Harbor 的组件比较多任何一个起不来都会导致 UI 打不开。# 查看容器状态 docker compose ps # 期望所有服务都是 Up包括 harbor-core、harbor-db、harbor-redis、nginx 等 # 查看端口监听 ss -tlnp | grep -E :(80|443) # 期望看到 nginx 或 docker-proxy 监听 # 看 harbor-core 日志确认没有报错 docker compose logs harbor-core --tail 50逻辑说明docker compose ps是最直接的检查方式如果有容器是Exit状态就要看对应日志。ss -tlnp确认端口如果 80 没监听可能是 nginx 容器没起来或者端口冲突。harbor-core是核心服务它的日志里如果有database connection failed就是数据库没起来需要先看harbor-db。3.3 登录 UI 并推第一个镜像验证浏览器打开http://192.168.1.100用admin和harbor.yml里的密码登录。然后建一个项目比如test在另一台机器上docker login并推一个 arm64 镜像进去。这一步是最终验证能推能拉才算真正可用。# 在客户端机器上需要是 aarch64 或支持多架构 docker login 192.168.1.100 -u admin -p Harbor12345 # 给本地镜像打 tag docker tag nginx:latest 192.168.1.100/test/nginx:latest # 推送 docker push 192.168.1.100/test/nginx:latest # 拉取验证 docker pull 192.168.1.100/test/nginx:latest逻辑说明docker login如果报http: server gave HTTP response to HTTPS client说明客户端默认走 HTTPS而 Harbor 配的是 HTTP需要在客户端/etc/docker/daemon.json里加insecure-registries。docker tag的格式是hostname/项目名/镜像名:标签项目名必须先在 UI 里创建。推送成功后在 UI 的test项目里能看到镜像说明整个链路通了。4. 避坑与排查aarch64 离线安装最容易翻车的五个点4.1 现象docker load 后运行报 exec format error原因镜像包不是 aarch64 的或者你拿的是 x86 的包在 ARM 上跑。解决用docker inspect确认Architecture是arm64不是就重新下载正确的包。另外有些环境里docker load不会覆盖已有同名镜像先docker rmi再 load。4.2 现象install.sh 卡在 pulling 或者报 no such image原因install.sh试图从外网拉镜像但离线环境没网。解决确认harbor.v2.10.2.tar.gz已经docker load成功并且docker images里能看到所有组件。如果prepare生成的 compose 文件里镜像名带了 registry 前缀检查harbor.yml里有没有多余的registry配置。4.3 现象UI 能打开但推镜像 401 或 403原因docker login没成功或者项目权限不对。解决先确认docker login返回Login Succeeded如果报证书错误就加insecure-registries。然后确认推的用户对目标项目有读写权限admin 默认有全部权限普通用户需要在项目里加成员。4.4 现象harbor-db 容器反复重启原因数据目录权限不对或者 PostgreSQL 版本和已有数据不兼容。解决看docker compose logs harbor-db如果是permission denied把data_volume目录权限改成999:999PostgreSQL 容器内用户。如果是版本问题清空数据目录重新初始化。4.5 现象aarch64 上 trivy 扫描器起不来原因trivy 的镜像架构不对或者漏洞库下载失败。解决确认harbor-trivy镜像是 arm64离线环境下 trivy 需要预先下载漏洞库可以在有网机器上trivy image --download-db-only然后拷贝到离线环境。如果不需要扫描可以在harbor.yml里把trivy设为enabled: false。5. 进阶把 Harbor 做成内网多架构镜像中转站5.1 用复制策略打通多个 Harbor 实例Harbor 自带复制功能可以在两个实例之间同步镜像。常见做法是一个在 ARM 内网一个在 x86 测试区通过 push-based 复制把 ARM 构建的镜像推到 x86 区做验证。配置在 UI 的Registries里加目标实例然后在Replications里建规则过滤项目名。# 复制规则示例UI 里填这里用 YAML 示意 name: arm-to-x86 src_registry: local dest_registry: x86-harbor dest_namespace: library trigger: type: manual # 或 scheduled filters: - type: name value: test/**逻辑说明dest_registry需要先在Registries里配好填目标 Harbor 的地址和账号。filters用name匹配项目test/**表示test项目下所有镜像。触发方式可以手动也可以定时定时用 cron 表达式。注意复制是单向的反向需要另建规则。5.2 用 API 批量清理旧镜像释放空间Harbor 的存储会随着镜像增多而膨胀定期清理是必须的。UI 里有垃圾回收但更灵活的是用 API。先列出所有仓库再按标签删除最后触发 GC。# 列出项目下的仓库 curl -u admin:Harbor12345 -X GET http://192.168.1.100/api/v2.0/projects/test/repositories?page_size100 # 删除某个标签假设仓库名是 nginx标签是 old curl -u admin:Harbor12345 -X DELETE http://192.168.1.100/api/v2.0/projects/test/repositories/nginx/artifacts/old # 触发垃圾回收 curl -u admin:Harbor12345 -X POST http://192.168.1.100/api/v2.0/system/gc/schedule -H Content-Type: application/json -d {schedule:{type:Manual}}逻辑说明第一个接口返回仓库列表page_size控制每页数量。第二个接口删除指定 artifactold是标签名。第三个接口触发 GCtype: Manual表示立即执行。参数上GC 会删除没有被任何标签引用的 blob执行期间 Harbor 会只读建议在低峰期做。我一般会先跑一次dry-run确认要删的量再正式执行。从那以后我每次拿到离线包都先docker inspect确认架构再prepare看配置最后才install这三步走完基本不会翻车。希望帮到你。本文还有配套的精品资源点击获取