Harbor 是由 VMware 开源的企业级容器镜像仓库,提供了 Docker Hub 所没有的 RBAC、镜像复制、漏洞扫描和 Helm Chart 管理等能力,是生产环境管理镜像的标准选择。
Harbor 架构核心组件
┌─────────────────────────────────────────────┐
│ Nginx (反向代理) │
├─────────────────────────────────────────────┤
│ Harbor Core │ Harbor Portal (Web UI) │
├─────────────────────────────────────────────┤
│ Registry (OCI/Docker v2) │
│ ChartMuseum (Helm Chart 存储) │
├─────────────────────────────────────────────┤
│ Jobservice (异步任务调度) │
│ Trivy Adapter (漏洞扫描适配器) │
├─────────────────────────────────────────────┤
│ Redis (缓存) │ PostgreSQL (元数据) │
└─────────────────────────────────────────────┘
| 组件 | 作用 | 替代方案 |
|---|---|---|
| Registry | 存储和分发 OCI/Docker 镜像 | Docker Distribution |
| ChartMuseum | Helm Chart 存储和索引 | Nexus, Artifactory |
| Core API | 业务逻辑、身份验证、项目 | 无 |
| Jobservice | 镜像复制、垃圾回收、扫描任务 | 无 |
| Trivy Adapter | 调用 Trivy 扫描镜像层 | Anchore, Clair |
RBAC 权限模型
Harbor 采用项目(Project)作为资源隔离的基本单位,每个项目是独立的镜像命名空间:
系统管理员
├── 项目 A(公开/私有)
│ ├── 项目管理员(可管理成员、配置策略)
│ ├── 维护者(可推送/拉取,管理镜像)
│ ├── 开发者(可推送/拉取)
│ └── 访客(仅拉取)
└── 项目 B
权限粒度控制示例:为 CI 系统创建仅上传权限的机器人账户。
# 在 Harbor UI 创建机器人账户后,获取 token
docker login harbor.example.com -u robot$ci-pusher -p <token>
# 仅允许上传,禁止删除镜像
镜像复制规则(跨地域同步)
Harbor 支持基于规则的多实例镜像同步,适配多云和跨地域灾备场景:
# Harbor UI 中配置的复制规则
名称: prod-images-sync
源仓库: harbor-beijing/library
目标仓库: harbor-singapore/library
触发模式: 事件驱动 (push 时触发)
过滤器:
- 标签: v1.*
- 资源类型: 镜像
| 触发模式 | 说明 | 适用场景 |
|---|---|---|
| 手动触发 | 管理员手动执行 | 一次性迁移 |
| 定时触发 | Cron 表达式调度 | 每日/每周批量同步 |
| 事件驱动 | 镜像推送时自动触发 | 实时跨地域同步 |
复制任务失败时,Jobservice 会保留执行日志。在 Web UI 的「复制管理」中可查看失败原因,常见问题包括目标仓库凭据过期、网络超时或 tag 命名策略冲突。
Webhook 通知
Harbor 支持将镜像事件推送到外部系统,实现与 CI/CD 流水线的联动:
| 事件类型 | 触发条件 | 典型用途 |
|---|---|---|
| Pull | 镜像被拉取 | 审计、计费等 |
| Push | 镜像被推送 | 触发下游部署 |
| Scanning Completed | 漏洞扫描结束 | 质量门禁 |
| Scanning Failed | 扫描失败 | 告警通知 |
Webhook 推送的 JSON payload 示例:
{
"type": "PUSH_ARTIFACT",
"occur_at": 1725840000,
"operator": "dev-user",
"event_data": {
"resources": [
{
"digest": "sha256:abc123...",
"tag": "v1.2.3",
"resource_url": "harbor.example.com/library/app:v1.2.3"
}
],
"repository": {
"name": "app",
"namespace": "library"
}
}
}
Trivy 漏洞扫描集成
Harbor 内置的 Trivy 扫描器在镜像推送到仓库后自动执行检测。扫描策略可配置为强制门禁:
项目设置 → 配置管理 → 部署安全性
├─ 阻止潜在漏洞镜像:启用
├─ 阻止的镜像 CVE 级别:High, Critical
└─ 过期时间:24小时
扫描结果通过 REST API 获取:
# 获取指定镜像的漏洞报告
curl -u "admin:$HARBOR_PASSWORD" \
"https://harbor.example.com/api/v2.0/projects/library/repositories/app/artifacts/v1.0.0/additions/vulnerabilities"
Helm Chart 管理
Harbor 不仅是镜像仓库,也是 Helm Chart 的 OCI 兼容注册中心:
# 登录 Harbor
helm registry login harbor.example.com -u admin
# 推送 Chart 到 Harbor
helm package ./mychart
helm push mychart-0.1.0.tgz oci://harbor.example.com/library
# 添加 Harbor 为 Helm repo(ChartMuseum 模式)
helm repo add harbor https://harbor.example.com/chartrepo/library
helm repo update
helm search repo harbor/mychart
OCI 模式 vs ChartMuseum 模式对比:
| 特性 | ChartMuseum | OCI Registry |
|---|---|---|
| 索引方式 | index.yaml | OCI manifest |
| 删除 Chart | API 删除 | 直接删除 manifest |
| 与镜像复用 | 否 | 是(同一 Registry) |
| Helm 版本要求 | >= 2.x | >= 3.8 |
OIDC 单点登录配置
Harbor 支持通过 OIDC 对接企业身份提供商(Keycloak、Azure AD、Okta 等):
# Harbor 配置:配置管理 → 认证
认证模式: OIDC
OIDC 提供商名称: Keycloak
OIDC 端点: https://keycloak.example.com/realms/production
OIDC 客户端 ID: harbor-client
OIDC 客户端密钥: ********
OIDC 范围: email,profile,openid,groups
OIDC 验证证书: 是
配置完成后,Harbor 将基于 OIDC 的 groups claim 自动映射用户到项目和角色。例如 Keycloak 中的 harbor-admins 组对应 Harbor 的系统管理员角色,实现无需 Harbor 本地管理权限的自动化授权体系。
客户端操作命令速查
# Docker 登录 Harbor
docker login harbor.example.com -u admin
# 打标签并推送镜像
docker tag myapp:v1.0 harbor.example.com/library/myapp:v1.0
docker push harbor.example.com/library/myapp:v1.0
# Helm 操作(OCI 模式)
helm registry login harbor.example.com
helm push mychart-1.0.0.tgz oci://harbor.example.com/library
helm install myrelease oci://harbor.example.com/library/mychart --version 1.0.0
# 清理未使用的镜像( garbage collection )
# Harbor UI: 管理 → 垃圾清理 → 立即执行
在生产环境中,建议为 Harbor 启用 HTTPS(自签名或 Let’s Encrypt)、配置 S3/MinIO 对象存储后端、以及设置定时备份 PostgreSQL 数据库。复制策略和扫描策略应覆盖所有生产项目,避免因镜像漂移或已知漏洞引入运维风险。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。