Ubuntu 22.04 安装 Harbor 指南
在 Ubuntu 22.04 上通过官方离线安装器与在线安装器两种方式部署 Harbor 2.15.4,完成自签 HTTPS、harbor.yml 配置、服务组件编排托管与验证,并给出安装失败排障细节
Ubuntu 22.04 安装 Harbor 指南
目标:在 Ubuntu 22.04 上通过「官方离线安装器(harbor-offline-installer)」与「官方在线安装器(harbor-online-installer)」两种方式部署 Harbor 2.15.4,完成自签 HTTPS 证书、harbor.yml 配置、Harbor 平台服务组件的编排托管与功能验证,并沉淀安装过程中的排障细节。本文已在 Ubuntu 22.04 真实环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 系统架构:x86_64
- 内核版本:6.2.0-060200-generic
- 包管理器:apt(apt-get)
- Harbor 版本:2.15.4(当前最新稳定版)
- 安装方式:方案 A 官方离线安装器(harbor-offline-installer)、方案 B 官方在线安装器(harbor-online-installer)
- 服务编排:
docker compose(Compose v5.5.1 插件),Harbor 各功能作为平台服务组件由 Compose 统一编排托管 - 数据目录:
/opt/data/harbor(数据库/制品存储/证书等全部落盘于此) - 监听端口:HTTPS 443;HTTP 80 自动 301 跳转 HTTPS
- 管理账号:
admin/ 密码q1w2e3r4 - 服务器地址:
172.17.0.63(示例内网 IP,请替换为你的实际服务器地址) - 组件镜像:
goharbor/*:v2.15.4(prepare/core/portal/jobservice/registry/nginx 等)与goharbor/valkey-photon:v2.15.4
二、前置条件
-
拥有 root 权限或 sudo 权限
-
已安装 Docker Engine(
>= 20.10.10)与 Compose 插件(docker compose version可用) -
已完善校验 Docker 与 Compose:
docker --version docker compose version实测输出:
Docker version 29.8.1, build 4a63305 Docker Compose version v5.5.1 -
已有足够的磁盘空间:离线安装器约 713 MB,安装后 Harbor 各组件镜像约占 1.5 GB,再加数据目录预留
-
已规划数据目录(建议放独立数据盘,本部署使用
/opt/data/harbor) -
网络可访问 GitHub Releases 下载安装器(在线方案 B 还需能访问
docker.io拉取组件镜像)
⚠️ 注意:Harbor 的
hostname禁止使用localhost或127.0.0.1,否则外部客户端无法通过该地址访问控制台与访问注册表接口。
三、版本选型说明
| 来源 | 版本 | 类型 | 特点 |
|---|---|---|---|
Harbor 官方离线安装器(harbor-offline-installer-v2.15.4.tgz) | 2.15.4 | 稳定版 | 内嵌全部组件镜像 tar,安装时本地加载,适合内网/弱网;本文方案 A |
Harbor 官方在线安装器(harbor-online-installer-v2.15.4.tgz) | 2.15.4 | 稳定版 | 安装时从 docker.io 在线拉取组件镜像,包体小(仅几 MB),适合可联网环境;本文方案 B |
| 源码编译构建 | 自定义 | 开发版 | 从 GitHub 拉源码 make 构建,适合二次开发,生产不推荐 |
💡 说明:Harbor 的离线/在线安装器版本号一致,二者本质区别在于「组件镜像」是打包进安装器(离线)还是安装时在线拉取(在线)。当前稳定版为 2.15.4,版本可随时在 GitHub Releases 页(见参考链接)按需选择。
四、方案 A:官方离线安装器部署
4.1 创建数据目录与解压目录
mkdir -p /opt/data/harbor
mkdir -p /opt/harbor-installer
💡 说明:
/opt/data/harbor为 Harbor 数据目录(后续 harbor.yml 的data_volume即指向它);/opt/harbor-installer用于存放并解压安装器。
4.2 下载官方离线安装器
从 GitHub Releases 下载离线安装器(体积约 713 MB)。国内网络直连 GitHub 较慢时,可改用 GitHub 加速代理(ghfast.top)兜底:
cd /opt/harbor-installer
wget https://github.com/goharbor/harbor/releases/download/v2.15.4/harbor-offline-installer-v2.15.4.tgz
实测输出(使用 curl + 加速源,节选):
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 713M 100 713M 0 0 10.0M 0 0:01:13 0:01:11 --:--:-- 10.0M
⚠️ 排障(实测):直连
github.com下载时速度可能只有 200~300 KB/s,且偶发 0 字节卡住。改用加速源后恢复到 10 MB/s:curl -L -o harbor-offline-installer-v2.15.4.tgz \ https://ghfast.top/https://github.com/goharbor/harbor/releases/download/v2.15.4/harbor-offline-installer-v2.15.4.tgz
4.3 校验与解压
cd /opt/harbor-installer
sha256sum harbor-offline-installer-v2.15.4.tgz
tar xzf harbor-offline-installer-v2.15.4.tgz
cd harbor
ls -l
实测输出(解压后的目录内容):
total 734852
-rw-r--r-- 1 root root 11347 Oct 8 08:53 LICENSE
-rw-r--r-- 1 root root 3646 Oct 8 08:53 common.sh
-rw-r--r-- 1 root root 752436879 Oct 8 08:53 harbor.v2.15.4.tar.gz
-rw-r--r-- 1 root root 15379 Oct 8 08:53 harbor.yml.tmpl
-rwxr-xr-x 1 root root 1975 Oct 8 08:53 install.sh
-rwxr-xr-x 1 root root 2211 Oct 8 08:53 prepare
💡 说明:解压后可见
harbor.v2.15.4.tar.gz(内嵌全部组件镜像)、harbor.yml.tmpl(配置模板)、install.sh(安装脚本)、prepare(配置生成器)与common.sh(公共函数库)。HTTPS 自签证书、harbor.yml 的修改在 4.4 / 4.5 完成后再执行install.sh。
4.4 生成自签 HTTPS 证书
Harbor 的 HTTPS 由前置反向代理组件(nginx)终结,需要服务端证书(server.crt/server.key)与用于签发它的证书中心(CA)证书(ca.crt)。以下用 openssl 生成并放置到数据目录 /opt/data/harbor:
第一步:生成 CA 私钥与自签 CA 证书
cd /opt/data/harbor
openssl req -newkey rsa:4096 -nodes -keyout ca.key -x509 -days 365 \
-subj "/CN=harbor-ca" -out ca.crt
实测输出:
.+..+............+....+.....+.......+.....+...+....+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+...
-----
第二步:生成服务端私钥与证书签名请求(CSR)
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr -subj "/CN=172.17.0.63"
第三步:生成扩展文件并签发服务端证书
cat > ext.cnf <<'EOF'
[ v3_req ]
subjectAltName = IP:172.17.0.63
extendedKeyUsage = serverAuth
EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-days 365 -out server.crt -extensions v3_req -extfile ext.cnf
实测输出:
Certificate request self-signature ok
subject=CN = 172.17.0.63
第四步:校验证书的 SAN(必须包含服务器 IP)
openssl x509 -in /opt/data/harbor/server.crt -noout -text | grep -A1 "Subject Alternative Name"
实测输出:
X509v3 Subject Alternative Name:
IP Address:172.17.0.63
ls -la /opt/data/harbor/*.crt /opt/data/harbor/*.key
实测输出:
-rw-r--r-- 1 root root 1805 Oct 10 00:38 /opt/data/harbor/ca.crt
-rw------- 1 root root 3272 Oct 10 00:38 /opt/data/harbor/ca.key
-rw-r--r-- 1 root root 1838 Oct 10 00:38 /opt/data/harbor/server.crt
-rw------- 1 root root 3268 Oct 10 00:38 /opt/data/harbor/server.key
⚠️ 排障(实测):
ext.cnf中subjectAltName = IP:harbor.local这种写法会因harbor.local不是 IP 而报错,导致openssl x509 -req退出码为 1。必须写成真实的 IP 或域名(如DNS:registry.example.com)。
💡 说明:
ca.crt将来用于客户端信任,推拉镜像的客户端可将其导入/etc/docker/certs.d/<host>/ca.crt使 Docker 信任自签证书;本实测环境因把目标地址加入 Docker daemon 的insecure-registries,也可直接登录。
4.5 配置 harbor.yml
从模板生成配置文件,并修改 hostname、HTTPS 证书路径、管理员密码、数据目录等关键项:
cd /opt/harbor-installer/harbor
cp harbor.yml.tmpl harbor.yml
sed -i \
-e "s|^hostname: .*|hostname: 172.17.0.63|" \
-e "s|^ certificate: .*| certificate: /opt/data/harbor/server.crt|" \
-e "s|^ private_key: .*| private_key: /opt/data/harbor/server.key|" \
-e "s|^harbor_admin_password: .*|harbor_admin_password: q1w2e3r4|" \
-e "s|^data_volume: .*|data_volume: /opt/data/harbor|" \
harbor.yml
确认关键行已修改(实测):
grep -nE "^hostname:|^ port:|^ certificate:|^ private_key:|^harbor_admin_password:|^data_volume:" harbor.yml
5:hostname: 172.17.0.63
10: port: 80
15: port: 443
17: certificate: /opt/data/harbor/server.crt
18: private_key: /opt/data/harbor/server.key
47:harbor_admin_password: q1w2e3r4
66:data_volume: /opt/data/harbor
💡 说明:
harbor_admin_password仅在首次安装时生效;data_volume指向/opt/data/harbor,Harbor 的数据库、制品存储、配置等都会写入其中。完整参数含义见《Harbor 配置参数详解》。
4.6 执行安装脚本
cd /opt/harbor-installer/harbor
export TERM=xterm
./install.sh
实测输出(节选):
[Step 0]: checking if docker is installed ...
Note: docker version: 29.8.1
[Step 1]: checking docker-compose is installed ...
Note: Docker Compose version v5.5.1
[Step 2]: loading Harbor images ...
Loaded image: goharbor/prepare:v2.15.4
Loaded image: goharbor/harbor-log:v2.15.4
Loaded image: goharbor/trivy-adapter-photon:v2.15.4
Loaded image: goharbor/harbor-exporter:v2.15.4
Loaded image: goharbor/harbor-portal:v2.15.4
Loaded image: goharbor/harbor-core:v2.15.4
Loaded image: goharbor/harbor-registryctl:v2.15.4
Loaded image: goharbor/valkey-photon:v2.15.4
Loaded image: goharbor/nginx-photon:v2.15.4
Loaded image: goharbor/registry-photon:v2.15.4
Loaded image: goharbor/harbor-db:v2.15.4
Loaded image: goharbor/harbor-jobservice:v2.15.4
[Step 3]: preparing environment ...
[Step 4]: preparing harbor configs ...
prepare base dir is set to /opt/harbor-installer/harbor
[Step 5]: starting Harbor ...
Network harbor_harbor Creating
Network harbor_harbor Created
Container harbor-log Creating
Container harbor-portal Starting
Container redis Starting
Container registry Starting
Container registryctl Starting
Container harbor-db Starting
Container harbor-core Starting
Container harbor-jobservice Starting
Container nginx Starting
✔ ----Harbor has been installed and started successfully.----
⚠️ 排障(实测):若 Docker 存储驱动为 overlay 且所处文件系统不支持 whiteout(常见于受限/嵌套环境),
./install.sh第 2 步docker load会同时出现大量形如Error unpacking image goharbor/prepare:v2.15.4: apply layer error ... failed to convert whiteout file "etc/ssl/certs/.wh.228f89db.0": operation not permitted的报错,至第 4 步
prepare彻底失败。解决办法:让 Docker 改用vfs存储驱动(在/etc/docker/daemon.json增加"storage-driver": "vfs"后重启 dockerd),再重新执行./install.sh。本文最终以vfs驱动部署成功。
4.7 验证平台服务组件状态
cd /opt/harbor-installer/harbor
docker compose ps
实测输出:
NAME SERVICE STATUS
harbor-core core Up 2 minutes (healthy)
harbor-db postgresql Up 2 minutes (healthy)
harbor-jobservice jobservice Up 2 minutes (healthy)
harbor-log log Up 2 minutes (healthy)
harbor-portal portal Up 2 minutes (healthy)
nginx proxy Up 2 minutes (healthy)
redis redis Up 2 minutes (healthy)
registry registry Up 2 minutes (healthy)
registryctl registryctl Up 2 minutes (healthy)
💡 说明:9 个平台服务组件全部
Up且healthy即为部署成功。nginx(proxy)对外监听 80/443;其余 core/db/jobservice/portal/registry/registryctl/redis/log 为内部组件。
五、方案 B:官方在线安装器部署
适用于可访问 docker.io 的环境。在线安装器包体很小,安装时按需从仓库拉取组件镜像,其余流程与方案 A 一致。
5.1 下载在线安装器
cd /opt/harbor-installer
wget https://github.com/goharbor/harbor/releases/download/v2.15.4/harbor-online-installer-v2.15.4.tgz
tar xzf harbor-online-installer-v2.15.4.tgz
cd harbor
ls -l
实测中的(同版本)结构说明: 在线安装器不含 harbor.v2.15.4.tar.gz 大包,只有 install.sh、prepare、common.sh、harbor.yml.tmpl 等脚本与模板,安装时通过 Docker 在线拉取组件镜像。
5.2 生成自签证书并配置 harbor.yml
与方案 A 的 4.4 / 4.5 完全相同(生成证书到 /opt/data/harbor 并修改 harbor.yml 的 hostname/certificate/harbor_admin_password/data_volume),此处不再重复。
5.3 执行安装脚本
cd /opt/harbor-installer/harbor
export TERM=xterm
./install.sh
预期输出要点: 在线安装器安装流程与方案 A 一致,唯一差别是第 2 步由 docker load 内嵌包变为从仓库 docker pull 各组件镜像(如 goharbor/harbor-core:v2.15.4、goharbor/harbor-jobservice:v2.15.4、goharbor/registry-photon:v2.15.4 等),其余第 3~5 步与 4.6 相同,最终同样输出 ✔ ----Harbor has been installed and started successfully.----。
⚠️ 注意:在线安装器强依赖
docker.io可达。若环境无法访问 Docker Hub(如内网隔离),应使用方案 A 离线安装器。
六、多方案对比与选择建议
| 对比维度 | 方案 A(离线安装器) | 方案 B(在线安装器) |
|---|---|---|
| 版本 | 2.15.4 | 2.15.4 |
| 安装包体积 | 约 713 MB(含组件镜像) | 仅数 MB(不含镜像) |
| 是否需联网 | 仅下载安装器阶段;安装本身无需 | 安装时需访问 docker.io 拉镜像 |
| 适用场景 | 内网隔离/弱网/需离线备份 | 可联网、追求最小下载量 |
| 镜像来源 | 安装包内嵌 harbor.v2.15.4.tar.gz 本地 docker load | 在线 docker pull |
| 部署结果 | 相同(9 个平台服务组件) | 相同 |
💡 选择建议:离线/内网环境选方案 A(离线安装器);能访问
docker.io且希望省下载流量选方案 B。二者部署出的 Harbor 完全一致,运行管理命令也完全相同。
七、配置说明
7.1 数据目录
所有 Harbor 数据(PostgreSQL 数据库、制品存储、日志、配置等)保存在 data_volume: /opt/data/harbor。建议后续配合独立数据盘并定期备份:
ls -la /opt/data/harbor
7.2 HTTPS 与端口
- 对外入口为
nginx(proxy)组件,监听443(HTTPS)、80(HTTP,自动 301 到 HTTPS)。 - 证书路径由 harbor.yml 的
https.certificate/https.private_key指定为/opt/data/harbor/server.crt/server.key。 - 客户端推拉镜像使用
172.17.0.63:443(或默认 https://172.17.0.63)。
7.3 管理账号
- 管理账号
admin,首次安装密码取harbor_admin_password: q1w2e3r4。首次登录后建议到控制台/c/setting修改密码并启用机密过期策略(见《Harbor 配置参数详解》)。
7.4 重启与服务自启
Harbor 以 docker compose 编排托管,启停通过 compose 完成:
cd /opt/harbor-installer/harbor
docker compose restart # 重启全部组件
docker compose stop # 停止全部组件
docker compose up -d # 重新拉起全部组件(随 Docker 自启策略生效)
💡 说明:Harbor 内各组件在 compose 中均声明了
restart: always,仅需确保 Docker 守护进程开机自启即可实现 Harbor 随服务器开机恢复(systemctl enable docker或安装 Docker 时已默认开启)。
八、常见问题
8.1 问题 1:hostname 用了 localhost 报错
原因: Harbor 的 hostname 不允许使用 localhost/127.0.0.1,否则外部无法访问。
解决: 改为服务器真实 IP 或域名(如 172.17.0.63),重新 ./install.sh(配置文件修改后 prepare 会自动重生成 compose 配置)。
8.2 问题 2:docker load 报 operation not permitted(whiteout)
原因: overlay 存储驱动在部分文件系统上无法写入 whiteout,常见于嵌套/受限环境。
解决: 修改 /etc/docker/daemon.json 增加 "storage-driver": "vfs",重启 dockerd 后重新 ./install.sh(见 4.6 排障)。
8.3 问题 3:下载安装器卡在 0 字节 / 速度过慢
原因: 直连 GitHub Releases 网络不佳。
解决: 改用 GitHub 加速源(如 ghfast.top,见 4.2)使用 curl -L 下载。
8.4 问题 4:docker login 自签证书报 certificate signed by unknown authority
原因: 客户端 Docker 不信任 Harbor 的自签证书。
解决: 将 ca.crt 导入客户端 ~/.docker/ 的 /etc/docker/certs.d/172.17.0.63/ca.crt;或把服务地址加入 daemon 的 insecure-registries(仅限受信内网)。
8.5 问题 5:重启后 docker compose ps 各组件反复 Restarting
原因: 多为 /opt/data/harbor 数据目录权限不符或某组件依赖库未就绪。
解决: 查看单个组件日志定位(如 docker logs harbor-core);确认数据目录属主与 uid 匹配,再 docker compose restart。
九、卸载与清理
cd /opt/harbor-installer/harbor
docker compose down -v # 停止并移除组件、网络与命名卷
rm -rf /opt/harbor-installer # 删除安装器
rm -rf /opt/data/harbor # 删除数据目录(谨慎:含全部制品与数据库)
💡 说明:
docker compose down -v会清掉 Harbor 的命名卷;/opt/data/harbor为主机 bind 挂载目录,须显式删除。若日后要保留制品供重装复用,跳过删除/opt/data/harbor。
十、参考链接
- Harbor 官方 GitHub Releases(下载安装器)
- Harbor 官方安装文档(Configure HTTPS / install)
- Harbor 官方 Docker Compose 部署文档
- Harbor 官方配置(harbor.yml)参考
- Harbor 官方 REST API(v2.0)
本文档由 www.quzuo.net 平台开发