☰
ARM服务器离线部署Harbor 2.4.0:避坑指南与实战验证
2026/10/28 11:25:36 网站建设 项目流程

简介:面向需要在 ARM 架构服务器上私有化部署容器镜像仓库的运维与开发人员,这份资源提供 Harbor v2.4.0 的离线安装包,可解决内网或受限网络环境下无法在线拉取镜像、依赖安装繁琐的问题。压缩包共 6 个文件,约 402.34MB,以 sh 安装与辅助脚本、gz 镜像归档、yml 配置文件为主,另含 license 与 prepare 等配套文件,覆盖从环境准备到服务启动的完整链路,适合具备 Docker 与 docker-compose 基础的读者使用。已有 1578 人学习下载,说明该版本在 ARM 场景下具有较高的参考与复用价值。读者可据此在离线环境中完成 Harbor 的一键安装,借助配置模板调整端口、存储与认证参数,并参考脚本逻辑理解安装流程与常见依赖处理方式,减少自行拼装组件的时间成本。

1. 一次在 ARM 服务器上装 Harbor 2.4.0 的翻车记录

上周帮一个做图像处理 Demo 的团队在 ARM 服务器上部署镜像仓库,机器是内网环境,连不上外网,只能走离线安装。我一开始觉得 Harbor 2.4.0 的离线包解压、改配置、跑 install.sh 就完事了,结果第一次执行就卡在镜像加载阶段,报了一堆exec format error。后来才发现,他们下载的是 x86 的离线包,而机器是 ARM 架构。这个坑其实很常见:Harbor 官方从 2.x 开始提供多架构镜像,但离线安装包是按架构分开的,ARM 版和 x86 版文件名不同,下载时稍不留神就拿错。Harbor 作为企业级镜像仓库,装不好会直接影响 CI/CD 流水线拉取镜像,轻则构建卡住,重则整个发布链路停摆。这篇笔记面向的是需要在 ARM 服务器上离线部署 Harbor 2.4.0 的开发者,尤其是内网环境、无法直接拉取公网镜像的场景。我会把版本选择、依赖准备、离线包安装、配置调整、验证跑通和常见翻车点按顺序写清楚,照着走能少走不少弯路。

2. 装前把环境和版本对齐:ARM 架构下的依赖清单

2.1 确认 CPU 架构和操作系统版本

在 ARM 服务器上装 Harbor,第一步不是下载安装包,而是确认机器到底是什么架构、什么系统。很多人拿到服务器就直接开干,结果装到一半发现是 aarch64 而不是 armv7,或者系统是 CentOS 7 但内核版本太低,Docker 跑不起来。我一般会先跑三条命令把底细摸清:

# 确认 CPU 架构,aarch64 表示 64 位 ARM uname -m # 查看操作系统发行版和版本号 cat /etc/os-release # 查看内核版本,Harbor 2.4.0 建议内核 4.x 以上 uname -r

uname -m输出aarch64说明是 64 位 ARM,这是 Harbor 2.4.0 ARM 离线包支持的目标架构;如果输出armv7l,那官方离线包基本跑不了,得考虑换机器或自行构建镜像。/etc/os-release里重点看ID和VERSION_ID,常见做法是 Ubuntu 18.04/20.04 或 CentOS 7/8,这几个系统上 Docker 和 Docker Compose 的安装路径比较成熟。内核版本低于 4.x 的话,Docker 的 overlay2 存储驱动可能有问题,建议先升级内核再往下走。

2.2 Docker 与 Docker Compose 的版本取舍

Harbor 2.4.0 的离线安装依赖 Docker 和 Docker Compose,版本不能太旧也不能太新。官方安装脚本里对 Docker 的要求是 17.06 以上,Docker Compose 要求 1.18.0 以上。但在 ARM 上,Docker Compose 的安装方式和 x86 略有不同,很多人在这里踩坑。我一般会锁定 Docker 20.10.x 和 Docker Compose 1.29.x 这个组合,在 ARM 上验证过比较稳。

# 安装 Docker(以 Ubuntu 为例,CentOS 用 yum 替换 apt) sudo apt-get update sudo apt-get install -y docker.io # 确认 Docker 版本,建议 20.10 以上 docker --version # 下载 Docker Compose 的 ARM 版本二进制 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证 Compose 版本 docker-compose --version

