Harbor 镜像仓库
概述
Harbor 是一个开源的云原生镜像仓库,由 VMware 研发并捐赠给 CNCF 孵化。它提供镜像存储、安全管理、访问控制和跨站点复制等企业级能力,是生产环境中 Kubernetes 和容器化部署的核心基础设施。
一、Harbor 架构
1.1 核心组件
Harbor 采用微服务架构,各组件以容器方式运行,通过 REST API 相互通信。
| 组件 | 功能 |
|---|---|
| core | Harbor 核心服务,提供 Web UI、API 网关、认证授权、项目管理等功能 |
| registry | 镜像存储服务,基于 Docker Distribution,负责镜像的推送、拉取和存储 |
| jobservice | 异步任务调度器,处理镜像复制、扫描、清理等后台任务 |
| clair / trivy | 漏洞扫描引擎,分析镜像中的安全漏洞 |
| chartmuseum | Helm Chart 仓库服务,管理 Helm 包的上传、存储和分发 |
| nginx | 反向代理,统一入口,处理 TLS 终止和请求转发 |
| database | PostgreSQL,存储 Harbor 元数据(项目、用户、策略等) |
| redis | 缓存和任务队列,提升 API 响应速度并支持异步任务调度 |
1.2 架构图
客户端 (docker CLI / Helm CLI / HTTP API)
|
v
+--------+ +---------+
| nginx | ----> | core |
+--------+ +---------+
| | |
v v v
+----------+ +-----------+
| registry | | database |
+----------+ +-----------+
| |
v v
+-------------+ +---------+
| jobservice | | redis |
+-------------+ +---------+
|
v
+----------+ +----------+
| clair/trivy| | chartmuseum|
+----------+ +----------+1.3 数据流向
- 推送镜像:
docker push--> nginx (TLS) --> registry --> 存储后端 (文件系统/S3/OSS) - 漏洞扫描:core 触发扫描任务 --> jobservice 调度 --> clair/trivy 分析 registry 中的镜像 --> 结果写入 database
- 镜像复制:jobservice 定期/事件触发 --> 读取源 registry 镜像 --> 推送到目标 Harbor/Docker Hub
二、安装部署
2.1 Docker Compose 部署
适用于测试和小规模生产环境。
前提条件:Docker 20.10+、Docker Compose v2+、Python 3.6+
# 下载 Harbor 离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xzf harbor-offline-installer-v2.10.0.tgz
cd harbor
# 复制配置模板
cp harbor.yml.tmpl harbor.ymlharbor.yml 核心配置:
# HTTPS 配置
hostname: harbor.example.com
https:
port: 443
certificate: /data/cert/harbor.example.com.crt
private_key: /data/cert/harbor.example.com.key
# 管理员初始密码
harbor_admin_password: YourStrongPassword123
# 数据库
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
# 存储后端(默认本地文件系统)
storage_service:
filesystem:
rootdirectory: /data/registry
# 启用 Trivy 扫描器
trivy:
enabled: true
github_token: your_github_token # 用于下载漏洞数据库,可留空
# 启用 Chart Museum
chartmuseum:
enabled: true执行安装:
# 执行安装脚本(自动拉取镜像并启动)
sudo ./install.sh
# 安装完成后访问 https://harbor.example.com
# 默认管理员账号:admin2.2 Helm 部署(Kubernetes)
适用于 Kubernetes 集群内部署,推荐生产环境使用。
# 添加 Helm 仓库
helm repo add harbor https://helm.goharbor.io
helm repo update
# 创建命名空间
kubectl create namespace harbor
# 安装 Harbor
helm upgrade --install harbor harbor/harbor \
--namespace harbor \
--set expose.type=ingress \
--set expose.tls.auto.commonName=harbor.example.com \
--set externalURL=https://harbor.example.com \
--set harborAdminPassword=YourStrongPassword123 \
--set persistence.enabled=true \
--set persistence.persistentVolumeClaim.registry.size=200Gi \
--set persistence.persistentVolumeClaim.database.size=20Gi \
--set trivy.enabled=true \
--set chartmuseum.enabled=truevalues.yaml 自定义示例:
expose:
type: ingress
tls:
auto:
commonName: harbor.example.com
ingress:
hosts:
core: harbor.example.com
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
persistence:
enabled: true
persistentVolumeClaim:
registry:
size: 500Gi
storageClass: csi-s3
database:
size: 50Gi
storageClass: csi-s3
jobservice:
size: 10Gi
storageClass: csi-s3
registry:
middleware:
storage:
- name: s3
s3:
region: cn-north-1
bucket: harbor-registry
rootdirectory: /registry2.3 HTTPS 证书配置
自签名证书(测试环境):
# 生成 CA 私钥
openssl genrsa -out ca.key 4096
# 生成 CA 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=Dev/CN=harbor.example.com" \
-key ca.key -out ca.crt
# 生成服务端私钥
openssl genrsa -out harbor.example.com.key 4096
# 生成证书签名请求
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=Dev/CN=harbor.example.com" \
-key harbor.example.com.key -out harbor.example.com.csr
# 生成 x509 v3 扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
[alt_names]
DNS.1=harbor.example.com
DNS.2=core.harbor.example.com
EOF
# 签发证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.example.com.csr -out harbor.example.com.crt
# Docker 客户端信任自签名 CA
# Linux: cp ca.crt /etc/docker/certs.d/harbor.example.com/ca.crt
# macOS: sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crtLet's Encrypt 证书(生产环境):
# Helm 部署时通过 cert-manager 自动签发
expose:
tls:
auto:
commonName: harbor.example.com三、项目管理
3.1 项目级别
Harbor 的项目分为两种可见性:
| 类型 | 描述 |
|---|---|
| 公开 (Public) | 所有用户可拉取镜像,无需登录 |
| 私有 (Private) | 仅项目成员可拉取和推送镜像 |
# 通过 API 创建项目
curl -X POST "https://harbor.example.com/api/v2.0/projects" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"project_name": "production",
"metadata": {
"public": "false",
"auto_scan": "true",
"prevent_vul": "true",
"severity": "high",
"reuse_sys_cve_allowlist": "false"
}
}'3.2 成员管理
| 角色 | 权限 |
|---|---|
| 项目管理员 (ProjectAdmin) | 项目管理、成员管理、策略配置、镜像操作 |
| 开发者 (Developer) | 镜像推送和拉取 |
| 访客 (Guest) | 仅镜像拉取(只读) |
| 受限访客 (LimitedGuest) | 仅拉取公开镜像 |
| 自定义角色 (Custom) | 按需配置细粒度权限 |
# 添加项目成员
curl -X POST "https://harbor.example.com/api/v2.0/projects/production/members" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"role_id": 2,
"member_user": {
"username": "developer1"
}
}'
# role_id: 1=ProjectAdmin, 2=Developer, 3=Guest, 4=LimitedGuest3.3 机器人账号
机器人账号用于 CI/CD 系统自动化认证,支持细粒度权限控制。
# 创建机器人账号
curl -X POST "https://harbor.example.com/api/v2.0/robots" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"name": "gitlab-ci",
"description": "GitLab CI 推送镜像用",
"disable": false,
"level": "project",
"duration": -1,
"permissions": [
{
"kind": "project",
"namespace": "production",
"access": [
{"resource": "repository", "action": "push"},
{"resource": "repository", "action": "pull"},
{"resource": "artifact", "action": "list"}
]
}
]
}'
# 返回结果中包含 token,请妥善保存
# {"name": "robot$gitlab-ci", "token": "harbor_xxxxxx"}四、镜像管理
4.1 推送与拉取
# 登录 Harbor
docker login harbor.example.com -u admin -p password
# 使用机器人账号登录
docker login harbor.example.com -u 'robot$gitlab-ci' -p 'harbor_xxxxxx'
# 标记镜像
docker tag nginx:1.25-alpine harbor.example.com/production/nginx:1.25-alpine
# 推送镜像
docker push harbor.example.com/production/nginx:1.25-alpine
# 拉取镜像
docker pull harbor.example.com/production/nginx:1.25-alpine
# 使用 ORAS(OCI 制品工具)推送 Helm Chart
oras push harbor.example.com/production/my-chart:v1.0 \
--artifact-type application/vnd.cncf.helm.chart \
my-chart-1.0.tgz:application/tar+gzip4.2 镜像复制 (Replication)
复制功能支持在 Harbor 实例之间或 Harbor 与其他镜像仓库之间同步镜像,适用于多机房、多云架构。
复制规则配置策略:
| 策略维度 | 选项 |
|---|---|
| 触发模式 | 手动、定时、事件驱动(推镜像时自动触发) |
| 过滤条件 | 仓库名、标签名、资源类型 |
| 覆盖策略 | 总是覆盖、跳过已存在、按标签匹配覆盖 |
| 带宽限速 | 限制复制速度(KB/s) |
| 删除同步 | 源端删除时同步删除目标端 |
# 通过 API 创建复制规则
curl -X POST "https://harbor.example.com/api/v2.0/replication/policies" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"name": "sync-to-aws-ecr",
"description": "跨云同步到 AWS ECR",
"src_registry": {
"id": 1
},
"dest_registry": {
"id": 2,
"name": "aws-ecr",
"type": "aws-ecr",
"endpoint_url": "https://123456789.dkr.ecr.cn-north-1.amazonaws.com",
"credential": {
"access_key": "AKIAXXXXXX",
"access_secret": "xxxxxx"
}
},
"filters": [
{"type": "name", "value": "production/**"},
{"type": "tag", "value": "v*"}
],
"trigger": {
"type": "event_based",
"trigger_settings": {}
},
"deletion": true,
"override": true,
"speed": -1
}'跨机房/跨云同步拓扑:
上海机房 Harbor (主)
|
+---> 北京机房 Harbor (定时同步,每 10 分钟)
|
+---> AWS ECR (事件驱动,推镜像即同步)
|
+---> Alibaba ACR (手动触发,审计后同步)4.3 垃圾回收 (GC)
镜像被删除后,底层存储层(blob)不会立即释放。垃圾回收用于清理未被引用的 blob,释放存储空间。
# harbor.yml 在线 GC 配置
gc:
enabled: true
# 调度方式:手动 / 定时
# 推荐在业务低峰期执行# 手动执行垃圾回收(Docker Compose 部署)
docker-compose stop registry
docker-compose run --rm registry garbage-collect /etc/registry/config.yml
docker-compose start registry
# 通过 API 触发在线 GC
curl -X POST "https://harbor.example.com/api/v2.0/system/gc/schedule" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"schedule": {
"type": "Weekly",
"cron": "0 0 3 * * 0"
}
}'
# 查看 GC 历史
curl "https://harbor.example.com/api/v2.0/system/gc" \
-u "admin:password"五、安全扫描
5.1 扫描器架构
Harbor 支持多种漏洞扫描引擎,可通过 Scanner Adapter 机制集成。
| 扫描器 | 特点 |
|---|---|
| Clair | CoreOS 开源,支持 CVE 数据库,v2 版本后需单独部署 |
| Trivy | Aqua Security 开源,扫描速度快,漏洞库全面,支持 OS 包和语言依赖 |
| 第三方扫描器 | 通过 Scanner Adapter 标准接口集成 |
5.2 Trivy 扫描器配置
# harbor.yml
trivy:
enabled: true
# 漏洞数据库更新
github_token: "" # 匿名可下载,但有频率限制
skip_update: false # 首次部署建议开启,启动后再手动更新
# 扫描资源限制
replicas: 1
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi# 手动触发镜像扫描
curl -X POST "https://harbor.example.com/api/v2.0/projects/production/repositories/nginx/artifacts/1.25-alpine/scan" \
-u "admin:password"
# 查看扫描结果
curl "https://harbor.example.com/api/v2.0/projects/production/repositories/nginx/artifacts/1.25-alpine/scan/report" \
-u "admin:password"5.3 扫描策略配置
在项目级别配置自动扫描和漏洞阻止:
# 项目元数据配置
metadata:
auto_scan: true # 推送镜像后自动扫描
prevent_vul: true # 启用漏洞阻止
severity: "high" # 阻止级别:high / critical
reuse_sys_cve_allowlist: false # 是否复用系统级 CVE 白名单CVE 白名单:允许某些已知漏洞通过阻止策略。
# 设置项目级 CVE 白名单
curl -X PUT "https://harbor.example.com/api/v2.0/projects/production" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"cve_allowlist": {
"items": [
{"cve_id": "CVE-2023-1234"},
{"cve_id": "CVE-2024-5678"}
]
}
}'5.4 CVE 报告解读
扫描报告包含以下关键信息:
| 字段 | 含义 |
|---|---|
| CVE ID | 漏洞唯一编号,如 CVE-2024-21626 |
| 严重级别 | Critical / High / Medium / Low / None |
| CVSS 评分 | 通用漏洞评分系统,0-10 分 |
| 包名称 | 受影响的软件包,如 libcrypto3 |
| 安装版本 | 当前安装的版本号 |
| 修复版本 | 包含修复的版本号 |
| CVE 描述 | 漏洞简要描述和影响范围 |
报告解读示例:
+------------------------+--------+-------+------------+-------------+
| 包名称 | 严重性 | CVSS | 安装版本 | 修复版本 |
+------------------------+--------+-------+------------+-------------+
| libcrypto3 | HIGH | 7.5 | 3.0.8-r1 | 3.0.9-r0 |
| libssl3 | HIGH | 7.5 | 3.0.8-r1 | 3.0.9-r0 |
| curl | MEDIUM | 5.3 | 7.88.1-r1 | 7.88.1-r2 |
+------------------------+--------+-------+------------+-------------+处理方法:
- Critical/High:立即升级基础镜像版本
- Medium:评估影响范围,纳入下次迭代
- Low/None:可忽略或添加白名单
5.5 漏洞阻止策略
当镜像被阻止时(扫描结果包含超过阈值的漏洞):
# 尝试拉取被阻止的镜像
docker pull harbor.example.com/production/nginx:1.25-alpine
# Error: image with vulnerabilities cannot be pulled due to policy
# 查看阻止原因
# 在 Harbor Web UI -> 项目 -> 镜像仓库 -> 镜像标签 -> 扫描报告
# 管理员可通过 API 绕过
curl -X PUT "https://harbor.example.com/api/v2.0/projects/production" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{"metadata": {"prevent_vul": "false"}}'六、镜像签名
6.1 Cosign 签名机制
Cosign 是 Sigstore 项目的一部分,支持对容器镜像进行数字签名和验证。Harbor 2.5+ 支持 Cosign 签名的存储和验证。
安装 Cosign:
# Linux / macOS
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-$(uname -m)"
chmod +x cosign-$(uname -m)
sudo mv cosign-$(uname -m) /usr/local/bin/cosign生成密钥对:
# 生成密钥对(非生产用)
cosign generate-key-pair
# 使用 KMS(生产推荐)
cosign generate-key-pair --kms gcp-kms://projects/xxx/locations/global/keyRings/cosign/cryptoKeys/signing-key
# 使用 硬件安全模块(HSM)
cosign generate-key-pair --kms azure-kms://https://xxx.vault.azure.net/keys/cosign-key/yyy签名镜像:
# 使用私钥签名
cosign sign --key cosign.key harbor.example.com/production/nginx:1.25-alpine
# 使用 KMS 签名
cosign sign --kms gcp-kms://projects/xxx/locations/global/keyRings/cosign/cryptoKeys/signing-key \
harbor.example.com/production/nginx:1.25-alpine
# 使用密钥环(keyless)签名(需要 OIDC 认证)
cosign sign harbor.example.com/production/nginx:1.25-alpine验证签名:
# 使用公钥验证
cosign verify --key cosign.pub harbor.example.com/production/nginx:1.25-alpine
# 验证结果示例
# Verification for harbor.example.com/production/nginx:1.25-alpine --
# The following checks were performed on each of these signatures:
# - The cosign claims were validated
# - The signatures were verified against the specified public key
# - Any certificates were verified against the Fulcio roots.6.2 Harbor 中的签名策略
Harbor 项目可配置签名验证策略,要求所有镜像必须经过签名。
# 启用项目级签名验证
curl -X PUT "https://harbor.example.com/api/v2.0/projects/production" \
-H "Content-Type: application/json" \
-u "admin:password" \
-d '{
"metadata": {
"enable_content_trust": "true"
}
}'Webhook 集成签名验证:
# Harbor Webhook 配置,推送到 CI 系统验证签名
webhooks:
- name: cosign-verify
targets:
- address: https://jenkins.example.com/harbor-webhook
auth_header: "Bearer <token>"
event_types:
- artifact:push
- artifact:scan启用签名验证后:
- 推送的镜像必须包含有效的 Cosign 签名
- 未签名的镜像将被拒绝
- 拉取时自动验证签名
- Webhook 通知 CI 系统执行额外验证
七、集成 CI/CD
7.1 GitLab CI 集成
# .gitlab-ci.yml
variables:
HARBOR_URL: harbor.example.com
HARBOR_PROJECT: production
HARBOR_ROBOT_NAME: "robot$gitlab-ci"
HARBOR_ROBOT_TOKEN: "harbor_xxxxxx"
APP_NAME: my-service
stages:
- build
- scan
- sign
- deploy
build:
stage: build
image: docker:24.0
services:
- docker:24.0-dind
script:
# 使用机器人账号登录 Harbor
- echo "$HARBOR_ROBOT_TOKEN" | docker login $HARBOR_URL -u "$HARBOR_ROBOT_NAME" --password-stdin
# 构建并推送镜像
- docker build -t $HARBOR_URL/$HARBOR_PROJECT/$APP_NAME:$CI_COMMIT_SHORT_SHA .
- docker push $HARBOR_URL/$HARBOR_PROJECT/$APP_NAME:$CI_COMMIT_SHORT_SHA
scan:
stage: scan
script:
# 等待 Harbor 自动扫描完成(或通过 API 触发扫描)
- apk add --no-cache curl
- |
curl -X POST "https://$HARBOR_URL/api/v2.0/projects/$HARBOR_PROJECT/repositories/$APP_NAME/artifacts/$CI_COMMIT_SHORT_SHA/scan" \
-u "$HARBOR_ROBOT_NAME:$HARBOR_ROBOT_TOKEN"
# 轮询等待扫描完成
- |
for i in $(seq 1 30); do
STATUS=$(curl -s "https://$HARBOR_URL/api/v2.0/projects/$HARBOR_PROJECT/repositories/$APP_NAME/artifacts/$CI_COMMIT_SHORT_SHA/scan/report" \
-u "$HARBOR_ROBOT_NAME:$HARBOR_ROBOT_TOKEN" | jq -r '.scan_overview[0].scan_status')
if [ "$STATUS" = "Success" ]; then
echo "Scan completed"
break
fi
sleep 5
done
sign:
stage: sign
image: gcr.io/projectsigstore/cosign:v2
script:
- cosign sign --key /keys/cosign.key $HARBOR_URL/$HARBOR_PROJECT/$APP_NAME:$CI_COMMIT_SHORT_SHA
deploy:
stage: deploy
script:
- kubectl set image deployment/$APP_NAME $APP_NAME=$HARBOR_URL/$HARBOR_PROJECT/$APP_NAME:$CI_COMMIT_SHORT_SHA7.2 Jenkins 集成
// Jenkinsfile
pipeline {
agent any
environment {
HARBOR_URL = 'harbor.example.com'
HARBOR_PROJECT = 'production'
HARBOR_CREDENTIAL = credentials('harbor-robot-account')
APP_NAME = 'my-service'
IMAGE_TAG = "${env.BUILD_NUMBER}-${env.GIT_COMMIT.take(8)}"
}
stages {
stage('Build & Push') {
steps {
script {
docker.withRegistry("https://${HARBOR_URL}", 'harbor-robot-account') {
def customImage = docker.build("${HARBOR_URL}/${HARBOR_PROJECT}/${APP_NAME}:${IMAGE_TAG}")
customImage.push()
customImage.push('latest')
}
}
}
}
stage('Security Scan') {
steps {
script {
// 触发 Harbor 扫描
def scanResult = sh(
script: """
curl -s -X POST "https://${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT}/repositories/${APP_NAME}/artifacts/${IMAGE_TAG}/scan" \
-u "${HARBOR_CREDENTIAL_USR}:${HARBOR_CREDENTIAL_PSW}"
""",
returnStdout: true
)
echo "Scan triggered: ${scanResult}"
// 等待扫描完成并检查结果
sleep(30)
def scanReport = sh(
script: """
curl -s "https://${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT}/repositories/${APP_NAME}/artifacts/${IMAGE_TAG}/scan/report" \
-u "${HARBOR_CREDENTIAL_USR}:${HARBOR_CREDENTIAL_PSW}" | jq -r '.scan_overview[0].summary.total'
""",
returnStdout: true
)
echo "Scan results: ${scanReport}"
}
}
}
stage('Deploy') {
steps {
sh """
sed -i "s|image:.*|image: ${HARBOR_URL}/${HARBOR_PROJECT}/${APP_NAME}:${IMAGE_TAG}|" k8s/deployment.yaml
kubectl apply -f k8s/deployment.yaml
"""
}
}
}
}7.3 Harbor 认证配置
Jenkins 凭据配置:
Dashboard -> Manage Jenkins -> Credentials -> System -> Global credentials -> Add Credentials
Kind: Username with password
Username: robot$gitlab-ci
Password: harbor_xxxxxx
ID: harbor-robot-account
Description: Harbor 机器人账号Kubernetes pull secret 配置:
# 创建 Docker registry secret
kubectl create secret docker-registry harbor-pull-secret \
--docker-server=harbor.example.com \
--docker-username='robot$k8s-node' \
--docker-password='harbor_xxxxxx' \
--namespace=production
# 在 Pod 中引用
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
imagePullSecrets:
- name: harbor-pull-secret
containers:
- name: app
image: harbor.example.com/production/my-service:latest
EOF八、与公有云镜像仓库对比
8.1 Docker Hub
| 维度 | Harbor | Docker Hub |
|---|---|---|
| 部署方式 | 私有部署 | 公有 SaaS |
| 数据主权 | 数据在企业内部 | 数据存储在 Docker 服务器 |
| 拉取限速 | 无限制 | 匿名 100 次/6h,认证 200 次/6h |
| 安全扫描 | Trivy/Clair 集成 | Docker Scout(付费) |
| 镜像复制 | 多目标复制 | 仅自动构建复制 |
| Helm Chart | 原生支持 | 不支持 |
| 价格 | 免费开源 | 付费计划 $5+/月 |
| 访问控制 | RBAC + 机器人账号 | 团队/组织(付费) |
8.2 AWS ECR
| 维度 | Harbor | AWS ECR |
|---|---|---|
| 部署方式 | 私有部署 | 托管服务 |
| 平台锁定 | 无 | 强绑定 AWS 生态 |
| 扫描能力 | Trivy/Clair | AWS Inspector(基础扫描免费,增强扫描付费) |
| 跨区域复制 | 支持多目标 | 仅同区域 |
| 生命周期策略 | GC + 手动清理 | 基于标签和时间的自动清理 |
| 访问控制 | RBAC | IAM 策略 |
| 费用 | 免费 | 存储 $0.10/GB/月 + 数据传输费 |
| 审计日志 | 内置操作日志 | CloudTrail |
8.3 Alibaba ACR
| 维度 | Harbor | Alibaba ACR |
|---|---|---|
| 部署方式 | 私有部署 | 托管服务(个人版/企业版) |
| 网络延迟 | 局域网内延迟极低 | 公网/专线访问 |
| 同步策略 | 推拉双向复制 | 全球自动同步(企业版) |
| 安全扫描 | Trivy/Clair 集成 | 内置扫描(企业版) |
| 镜像加速 | P2P 分发(Dragonfly) | 按地域就近访问 |
| 访问控制 | RBAC | RAM 访问控制 |
| 费用 | 免费 | 个人版免费(限 3 个命名空间) |
| 中国企业合规 | 需自行认证 | 已通过等保、可信云认证 |
8.4 选型建议
| 场景 | 推荐方案 |
|---|---|
| 企业内部自建、数据敏感 | Harbor 私有部署 |
| 纯 AWS 云原生环境 | AWS ECR |
| 纯阿里云环境 | Alibaba ACR |
| 小型团队、快速原型 | Docker Hub / 个人版 ACR |
| 混合云/多云架构 | Harbor 作为中心节点,复制到各云厂商镜像仓库 |
九、生产最佳实践
9.1 高可用部署
- 使用 Helm 部署在 Kubernetes 上,利用 K8s 的自动恢复能力
- 数据库使用外部高可用 PostgreSQL(如 RDS)
- Registry 存储挂载 S3/OSS 等对象存储
- 多副本运行 core、jobservice、registry 组件
- 配置健康检查和 Pod 反亲和性
9.2 安全加固
- 强制开启 HTTPS,禁用 HTTP
- 使用机器人账号替代个人用户密码
- 开启漏洞扫描和漏洞阻止策略
- 配置镜像签名验证
- 定期更新 Harbor 版本
- 审计 API 访问日志
9.3 存储规划
# 对象存储配置示例(阿里云 OSS)
storage_service:
s3:
region: oss-cn-beijing
bucket: harbor-registry
accesskey: LTAIxxxxxx
secretkey: xxxxxx
rootdirectory: /registry
secure: true
v4auth: true
chunksize: 5242880
rootca: ""
storageclass: STANDARD
# 对象存储配置示例(AWS S3)
storage_service:
s3:
region: cn-north-1
bucket: harbor-registry
accesskey: AKIAxxxxxx
secretkey: xxxxxx
rootdirectory: /registry
secure: true
v4auth: true9.4 监控告警
# Helm 部署时启用 Prometheus 指标
metrics:
enabled: true
path: /metrics
port: 9090
# Prometheus 告警规则示例
groups:
- name: harbor
rules:
- alert: HarborStorageUsage
expr: (harbor_storage_usage_bytes / harbor_storage_total_bytes) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Harbor 存储使用率超过 85%"
- alert: HarborJobFailure
expr: rate(harbor_job_total{status="error"}[5m]) > 0
for: 2m
labels:
severity: critical
annotations:
summary: "Harbor 后台任务失败率过高"9.5 备份与恢复
# 备份 Harbor 配置和数据库
docker exec harbor-db pg_dump -U postgres registry -f /tmp/harbor_backup.sql
docker cp harbor-db:/tmp/harbor_backup.sql /data/backup/
# 备份 registry 数据
# 文件系统:直接备份 /data/registry 目录
# S3/OSS:使用云厂商的快照或跨区域复制功能
# 恢复
docker cp /data/backup/harbor_backup.sql harbor-db:/tmp/
docker exec harbor-db psql -U postgres -d registry -f /tmp/harbor_backup.sql