ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ARM架构离线部署Harbor v2.9.0完整指南:从依赖到验证

ARM架构离线部署Harbor v2.9.0完整指南:从依赖到验证 简介面向 ARM 架构的 Harbor v2.9.0 离线安装包专为内网环境或无法访问外网镜像仓库的 ARM64 服务器设计帮助运维工程师快速部署企业级私有镜像仓库。安装前需具备 Docker 和 Docker Compose 环境资源内含一键安装脚本执行该脚本即可自动完成部署无需在线拉取任何镜像组件。安装包共含 6 个文件包括 shell 安装脚本、离线镜像包、许可说明、初始化脚本及配置模板等各文件职责清晰压缩包整体约 722.35MB可完整支撑离线安装与后期配置调整适配多种生产环境。该资源目前已有 962 人学习下载适合具备基础 Linux 操作能力的运维人员、DevOps 工程师或需要在 ARM 环境中搭建镜像仓库的技术人员。通过本包可一次性获得全套离线依赖规避因网络受限导致的部署中断同时保留配置模板便于按需修改显著提升部署效率尤其适合离线机房或内网 CI/CD 场景下的快速交付。1. 先认清这条命令行背后的需求ARM 服务器上的 Harbor 离线包为什么难装公司内网里扔着一台 ARM 架构的服务器系统是银河麒麟这类 Linux开发环境全在内网外网完全不通。要在这台机器上跑一个镜像仓库供团队 push 和 pull 镜像很多人第一反应就是找 Harbor 的离线安装包结果一执行install.sh就各种报错。原因不复杂Harbor 本身的离线包是一回事ARM 架构下的 Docker、Compose 和镜像架构是另一回事三者只要有一个选错整个安装就得推倒重来。这篇文章不是把官方文档抄一遍而是把 ARM 架构离线装 Harbor v2.9.0 从依赖准备到验证交付的整条链路拆开把最容易翻车的地方先讲清楚。适合要给内网 ARM 服务器交付 Harbor 的运维、项目交付和正在搭私有仓库的团队参考。2. 先把原理摆正Harbor v2.9.0 离线包、ARM 架构与安装链路2.1 Harbor v2.9.0 离线包里到底装了些什么离线安装包和在线安装包最大的区别是把 Harbor 运行所需的全部组件镜像提前打包放好安装时不需要访问任何外部镜像源。Harbor 本身不是单个进程它由一组容器组成core负责 API 和认证portal是 Web 前端registry负责镜像存取jobservice做复制和清理任务还有nginx、db、redis这些基础设施组件。离线包把这些组件的镜像统一打成 tar 然后放进image目录install.sh做的事本质上是三步检查环境、把镜像docker load进本地、用docker-compose把容器拉起来。所以你会看到所谓离线安装并不需要你手动去拉镜像难点全在 install.sh 执行之前的准备阶段。v2.9.0 这个版本在功能上覆盖了内网交付常见的需求项目隔离、镜像复制、机器人账号、按需漏洞扫描同时这个版本的官方发布包对 ARM64 的适配已经比较成熟。如果你的环境同时还在用旧版本的 Docker2.9.0 的安装脚本对 Docker 20.10.x 的兼容性也比更早的版本好这也是我为什么推荐它作为 ARM 内网环境首选版本。2.2 ARM 和 x86 的差别选错一次包就得重来Docker 镜像是带架构标识的。同一个 Harbor 组件推送到镜像仓库里可以同时存在linux/amd64和linux/arm64两个版本。在线环境下Docker 会根据当前机器的架构自动拉取对应的那个但离线环境没有外网所有东西都是提前拷进去的不存在自动选择这回事。你拷进去的是 x86 的镜像在 ARM 机器上docker load能成功但容器一启动就直接exec format error因为 CPU 根本执行不了另一套指令集。这一点和离线装其他软件是同一个逻辑。比如很多人给 arm64 机器离线装 Nginx 时下的也是 aarch64 的包ARM 环境下没有“通用二进制”这种说法。具体到安装 Harbor有三个东西必须保证是 ARM 架构Docker 的二进制文件、Docker Compose 的二进制文件、Harbor 离线包里的组件镜像。任何一个不对后面的安装就是白费功夫。很多跑 Harbor 的 ARM 服务器装的是银河麒麟这类国产 Linux 发行版包管理习惯和 CentOS 7 很接近所以网上那些 CentOS 7 离线装 Docker 20.10.24 的步骤可以直接平移过来用但所有下载源必须换成 aarch64 的。2.3 安装前的检查先把机器底子摸清楚拿到一台服务器别着急解压 Harbor先把底子摸清楚。我一般会先跑下面这一组命令。uname -m cat /etc/os-release free -h df -h / /data nprocuname -m输出aarch64说明是 ARM 64 位可以继续如果输出x86_64直接停你手里的离线包很可能选错了。cat /etc/os-release看发行版信息银河麒麟、统信这类系统会直接显示名称和版本号这决定了后面要不要额外装一些依赖。free -h看内存Harbor 跑起来是一组容器内存低于 4G 会非常吃力甚至 compose 阶段直接 OOM。df -h / /data这一步很多人会忽略——Harbor 占的空间不是离线包那一个压缩包的大小还要算上 Docker 镜像存储目录和 Harbor 数据卷。我的经验值是系统盘和数据盘至少预留 30G 以上否则后面docker load会卡在中间报磁盘不足。3. 离线安装实操从准备依赖到跑通 install.sh3.1 先装 Docker 和 Docker ComposeARM 二进制从哪里来Harbor 的安装脚本依赖 Docker 和 Docker Compose这两个在离线环境下没有安装包可以碰运气必须提前准备好。常见做法是在一台能上网的机器上下载对应 aarch64 架构的 Docker 静态二进制包想办法拷贝进内网。ARM 场景下我习惯用 Docker 20.10.24 这个版本它在银河麒麟、CentOS 7 这类内网环境的兼容性验证过很多次不那么挑内核。静态包解压后是docker/目录把里面的二进制统一放到/usr/bin/即可。tar -xzf docker-20.10.24.tgz cp docker/* /usr/bin/ mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { data-root: /data/docker } EOFcp docker/* /usr/bin/把dockerd、docker、containerd等全套二进制都拷进去。这里重点看daemon.json把 Docker 的数据根目录指到/data/docker因为镜像仓库日积月累占用很大系统盘一般放不下这个习惯建议一开始就养成。Docker 的静态包不带 systemd 管理文件需要自己写一个 service unit否则无法开机自启。cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Afternetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID LimitNOFILE1048576 TimeoutStartSec0 Restarton-failure [Install] WantedBymulti-user.target EOF systemctl daemon-reload systemctl enable --now dockerTypenotify让 systemd 等dockerd真正起来之后再确认启动成功而不是只看到进程被拉起就完事。LimitNOFILE1048576提高文件描述符上限镜像多了以后不会莫名报too many open files。执行完systemctl enable --now docker接着docker version确认服务正常。接下来是 Docker Compose。离线环境里它也是一个独立二进制ARM 架构对应的文件名通常带aarch64。把它放到/usr/local/bin并加上执行权限。cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose version注意Harbor 的install.sh脚本调用的是docker-compose这个命令不是docker compose插件。哪怕你机器上已经装了新版 Docker 自带 compose 插件也必须保证docker-compose这个命令存在。最省事的做法就是上面这样放一个独立二进制或者给docker compose做一个软链避免后面 install.sh 半路退出。3.2 解压 Harbor 离线包并按内网环境改 harbor.ymlDocker 和 Compose 就绪后把 Harbor 离线包拷进内网并解压。离线包的文件名可能带arm64后缀也可能不带以实际拿到的为准。tar -xzf harbor-offline-installer-v2.9.0.tgz cd harbor cp harbor.yml.tmpl harbor.yml vi harbor.ymlharbor.yml.tmpl是官方提供的配置模板里面带了很多注释。我的做法是复制成harbor.yml再改保留模板作为备份。修改的关键点如下面的 YAML 片段。hostname: 192.168.10.20 http: port: 80 harbor_admin_password: Admin12345 data_volume: /data/harbor log: level: info database: password: root123模板默认把https段开着、http段注释掉内网没有正式证书的话把https段整个注释打开http段让 install.sh 直接走 HTTP。hostname是第一个必改项它决定客户端 push 和 pull 时用的地址内网环境直接写这台机器的 IP 最稳妥写域名反而容易踩坑。harbor_admin_password是管理员密码要求至少 8 位且包含大小写字母和数字。data_volume指向/data/harbor和上面 Docker 的>sudo ./install.sh脚本开始后主要做几件事先做环境检查确认 Docker 和 Docker Compose 存在且版本满足要求然后把image目录下的组件镜像逐个docker load进本地最后基于harbor.yml生成正式的docker-compose.yml并用它把容器拉起来。整个过程少则几分钟多则十几分钟取决于机器磁盘速度和离线包大小。很多人执行完后只看最后的安装成功横幅但我更建议盯着前 30 秒的输出。这段时间最容易暴露环境问题docker-compose: command not found是 Compose 没装好exec format error是架构选错了no space left on device是磁盘预留不足。这些错误越早看到越容易收场。如果失败不要反复执行install.sh先把报错日志看清楚再动手。全部启动后进到 Harbor 解压目录跑一下docker compose ps确认core、portal、registry、db、jobservice、nginx这些关键容器都是Up状态。有容器Exited的话直接docker logs看对应容器日志按下一章的排查思路处理。4. 避坑汇总ARM 离线安装最常见的 5 个翻车点4.1 架构选错包不对怎么调都是白搭现象dockerd启动直接报exec format error或者 Harbor 镜像docker load阶段一切正常但容器一启动就Exited日志里同样是exec format error。原因ARM 服务器上用了 x86 的二进制或镜像。Docker 二进制、Docker Compose 二进制、Harbor 组件镜像这三者里只要有一个是 x86 架构就会在启动时被 CPU 直接拒绝执行。解决装之前uname -m确认是aarch64拷进来的文件用file命令验证一下输出里带ARM aarch64才是对的。镜像架构可以在docker load之后用docker image inspect看Architecture字段。这个检查花不了两分钟能避免整个安装流程白跑一遍。4.2 Docker Compose 缺失或版本太老install.sh 半路退出现象执行./install.sh时出现docker-compose: command not found或者环境检查阶段直接退出提示 Compose 版本不满足要求。原因离线环境里压根没装过 Docker Compose还有一种情况是机器上装了新版 Docker自带docker compose插件但 Harbor 的 install.sh 脚本调用的还是老命令docker-compose。解决提前把docker-compose-linux-aarch64这个独立二进制放到/usr/local/bin/并chmod x执行docker-compose version确认能输出版本。如果只装了插件就做一个符号链接ln -s /usr/bin/docker-compose /usr/local/bin/docker-compose保证 install.sh 能找到命令就行。4.3 磁盘空间算少了docker load 卡在中间现象install.sh 在docker load阶段卡住不动最后报no space left on device或者某个镜像加载成功但下一个失败再次执行时各种残留状态。原因空间被低估了。离线包本身几个 GB解压后又是一份docker load进/var/lib/docker又是一份再加上 Harbor 的数据卷实际占用的总空间远大于离线包的文件大小。解决安装前df -h确认 Docker 根目录所在分区至少 30G 以上通过daemon.json的>hostname: 192.168.10.20 http: port: 80 harbor_admin_password: Admin12345 data_volume: /data/harbor log: level: info database: password: 生成一个强密码重点说一下hostname。如果你所在的内网有内部域名也可以填域名但前提是所有客户端都能解析到这个 IP。实际情况是很多内网里只有 IP 能通域名没人解析填域名只会让所有人登录时报错。我的原则是没有统一 DNS 的环境一律写 IP写域名只会让人踩坑。5.2 用自建 CA 代替 insecure-registriesTLS 的一劳永逸做法测试环境可以开insecure-registries但生产环境建议还是上自建 CA。这个方案的好处是客户端只要信任 CA就不需要在每台机器上开不安全的免认证配置。证书生成在 Harbor 服务器上完成下面这段是 IP 访问场景的完整命令。mkdir -p /data/certs cd /data/certs openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj /CNHarbor-CA openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -subj /CN192.168.10.20 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 825 -sha256 -extfile (printf subjectAltNameIP:192.168.10.20)这段命令先创建一个 CA再用这个 CA 给 Harbor 服务器签发证书证书里通过subjectAltName绑定了 IP。注意-days 825这个值大约是两年多写多了在合规审计上会有问题写少了要频繁轮换825 是平衡后的选择。各处出现的192.168.10.20要替换成实际的服务器 IP。之后在harbor.yml里取消https段的注释把certificate和private_key指到server.crt和server.key重新执行./install.sh --enable-tls或者重跑 prepare 和重启服务。客户端的做法是将ca.crt复制到节点的信任目录比如/etc/docker/certs.d/192.168.10.20:80/ca.crt或者加入 CentOS 系的/etc/pki/ca-trust/source/anchors/后执行update-ca-trust。这样docker login就不会再报证书错误也不需要任何不安全配置。用 IP 访问的场景subjectAltName是必须的少了它会报证书校验失败这是最容易踩的坑。5.3 数据卷与备份策略Harbor 的后悔药Harbor 装完之后data_volume目录下会分成database、redis、storage、secret等几个子目录核心业务数据都在里面。备份的本质就是把整个data_volume打包带出去出了问题直接恢复。我习惯的备份命令是这样的。cd /data/install/harbor docker compose down tar -czf /data/backup/harbor-backup-$(date %F).tar.gz /data/harbor docker compose up -d备份前先docker compose down停止服务保证数据文件不会在写入过程中被拷贝得到的是一个一致性的快照。备份完成后docker compose up -d拉回服务。恢复时注意一点备份时的hostname和数据库密码恢复时必须一致否则 Harbor 的 secret 和数据库关联会对不上容器起来也登录不了。所以在交付的时候我一般会额外把当时的harbor.yml和生成的docker-compose.yml也存一份这两个文件在重装时能省去大量重新配置的时间。6. 验证一遍才敢交付健康检查、API 测试与常用排错命令装完只是第一步交付前我会按固定的顺序把这台 Harbor 过一遍确认是活的、能用、能推拉。先看容器状态和服务健康检查。docker compose ps curl -sk https://192.168.10.20/api/v2.0/ping curl -sk https://192.168.10.20/api/v2.0/healthdocker compose ps确认所有关键容器都是Up/api/v2.0/ping返回一个简单的响应说明 API 服务活着/api/v2.0/health返回各组件健康状态。如果第 3 章配置时用的是 HTTP把命令里的https换成http即可。然后是完整的推拉测试这一步能验证客户端侧所有配置是否到位。docker login 192.168.10.20:80 -u admin docker tag nginx:1.21 192.168.10.20:80/library/nginx:v1 docker push 192.168.10.20:80/library/nginx:v1 docker pull 192.168.10.20:80/library/nginx:v1登录成功后打一个 tag推上去再拉下来全流程能走通这台 Harbor 才算真正可交付。如果用 IP 加端口登录失败八成是证书信任或hostname的问题回头按第 4 章排查。交付后日常排障时日志入口主要有两个容器日志和文件日志。核心服务看harbor-core镜像存取看harbor-registry。docker logs harbor-core --tail 100 docker logs harbor-registry --tail 100 tail -f /var/log/harbor/*.log容器日志适合看某个容器自身的问题文件日志适合跨模块追踪一次完整的请求链路。我现在的习惯是每次在 ARM 环境交付完 Harbor都把uname -m、docker-compose --version、docker compose ps这三样输出存进交付文档。因为后续不管是谁接手出问题时先对照这三样能过滤掉一半以上的环境类故障剩下的才是真正的应用问题。这台机器上架构对不对、Compose 全不全、容器活没活一眼就清楚。整个离线安装链路没有玄学把架构、Compose、磁盘空间这三件前置条件钉死后面就是一条命令的事。希望这篇东西能帮你在内网里少折腾几趟。本文还有配套的精品资源点击获取
返回列表