这里的关键点是 Docker Compose 的下载地址里用了$(uname -m),在 ARM 机器上会自动匹配aarch64版本的二进制。如果手动写死 x86_64 的地址,下载下来的二进制在 ARM 上根本执行不了,会报cannot execute binary file。另外,Docker 服务要设置开机自启并确认当前用户有权限操作 Docker,否则后面 install.sh 执行时会因为权限问题失败。常见做法是把当前用户加入 docker 组,然后重新登录生效:

# 将当前用户加入 docker 组,避免每次 sudo sudo usermod -aG docker $USER # 重启 Docker 服务并设置开机自启 sudo systemctl enable docker sudo systemctl restart docker

2.3 离线包下载与校验:别拿错架构

Harbor 2.4.0 的离线安装包在官方发布页有两个版本:harbor-offline-installer-v2.4.0.tgz是 x86 的,ARM 版的文件名里会带arm标识。下载时一定要看清,拿错了就是开头说的exec format error。下载完成后建议做一次校验,确认包完整:

# 解压离线包到指定目录 tar -xzf harbor-offline-installer-v2.4.0-arm.tgz -C /opt/ # 进入解压后的目录 cd /opt/harbor # 查看目录内容,确认有 harbor.yml.tmpl 和 install.sh ls -l

解压后目录里应该有harbor.yml.tmpl、install.sh、prepare等文件。如果解压报错或者文件缺失,说明包下载不完整,重新下载即可。我一般还会用sha256sum对一下官方提供的校验值,虽然多一步,但能避免装到一半发现包损坏的尴尬。

3. 配置 harbor.yml:ARM 环境下最容易写错的几个参数

3.1 从模板生成配置文件

Harbor 2.4.0 解压后没有现成的harbor.yml,只有harbor.yml.tmpl,需要先复制一份再改。这一步很多人直接改模板文件,结果后面升级或重装时模板被覆盖,配置丢了。正确做法是复制成独立文件:

# 从模板复制出实际配置文件 cp harbor.yml.tmpl harbor.yml # 用编辑器打开,逐项修改 vi harbor.yml

配置文件里参数不少,但在 ARM 离线场景下,真正需要动的就那么几项:hostname、http.port、harbor_admin_password、data_volume、database.password,以及可选的https配置。下面逐项说清楚怎么改、为什么这么改。

3.2 hostname 与端口:别写 localhost

hostname是 Harbor 对外提供服务的地址,很多人图省事写localhost或127.0.0.1,结果本机 docker login 能通,其他机器死活连不上。这个参数要写服务器实际的 IP 或者内网域名,客户端会用这个地址去访问仓库。端口方面,http.port默认 80,如果机器上已经有服务占了 80,改成 8080 之类的空闲端口,同时记得防火墙放行。

# 服务器实际 IP,不要写 localhost hostname: 192.168.1.100 # HTTP 端口,80 被占用时改成其他端口 http: port: 8080

改完端口后,客户端登录时要带上端口号,比如docker login 192.168.1.100:8080,不带端口会默认走 443 或 80,连不上。这个细节在文档里不显眼,但实际部署时经常有人卡在这里。

3.3 数据目录与密码:离线环境的存储规划

data_volume是 Harbor 存储镜像数据和数据库文件的根目录,默认/data。离线环境下,如果/data所在分区空间不够,镜像推几个就满了,后面清理很麻烦。我一般会先看磁盘挂载情况,把data_volume指到大容量分区上:

# 查看磁盘空间和挂载点 df -h

假设/opt分区有 500G,那就把data_volume改成/opt/harbor-data,并在安装前手动创建目录、确认权限。密码方面,harbor_admin_password是 admin 用户的初始密码,database.password是内部数据库密码,这两个都要改掉默认值,尤其是内网环境也不能用Harbor12345这种弱密码。

# 数据存储目录,指向大容量分区 data_volume: /opt/harbor-data # admin 初始密码,安装后可在界面修改 harbor_admin_password: YourStrongPass123 # 内部数据库密码 database: password: YourDBPass456

