
简介面向企业级容器镜像管理场景这份ARM架构的Harbor 2.7.0离线安装包适用于需要在内网或离线环境快速部署私有镜像仓库的运维与开发人员。Harbor本身支持基于角色的访问控制、审计日志、镜像复制与同步等能力可满足企业对镜像安全存储和分发的合规要求。整个包体共有六个文件以安装脚本、镜像压缩包、许可文件、预处理脚本及配置模板为主整体大小约705MB覆盖离线部署所需完整组件。目前已有一百五十人学习浏览适合作为生产环境搭建参考。借助该压缩包读者可在ARM平台完成Harbor快速初始化与配置通过内置脚本和模板调整存储后端、访问策略及复制规则从而构建高可用的私有镜像分发体系并体验镜像签名与验证等安全增强功能。安装脚本与预处理脚本覆盖从环境检查到服务启动的关键步骤便于直接复用缩短部署周期。 拿harbor-offline-installer-v2.7.0-arm64.tar.gz这个文件名来说我第一反应就知道又有人要在 ARM 服务器上离线装 Harbor 了。这东西看着就是一个普通的压缩包但里面牵扯到架构选型、离线依赖、HTTPS 证书、Docker Compose 版本这些坑踩一圈下来能耽误半天。这篇就把我实际部署的经验拆开讲清楚从解压 tar.gz 到装完用起来每一步该干什么、为什么要这么干全部落地。适合刚接触 Harbor、手头正好是一台 ARM64 机器或者打算在内网离线环境里搭镜像仓库的运维和开发同学参考。1. 先搞懂这个安装包arm64离线包与在线包的本质区别1.1 arm64和amd64别选错Harbor 官方发布页上同时提供 amd64 和 arm64 两种离线安装包文件名结尾差异就是amd64或arm64。代价是如果你在 x86 服务器上解压了 arm64 包前面几步看起来一切正常但install.sh一执行就废了——docker load进去的镜像全是 ARM 指令集容器一启动直接报exec format error。反过来也一样arm64 机器千万别图省事拿 amd64 包装。判断你服务器架构最稳的命令是uname -mx86_64 的机器用 x86_64 包aarch64输出就选 arm64。顺带说一句aarch64就是 ARM64 的另一种叫法很多软件包内部写的linux/arm64跟uname -m显示aarch64是一回事别被绕晕。1.2 离线安装包里装了什么下载下来是一个 tar.gz 压缩包离线包和在线包的核心区别在于在线包只带脚本安装时现场从网上下载镜像离线包则把所有组件的 Docker 镜像打成一个 tar 包连同编排脚本一起放进压缩包里。harbor 离线安装包解压后核心是下面几个东西harbor.yml.tmpl install.sh common.sh docker-compose.yml harbor.v2.7.0.tar.gz其中harbor.v2.7.0.tar.gz就是全部镜像的集合包包含 harbor-core、harbor-portal、harbor-registry、harbor-db、harbor-redis、harbor-jobservice、harbor-log 和 nginx 代理这几个组件。内网环境装 Harbor离线包就是唯一靠谱的选择因为在线包在无外网环境里根本没有用。2. 环境准备Ubuntu 22.04上的Docker与Compose2.1 Docker安装Harbor 跑在 Docker 上第一步先把 Docker 装好。如果机器本身就在内网最省事的思路是从内网 apt 源装系统自带的 docker.iosudo apt update sudo apt install -y docker.io sudo systemctl enable --now dockerUbuntu 22.04 的软件源里 docker.io 版本足够新装完不用额外折腾。装完验证一下 Docker 能否执行docker version重点看 server 端有没有起来只看到 client 信息就说明 daemon 没启动。顺便把当前用户加入 docker 组免掉每次敲 sudosudo usermod -aG docker $(whoami)加了组之后记得重新登录一次才生效这个细节经常漏。2.2 Compose版本别踩坑Harbor 2.x 用的是 docker compose 编排install.sh 启动时会先探测docker-compose命令或docker compose插件。Ubuntu 上最容易出现的情况是Docker 装了但 compose 没装最后 install.sh 报个docker-compose not found。推荐直接装 Docker Compose V2 插件sudo apt install -y docker-compose-v2 docker compose version装好之后注意Harbor install.sh 里两种写法都能识别。如果你之前用过旧版的docker-composeV1建议统一换成 V2后面改配置重新启动时少踩命令名不存在的坑。2.3 磁盘和内存的硬指标很多人忽略这一点离线安装包看着可能不到 1GB但docker load加载完镜像后实际占用磁盘空间是好几倍。再加上镜像仓库里的数据目录我建议内存至少 4GBHarbor 全组件跑起来core、db、redis、registry 加起来轻松吃掉 2GB 以上。/根分区或 data_volume 所在分区预留 50GB 以上镜像仓库是长期占磁盘的。解压前先用df -h看一眼确认不是只剩一两个 GB。磁盘不够时docker load会报no space left on device但问题往往在报错前就已经开始坏事了——镜像写到一半剩余镜像全部作废只能清空间再重来。3. 解压与配置harbor.yml的核心改动点3.1 解压命令和文件结构tar.gz 解压命令就是下面这句tar -zxf harbor-offline-installer-v2.7.0-arm64.tar.gz-z表示解压 gzip 压缩-x解压-f指定文件。其实现在 GNU tar 能自动识别压缩格式写成tar -xf也一样但步骤里明确用-zxf更容易让新手理解。解压后的目录里没有现成的harbor.yml只有harbor.yml.tmpl模板第一次安装要把模板复制成配置文件再改cd harbor cp harbor.yml.tmpl harbor.yml3.2 必改的五个配置项打开 harbor.yml 后生产环境下我建议至少改这几处。第一是hostname默认是reg.mydomain.com要改成这台机器的 IP 或你规划好的域名比如192.168.1.100或harbor.local。这个值会写进镜像地址前缀客户端 push/pull 时用的是它不要在装完后再频繁换。第二是http.port默认 80。如果 80 端口已经被别的服务占用先改到 8080 之类再启动否则 nginx 容器起不来。改完之后访问地址要带端口。第三是https配置段。默认模板里这段是被注释掉的生产环境建议启用这就是下一节的内容。测试环境想快速跑通就保留注释只走 HTTP。第四是harbor_admin_passwordHarbor 内置管理员admin的初始密码模板里是默认值Harbor12345装完就能登录强烈建议改成强密码。第五是data_volume默认/data这是镜像、数据库、缓存等持久化数据的存放目录。建议改成独立挂载盘路径比如/opt/harbor-data避免和系统盘挤在一起。改动时要确保目录存在并且有写权限。3.3 离线环境下的密码管理harbor.yml 里除了 admin 密码还有database.password和 redis 相关密码。这个database.password是 Harbor 内部 Postgres 数据库的连接密码安装时会把postgresql容器里数据库的密码改成它。很多人装完就忘了要备份数据库脚本或做数据迁移时才发现找不到密码建议统一记录到密码管理工具里。另外一个容易忽略的地方如果服务器上已经装过一次 Harbor再次./install.sh时如果 harbor.yml 里改了数据库密码可能导致旧数据连不上。所以前期规划好密码后面不要频繁动。4. 从HTTP切到HTTPS证书方案与harbor.yml联动4.1 为什么默认是HTTP生产环境必须改Harbor 模板默认开 HTTP是为了让试用环境最短路径跑通。但镜像仓库传输的是项目交付物和生产数据明文 HTTP 在内网里也可能被截获或篡改。更重要的是Docker 客户端在非可信环境下对这个非常敏感后续如果要用镜像复制、对接外部系统HTTPS 证书反而是最省事的信任基础。方案上无外乎三种用内部 CA 签发的证书、用公网信任的证书、自签证书。内网环境最常见是自签证书只要把自签 CA 分发给所有客户端效果等价于受信任 CA。4.2 自签证书生成完整步骤先建一个证书目录我在生产环境一般放在/data/cert或/opt/harbor/certmkdir -p /data/cert cd /data/cert生成 CA 私钥和 CA 根证书openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj /CNharbor-ca \ -key ca.key -out ca.crt生成 Harbor 服务器的私钥和证书签名请求openssl genrsa -out harbor.key 4096 openssl req -new -sha512 \ -subj /CN192.168.1.100 \ -key harbor.key -out harbor.csr注意这里的CN和后面的扩展要跟你浏览器访问的地址一致。因为计划用 IP 访问我写了 IP如果走域名就要写域名。接着添加扩展信息让证书支持 IP 或域名访问这步漏了会非常坑很多同学生成证书后访问报IP SAN错误就是因为没这步cat ext.cnf EOF subjectAltName IP:192.168.1.100, DNS:harbor.local EOF用 CA 签署服务器证书openssl x509 -req -sha512 -days 3650 \ -in harbor.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -out harbor.crt -extfile ext.cnf最终目录里保留ca.crt、harbor.crt、harbor.key三个文件。然后修改 harbor.yml把 https 段打开https: port: 443 certificate: /data/cert/harbor.crt private_key: /data/cert/harbor.key4.3 客户端证书信任Docker和浏览器两条路Harbor 服务端上了自签 HTTPS客户端 Docker 默认不认。最规范的做法是把自签 CA 放到客户端的 Docker 证书目录里mkdir -p /etc/docker/certs.d/192.168.1.100 cp /data/cert/ca.crt /etc/docker/certs.d/192.168.1.100/ca.crt systemctl restart docker这样 Docker 在访问192.168.1.100这个仓库地址时会直接信任 ca.crt 签发的证书不需要把整个 harbor 地址列入 insecure-registries。如果不想每台客户端都拷贝证书也可以给 Docker daemon 配置{ insecure-registries: [192.168.1.100] }但 insecure-registries 等于跳过证书校验同时 Docker 会优先尝试 HTTP跟 HTTPS 服务端的配合反而容易出问题。能分发证书就分证书后者只是兜底方案。浏览器访问也一样把ca.crt导入系统信任区后就不会再出现大红叉警告页。5. 执行install.sh离线镜像装载与容器编排的完整过程5.1 docker load的耗时与磁盘变化一切配置就绪后执行安装sudo ./install.shinstall.sh 的第一步会把包内镜像 tar 导入本地 Dockerdocker load -i harbor.v2.7.0.tar.gz这一步是纯 IO 密集操作输出会滚动显示Loaded image: ...。在 ARM 服务器上这一步耗时不短几百 MB 的压缩包解出来几个 GB 的镜像机械盘上可能得等十几分钟。这段时间如果 SSH 掉线建议用screen或tmux包一层别让任务被中断。导入完成后docker images能看到一堆goharbor/开头的镜像每一条的架构都是 arm64。5.2 prepare和docker compose upinstall.sh 随后会执行 prepare 脚本作用是读取 harbor.yml把 nginx、core、jobservice 等组件的配置模板渲染成正式配置写入/opt/harbor下的对应目录。配置写错、证书路径不对、hostname 填了非法字符串都会在 prepare 阶段暴雷。prepare 通过后就到了容器启动阶段docker compose up -d取决于磁盘速度拉起来需要一两分钟。启动完成后立刻确认容器状态docker compose ps正常状态应该是所有服务都为running只有harbor-log这类日志容器可能处于running状态但内部进程实时写文件这属于正常现象。5.3 启动后的验证清单容器全部 running 不代表已经就绪还要按这个顺序确认浏览器访问https://192.168.1.100能看到 Harbor 登录页用admin和配置的密码登录。在命令行验证本地能登录仓库docker login 192.168.1.100 -u admin -p 你的密码上传一个测试镜像验证推拉链路。建议把docker compose ps的完整状态和docker logs harbor-core里有无异常日志作为验收记录后面排查问题有据可依。6. arm64环境实战排查从错误日志到根因6.1 最常见的三种报错第一是exec format error。容器一启动就退出docker logs里看到一段exec /bin/sh: exec format error根因就是镜像架构和宿主机不匹配。排查链路是这样先uname -m确认本机是aarch64再docker inspect 镜像名看Architecture字段是arm64还是amd64。如果包下错了需要重新下载对应架构的离线包整个docker load过程重来。第二是manifest unknown或no matching manifest for linux/amd64。这种通常不是安装环节报错而是客户端从仓库拉镜像时出现表示客户端架构请求和仓库里的镜像清单对不上。解决办法是给需要的平台打多架构镜像或者单独推送对应架构的镜像。第三是 harbor-core 或 harbor-db 容器反复重启。别急着删容器先执行docker logs --tail 200 harbor-db docker logs --tail 200 harbor-core数据库密码不对、数据目录权限不对、redis 连接失败基本都会在这两层日志里体现。把日志贴到排查群里通常比盲试快得多。6.2 端口和数据目录冲突Harbor 的 nginx 容器要监听 80/443。如果机器上已有 Web 服务占了端口docker compose up 阶段会报端口绑定失败容器启动不了。排查ss -lntp | grep -E :80|:443有占用就先改 harbor.yml 的http.port和https.port改完重新./install.sh让它重新 prepare。数据目录冲突则隐蔽得多。如果你之前用/data做过别的存储Harbor 会把/data/database、/data/registry等子目录建在里面和旧数据混在一起。所以 data_volume 一定要用独立目录不要图省事指到根下。6.3 用QEMU模拟arm64的忠告有些场景手头没有 arm64 真机想用 QEMU 在 x86 上模拟 ARM64 环境来跑这个离线包。技术上binfmt_misc加qemu-aarch64用户态模拟确实能让容器跑起来但 Harbor 组件多、镜像大QEMU 模拟的 IO 和 CPU 开销非常高我实测下来经常出现 harbor-core 启动超时、数据库初始化卡死、登录页转圈的问题。我的建议很直接Harbor 的 arm64 包就老老实实用在真机或者同架构云主机上别拿 QEMU 模拟环境做部署验收。模拟环境只适合验证文件解压、harbor.yml 语法这类前置步骤不具备生产参考价值。另外提醒一句在 ARM 架构的虚拟机里可以正常部署这个离线包前提是虚拟机本身就是 arm64 系统不要再套一层模拟转换。最后再分享一个实际操作中的小经验不管装哪个版本安装前把install.sh的输出从头到尾留一份日志sudo ./install.sh 21 | tee /var/log/harbor-install.log后面无论出什么问题翻日志都比重新执行一遍 install.sh 靠谱。镜像仓库这类基础设施装完一次能用很久前期花半小时把架构、证书、存储目录这些底子打扎实比后面反复折腾要值得多。本文还有配套的精品资源点击获取