arm64离线部署Harbor 2.13.1:生产环境实战指南

📅 发布时间:2026/9/29 13:52:48
arm64离线部署Harbor 2.13.1:生产环境实战指南
简介本资源为面向 ARM 架构服务器环境的 Harbor 2.13.1 离线安装包适合在国产化平台、ARM 服务器或内网隔离场景下部署私有镜像仓库的运维与 DevOps 人员使用。压缩包共包含 6 个文件以 sh 安装脚本、gz 镜像归档、license 许可文件、prepare 预检脚本及 tmpl 配置模板为主整体约 513.28MB覆盖从环境校验、配置生成到服务安装的完整离线部署链路无需联网即可完成组件拉取与初始化。目前已有 414 人学习下载说明该版本在 ARM 场景下具备一定参考价值。借助包内脚本与模板读者可快速搭建 Harbor 私有仓库理解离线安装流程、配置项含义及常见部署要点减少因网络受限或架构差异带来的调试成本适合需要落地 ARM 环境镜像管理的技术人员参考使用。1. arm64 上装 Harbor 2.13.1为什么离线包才是生产环境的正解在国产化替代和信创项目里arm64 服务器已经不是什么新鲜事鲲鹏、飞腾、Ampere 这些机器一批批进机房随之而来的问题也很具体内网环境没有外网出口怎么把一套完整的镜像仓库搭起来。Harbor 2.13.1 的 arm64 离线安装包harbor-offline-installer-v2.13.1-arm64.tgz就是为这个场景准备的——它把 Harbor 的核心组件镜像、安装脚本、配置模板全部打包在一个压缩包里解压即用不需要在目标机器上拉任何外部镜像。这个方案适合三类人一是要在 arm64 裸金属或虚拟机上部署私有镜像仓库的运维工程师二是做信创交付、需要在客户内网完成部署的实施人员三是想在自己 arm 开发板上跑一套完整 Harbor 做验证的开发者。它解决的核心问题是「无外网 arm64 架构」这两个约束同时存在时的部署难题。很多人第一次拿到这个包会以为解压就能跑实际上从系统准备到最终访问 UI中间有好几个参数和依赖需要提前处理下面按实际落地顺序拆开讲。2. 部署前的系统准备arm64 环境到底要满足什么2.1 硬件与操作系统的最低要求Harbor 2.13.1 对 arm64 环境的要求并不算高但有几个硬性条件必须满足。CPU 至少 2 核内存建议 4GB 起步如果开启 Trivy 镜像扫描功能内存最好给到 8GB因为扫描容器本身比较吃资源。磁盘方面Harbor 的镜像存储会随着推送量增长建议单独挂一块数据盘给/data目录初始 100GB 起步。操作系统层面主流的 arm64 Linux 发行版都能跑包括 Ubuntu 22.04 arm64、CentOS 7 arm64、Kylin V10 arm64、openEuler arm64。内核版本建议 4.19 以上因为 Harbor 依赖的容器运行时对 cgroup v2 的支持在较新内核上更稳定。检查命令很简单uname -m # 期望输出aarch64 cat /etc/os-release # 确认发行版和版本号 free -h # 确认内存不低于 4GB df -h /data # 确认数据盘挂载和剩余空间uname -m返回aarch64是前提如果返回x86_64说明你拿错包了x86 的离线包在 arm 上跑不起来反之亦然。这一点在混合架构机房裡特别容易搞混血泪经验是部署前先确认机器架构别等解压完才发现。2.2 Docker 与 Docker Compose 的 arm64 安装Harbor 2.13.1 的离线安装器依赖 Docker Engine 和 Docker Compose。在 arm64 上安装 Docker 有两种方式一种是用发行版自带的包管理器另一种是用 Docker 官方的 arm64 静态二进制包。内网环境推荐后者因为可以提前下载好离线安装。# 下载 Docker arm64 静态二进制包在有网的机器上操作 # 将 docker-version.tgz 传到目标机器 tar xzvf docker-version.tgz sudo cp docker/* /usr/bin/ # 注册为 systemd 服务 sudo cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Afternetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID LimitNOFILEinfinity LimitNPROCinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker docker versionDocker Compose 在 arm64 上建议用 v2 版本的二进制文件直接放到/usr/local/bin/下即可。注意 Compose v1 的 Python 版本在部分 arm64 发行版上会有依赖问题v2 是 Go 写的静态二进制兼容性更好。# 下载 docker-compose arm64 二进制 sudo cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose docker-compose version参数说明LimitNOFILEinfinity是 Harbor 官方推荐值因为镜像推送时会有大量并发文件句柄Delegateyes让 Docker 自己管理 cgroup避免和 systemd 冲突。这两个参数在 arm64 上同样适用不要因为架构不同就省略。2.3 内核参数与防火墙的调整Harbor 的组件之间通过内部网络通信同时对外暴露 80/443 端口。在 arm64 服务器上需要确认bridge-nf-call-iptables是开启的否则容器网络可能不通cat /etc/sysctl.d/99-harbor.conf EOF net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system防火墙方面如果用的是 firewalld需要放行 Harbor 使用的端口。默认情况下 Harbor 用 80 和 443如果改了端口对应调整firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port443/tcp firewall-cmd --reload如果内网有 SELinux 且处于 enforcing 模式建议先设为 permissive 或按 Harbor 文档添加策略否则容器挂载卷时可能被拒绝。这个坑在 CentOS 系 arm64 上尤其常见现象是 Harbor 容器反复重启日志里报 permission denied。3. 离线包解压与配置harbor.yml 里那几个必改项3.1 解压离线包与目录结构说明拿到harbor-offline-installer-v2.13.1-arm64.tgz之后先确认文件完整性然后解压# 校验文件大小和 md5如果有官方提供的校验值 ls -lh harbor-offline-installer-v2.13.1-arm64.tgz tar xzvf harbor-offline-installer-v2.13.1-arm64.tgz cd harbor ls -l解压后目录里通常包含这些关键文件harbor.yml.tmpl是配置模板install.sh是安装脚本prepare是环境准备脚本common.sh是公共函数库以及一个harbor子目录存放各组件镜像的 tar 包。注意不同版本的文件组织可能略有差异以实际解压结果为准。# 查看镜像 tar 包 ls -lh harbor/*.tar # 这些就是离线安装的核心不需要从外网拉取3.2 harbor.yml 的核心参数逐项配置复制模板并编辑cp harbor.yml.tmpl harbor.yml vim harbor.yml以下是必须关注的参数逐项说明# 主机名或 IP必须和实际访问地址一致 hostname: 192.168.1.100 # HTTP 端口默认 80 http: port: 80 # HTTPS 配置内网如果不需要可以注释掉 # https: # port: 443 # certificate: /your/certificate/path # private_key: /your/private/key/path # Harbor 管理员初始密码 harbor_admin_password: Harbor12345 # 数据库密码生产环境务必修改 database: password: root123 max_idle_conns: 100 max_open_conns: 900 # 数据存储路径 data_volume: /data # Trivy 扫描配置 trivy: ignore_unfixed: false skip_update: false offline_scan: false insecure: false # 日志配置 log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harborhostname这一项是最容易翻车的地方。如果填了主机名但 DNS 解析不到或者填了 IP 但后面用域名访问Harbor 的 UI 会报错docker login 也会失败。我一般建议内网直接用 IP简单直接。data_volume指向的目录要确保有足够空间并且 Docker 有权限写入。harbor_admin_password是初始密码第一次登录后立即改掉。3.3 镜像存储与日志目录的规划data_volume默认是/dataHarbor 会在这个目录下创建database、redis、registry、jobservice等子目录。如果系统盘空间有限一定要在harbor.yml里改成独立数据盘的路径。日志目录log.local.location默认在/var/log/harbor同样建议根据磁盘规划调整。# 提前创建目录并设置权限 mkdir -p /data /var/log/harbor chmod 755 /data /var/log/harbor如果开启了 Trivy 离线扫描还需要提前把漏洞库放到指定位置否则扫描任务会失败。内网环境建议设置trivy.skip_update: true并手动导入漏洞库具体路径参考 Trivy 的离线部署文档。4. 执行安装与验证从 install.sh 到推送第一个镜像4.1 运行安装脚本与过程观察配置改好后执行安装sudo ./install.sh这个脚本会做几件事加载harbor/harbor.*.tar里的镜像到本地 Docker生成 docker-compose 配置文件然后启动所有容器。安装过程中会输出每个组件的启动状态注意观察有没有报错。# 安装完成后检查容器状态 docker-compose -f docker-compose.yml ps # 或者 docker ps --format table {{.Names}}\t{{.Status}}正常情况下会看到harbor-core、harbor-db、harbor-jobservice、harbor-portal、harbor-registry、harbor-redis、nginx、registryctl等容器处于 running 状态。如果有容器反复重启用docker logs container_name看日志。4.2 访问 UI 与 docker login 验证在浏览器打开http://192.168.1.100用admin和配置的密码登录。如果页面打不开先检查 nginx 容器是否正常再检查防火墙和 SELinux。登录成功后在另一台机器上测试 docker login# 如果 Harbor 用的是 HTTP需要在 Docker 配置里加 insecure-registries # 编辑 /etc/docker/daemon.json { insecure-registries: [192.168.1.100] } # 重启 Docker sudo systemctl restart docker # 登录 docker login 192.168.1.100 # 输入用户名 admin 和密码insecure-registries这个配置在 HTTP 场景下必须加否则 docker login 会报http: server gave HTTP response to HTTPS client。生产环境建议配 HTTPS内网测试用 HTTP 加这个配置就够了。4.3 推送和拉取第一个 arm64 镜像验证仓库能正常工作的最好方式是推一个 arm64 镜像进去# 拉一个 arm64 的基础镜像在有网的机器上 docker pull arm64v8/nginx:latest # 打标签指向私有仓库 docker tag arm64v8/nginx:latest 192.168.1.100/library/nginx:arm64 # 推送 docker push 192.168.1.100/library/nginx:arm64 # 在另一台 arm64 机器上拉取 docker pull 192.168.1.100/library/nginx:arm64推送成功后在 Harbor UI 的library项目下应该能看到这个镜像。注意 arm64 镜像和 x86 镜像不能混用如果推了一个 x86 镜像到 arm64 的 Harbor拉取到 arm64 机器上运行时会报exec format error。这是架构不匹配的典型现象不是 Harbor 的问题。5. 避坑与排查arm64 离线部署 Harbor 的五个真实翻车点5.1 容器启动后 Harbor UI 报 502现象浏览器访问 Harbor 地址返回 502 Bad Gatewaynginx 容器日志显示 upstream 连接失败。原因通常是harbor-core或harbor-portal容器没有正常启动可能是数据库初始化失败或者配置文件有语法错误。解决先看docker ps -a确认哪些容器退出了然后docker logs harbor-core看具体报错。常见的是harbor.yml里database.password有特殊字符导致解析失败或者data_volume目录权限不对。把配置改对后执行docker-compose down -v清理再重新./install.sh。5.2 docker login 报证书错误现象docker login 192.168.1.100报x509: certificate signed by unknown authority或server gave HTTP response to HTTPS client。原因Harbor 配的是 HTTP但 Docker 默认走 HTTPS或者配了自签证书但客户端没信任。解决HTTP 场景在/etc/docker/daemon.json加insecure-registries并重启 Docker。HTTPS 自签场景把 CA 证书放到/etc/docker/certs.d/192.168.1.100/ca.crt重启 Docker。5.3 推送大镜像时 jobservice 容器 OOM现象推送较大镜像时失败harbor-jobservice容器被 OOM Killer 杀掉dmesg里能看到 out of memory 记录。原因arm64 服务器内存不足或者 jobservice 的并发任务数太高。解决增加内存或者在harbor.yml里调低jobservice.max_job_workers默认是 10可以降到 5。同时检查data_volume所在磁盘的 inode 是否耗尽。5.4 Trivy 扫描一直卡在 pending现象镜像推送后触发扫描但扫描任务一直处于 pending 状态不执行也不报错。原因内网环境 Trivy 无法更新漏洞库而skip_update没有设为 true导致扫描器初始化超时。解决在harbor.yml里设置trivy.skip_update: true并手动下载漏洞库放到 Trivy 的缓存目录。或者如果不需要扫描功能直接在安装时用./install.sh --with-trivyfalse跳过。5.5 重启服务器后 Harbor 没有自动拉起现象服务器重启后Harbor 的容器没有自动启动需要手动执行docker-compose up -d。原因Harbor 的容器默认 restart policy 是always但如果 Docker 服务本身没有设置开机自启容器也不会起来。解决systemctl enable docker确保 Docker 开机自启。另外可以写一个 systemd unit 文件来管理 Harbor 的 docker-compose 启停比手动执行更可靠。6. 进阶技巧用 harbor.yml 调优 arm64 下的并发与存储Harbor 在 arm64 上的性能调优核心就两个方向并发处理和存储后端。默认配置是给通用场景用的实际在生产环境跑起来根据硬件规格调整这几个参数会有明显差别。先说并发。harbor.yml里jobservice.max_job_workers控制同时执行的 job 数量包括镜像复制、扫描、垃圾回收等。在 4 核 8GB 的 arm64 机器上默认值 10 可能偏高容易导致内存紧张在 16 核 32GB 的机器上又可以适当调高到 20。调整后需要重新生成 compose 文件并重启# 修改 harbor.yml 后 sudo ./prepare docker-compose down docker-compose up -d再说存储。Harbor 的 registry 组件支持多种存储后端默认是本地文件系统。如果镜像量大本地存储的垃圾回收会越来越慢。有条件的话可以接 S3 兼容对象存储在harbor.yml里配置storage_servicestorage_service: s3: accesskey: your_access_key secretkey: your_secret_key region: us-west-1 bucket: harbor-registry endpoint: http://minio.example.com insecure: falsearm64 环境下用 MinIO 做后端是个常见组合MinIO 本身也有 arm64 版本可以跑在同一台机器或者独立存储节点上。注意insecure参数如果 MinIO 用的是 HTTP 就设为 trueHTTPS 则设为 false 并确保证书被信任。还有一个容易被忽略的点是日志轮转。harbor.yml里log.local.rotate_count默认 50rotate_size默认 200M。在高频推送的场景下日志增长很快建议把rotate_size降到 50Mrotate_count保持 50这样单个日志文件不会太大排查问题时也方便打开。最后说一个验证调优效果的方法用docker push连续推 20 个不同 tag 的镜像观察docker stats里各容器的内存和 CPU 占用同时看 Harbor UI 的日志有没有超时或重试。如果 jobservice 内存持续接近上限就调低max_job_workers如果 registry 的 CPU 打满但推送速度上不去考虑换存储后端或者加 SSD。我自己在 arm64 上部署 Harbor 的习惯是先把harbor.yml里所有默认密码改掉data_volume指到独立盘trivy.skip_update设 true然后跑一遍完整的推送拉取流程验证。这套流程走下来后面基本不会出大问题。希望帮到你。本文还有配套的精品资源点击获取