3.4 HTTPS 配置:离线环境可以先跳过

Harbor 默认配置里有一段https配置,需要证书和私钥。内网离线环境如果暂时没有证书,可以把整段https注释掉,只走 HTTP。但要注意,注释掉之后客户端需要配置insecure-registries才能推送镜像,否则 Docker 会拒绝连接非 HTTPS 的仓库。这个取舍在测试环境可以接受,生产环境还是建议配证书。

# 内网测试环境可先注释掉 https 段 # https: # port: 443 # certificate: /your/certificate/path # private_key: /your/private/key/path

注释掉 HTTPS 后,在需要推送镜像的客户端上编辑/etc/docker/daemon.json,加入insecure-registries列表,然后重启 Docker 服务。这一步不做的话,docker push会直接报错,提示仓库不是 HTTPS。

4. 执行安装与避坑:install.sh 跑挂后的排查思路

4.1 运行安装脚本与日志观察

配置改完后,执行install.sh开始安装。这个脚本会做几件事:加载离线包里的镜像、生成 docker-compose 文件、启动容器。整个过程输出不少,建议把日志重定向到文件,方便出问题时回看:

# 执行安装,同时保存日志 sudo ./install.sh 2>&1 | tee install.log

安装成功的标志是最后输出----Harbor has been installed and started successfully.----。如果中途报错,先看日志里最后几行,通常是镜像加载失败、端口被占用或者目录权限问题。ARM 环境下最常见的是镜像加载阶段的exec format error,说明离线包架构不对,回到 2.3 节重新确认包版本。

4.2 常见问题排查:三条血泪记录

现象一:install.sh 执行到加载镜像时卡住或报错no space left on device。原因是/var/lib/docker所在分区空间不足,离线包里的镜像加起来好几个 G,空间不够直接写不进去。解决办法是先df -h看 Docker 数据目录所在分区,清理无用镜像和容器,或者把 Docker 的># 停止并移除容器(保留数据目录) docker-compose down # 备份数据目录 tar -czf harbor-data-backup.tar.gz /opt/harbor-data # 修改配置后重新生成并启动 ./prepare docker-compose up -d

5. 装完怎么验证:从登录到推拉镜像走一遍

安装脚本输出成功后,别急着交付,至少走一遍完整的验证流程,确认仓库真的能用。我一般按「登录 → 建项目 → 推镜像 → 拉镜像」四步走,每一步都能暴露不同层面的问题。

第一步,浏览器访问http://服务器IP:端口,用harbor_admin_password里设的密码登录 admin 账号。能进界面说明 nginx、core、数据库这条链路是通的。如果页面打不开但容器都在跑,检查端口映射和防火墙。

第二步,在界面上新建一个项目,比如test-project,设为私有。这一步验证的是数据库读写和 API 是否正常。

第三步,在另一台能访问服务器的机器上推一个镜像。先docker login,再给本地镜像打 tag、push:

# 登录 Harbor,注意带上端口 docker login 192.168.1.100:8080 -u admin # 给本地镜像打 tag,格式为 仓库地址/项目名/镜像名:标签 docker tag nginx:latest 192.168.1.100:8080/test-project/nginx:v1 # 推送镜像 docker push 192.168.1.100:8080/test-project/nginx:v1

push 成功后在 Harbor 界面的test-project里能看到这个镜像,说明 registry 存储和上传链路正常。如果 push 报unauthorized,检查登录是否成功、项目是否存在;报http: server gave HTTP response to HTTPS client,说明客户端没配insecure-registries,回到 3.4 节处理。

第四步,换一台机器或者删掉本地镜像后重新 pull,确认拉取也正常:

# 删除本地镜像后重新拉取 docker rmi 192.168.1.100:8080/test-project/nginx:v1 docker pull 192.168.1.100:8080/test-project/nginx:v1

四步都走通,这套 Harbor 才算真正装好了。从那以后我每次装完 Harbor,不管安装脚本输出多漂亮,都强制把这四步走一遍——有一次就是脚本显示成功,结果数据库密码里有个特殊字符导致 core 容器反复重启,界面根本打不开,光看脚本输出完全发现不了。希望这套流程帮到你,少在 ARM 离线环境里翻车。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询