镜像供应链信任边界控制平面与Harbor集成部署 - 第4节
4.1 环境依赖矩阵:Docker、Docker Compose 与 Kubernetes
Harbor 作为容器镜像仓库与供应链安全控制平面,其安装环境需满足明确的运行时依赖。根据部署模式(单机测试 vs 生产高可用),底层容器运行时与编排工具的选择存在差异。下表列出了各组件的最低版本要求及推荐配置:
| 组件 | 最低版本 | 推荐版本 | 说明 |
|---|---|---|---|
| Docker Engine | 20.10.x | 24.0.x 或更高 | 用于运行 Harbor 核心容器;需启用 containerd 快照器 |
| Docker Compose | v2.20.x | v2.27.x | 单节点部署必需;v1 已停止维护,请使用 v2 插件版 |
| Kubernetes | v1.24.x | v1.28.x 或 v1.29.x | 生产高可用部署时使用;需配合 Helm Chart 安装 |
| Helm | v3.12.x | v3.14.x | K8s 模式下管理 Harbor Chart 包 |
⚠ 版本兼容性警告: Harbor v2.10+ 已不再支持 Docker Compose v1(即
docker-compose 独立二进制)。请使用 docker compose(v2 插件)或直接迁移至 Kubernetes 部署。若使用 K8s,确保集群已安装 metrics-server 用于资源监控。
4.1.1 环境准备步骤
- 安装 Docker Engine:使用官方脚本或包管理器安装,并配置镜像加速器(如阿里云、中科大源)。
- 安装 Docker Compose v2:通过
apt或yum安装 docker-compose-plugin,验证命令docker compose version。 - 安装 Kubernetes 集群(可选):使用 kubeadm、K3s 或云托管集群,确保节点间网络互通。
- 安装 Helm CLI:下载二进制或使用包管理器,添加 Harbor 官方 Chart 仓库。
💡 生产建议: 生产环境强烈推荐使用 Kubernetes + Helm 部署 Harbor,以获得自动扩缩容、滚动更新、持久卷管理及网络策略隔离能力。单机 Docker Compose 仅适用于 PoC 或开发测试。
4.2 离线安装包获取与完整性校验
在隔离网络或受控环境中,无法直接访问 Docker Hub 或 GitHub Release。Harbor 官方提供离线安装包(.tar.gz),包含所有预构建镜像及安装脚本。获取流程如下:
- 下载地址:GitHub Releases 页面(
https://github.com/goharbor/harbor/releases),选择对应版本(如harbor-offline-installer-v2.10.2.tgz)。 - 校验文件:同时下载同名的
.asc签名文件或sha256sum.txt,用于验证包完整性。 - GPG 验证(推荐):导入 Harbor 官方 GPG 公钥,执行
gpg --verify校验签名。 - SHA256 校验(备选):
sha256sum -c sha256sum.txt --ignore-missing。
🔐 安全提示: 离线包一旦被篡改,可能导致供应链投毒。务必在安装前完成 GPG 或 SHA256 校验。建议将校验步骤写入 CI/CD 流水线或自动化脚本中。
4.2.1 离线包结构解析
解压后的目录结构如下:
harbor/
├── harbor.yml.tmpl # 主配置文件模板(必须修改)
├── install.sh # 安装入口脚本
├── prepare.sh # 环境准备与配置生成
├── common/ # 公共脚本与证书工具
├── docker-compose.yml # 生成的 Compose 文件(由 prepare.sh 生成)
└── harbor.v2.10.2.tar.gz # 所有镜像的离线 tar 包
📦 关键文件说明:
harbor.yml.tmpl 是唯一需要手动编辑的配置文件;install.sh 会自动加载离线镜像并启动服务。切勿直接修改 docker-compose.yml,它由 prepare.sh 根据 harbor.yml 动态生成。
4.3 配置文件详解:harbor.yml 核心参数
harbor.yml 是 Harbor 安装的单一配置入口,涵盖主机名、证书、存储后端、认证方式、组件开关等。以下按功能模块拆解关键字段:
| 配置段 | 参数示例 | 说明 | 必填 |
|---|---|---|---|
| 主机名 | hostname: reg.example.com |
Harbor 对外访问的 FQDN;不可使用 localhost | 是 |
| HTTP/HTTPS | http.port: 80https.port: 443 |
生产环境必须启用 HTTPS;证书路径需正确 | 是 |
| 管理员密码 | harbor_admin_password: Harbor12345 |
初始密码,安装后立即修改 | 是 |
| 数据库 | database.password: root123 |
PostgreSQL 密码;生产建议使用外部数据库 | 是 |
| 存储后端 | storage_service.filesystemstorage_service.s3 |
默认本地文件系统;可切换 S3/GCS/Azure | 否 |
| 认证方式 | auth_mode: ldap_authauth_mode: db_auth |
默认本地数据库;支持 LDAP/OIDC | 否 |
| 组件开关 | trivy.enabled: truenotary.enabled: false |
控制漏洞扫描、镜像签名等组件 | 否 |
| 代理缓存 | proxy.proxy_registry |
配置上游代理缓存(如 Docker Hub 镜像) | 否 |
⚠ 配置陷阱:
hostname必须与证书 CN 匹配,否则 HTTPS 握手失败。- 若启用
trivy漏洞扫描,需确保离线环境能访问 Trivy 数据库或配置内部镜像源。 storage_service切换为 S3 后,原有本地数据不会自动迁移,需提前规划。
4.3.1 典型生产配置片段
hostname: harbor.internal.company.com
https:
port: 443
certificate: /data/certs/harbor.crt
private_key: /data/certs/harbor.key
harbor_admin_password: ${ADMIN_PASSWORD}
database:
type: external
host: postgres-cluster.company.com
port: 5432
username: harbor
password: ${DB_PASSWORD}
core_db: harbor_core
clair_db: harbor_clair
storage_service:
s3:
region: us-east-1
bucket: harbor-registry
accesskey: ${AWS_ACCESS_KEY}
secretkey: ${AWS_SECRET_KEY}
secure: true
auth_mode: oidc_auth
oidc:
name: Okta
endpoint: https://okta.company.com
client_id: ${OIDC_CLIENT_ID}
client_secret: ${OIDC_CLIENT_SECRET}
scope: openid,profile,email
trivy:
enabled: true
skip_update: false
offline_scan: false
🔧 变量替换: 生产环境中建议使用环境变量或 Vault 注入敏感字段(如
${ADMIN_PASSWORD}),避免明文写入配置文件。Harbor 的 prepare.sh 支持 --with-notary、--with-trivy 等参数,但更推荐在 harbor.yml 中统一声明。
4.4 初始化安装执行流程
完成环境准备与配置后,按以下步骤执行安装:
- 解压离线包:
tar -xzf harbor-offline-installer-v2.10.2.tgz -C /opt - 复制并编辑配置:
cp harbor.yml.tmpl harbor.yml,按 4.3 节修改参数。 - 运行 prepare.sh:
./prepare.sh,生成证书、密钥及 docker-compose.yml。 - 加载离线镜像:
docker load -i harbor.v2.10.2.tar.gz(install.sh 会自动执行)。 - 启动服务:
./install.sh,该脚本会调用docker compose up -d。 - 验证状态:
docker compose ps确认所有容器为Up状态;访问https://<hostname>登录 UI。
✅ 安装后检查清单:
- 核心容器(nginx、core、registry、db、redis、portal)全部运行。
- HTTPS 证书无过期或域名不匹配错误。
- 管理员可正常登录并创建项目。
- 漏洞扫描器(Trivy)数据库已初始化。