Harbor 私有镜像仓库部署与运维
一、概述
Harbor 是一个开源的容器镜像仓库,提供镜像存储、复制、安全扫描、用户管理等功能。适用于企业内部搭建私有 Docker 镜像仓库,满足镜像安全、合规、分发等需求。
1.1 核心功能
- 镜像存储与管理:支持 Docker、Helm Chart 存储
- 多租户支持:基于角色的访问控制(RBAC)
- 安全扫描:集成 Clair/Trivy 进行漏洞扫描
- 镜像复制:支持多实例间镜像同步
- 镜像签名:支持 Notary 签名验证
- 审计日志:记录所有操作行为
1.2 架构组件
1 2 3 4 5 6 7 8 9
| ┌─────────────────────────────────────────────────────────┐ │ Harbor │ ├─────────────┬─────────────┬─────────────┬──────────────┤ │ Nginx │ Core │ Registry │ Database │ │ (Proxy) │ (Service) │ (Storage) │ (PostgreSQL)│ ├─────────────┼─────────────┼─────────────┼──────────────┤ │ Redis │ Trivy │ Notary │ ChartMuseum│ │ (Cache) │ (Scanner) │ (Signer) │ (Helm Repo) │ └─────────────┴─────────────┴─────────────┴──────────────┘
|
二、部署准备
2.1 系统要求
| 组件 |
最低配置 |
推荐配置 |
| CPU |
2 核 |
4 核+ |
| 内存 |
4GB |
8GB+ |
| 磁盘 |
50GB |
200GB+(SSD) |
| 系统 |
CentOS 7+/Ubuntu 18.04+ |
64 位 Linux |
2.2 依赖软件
1 2 3 4 5 6 7 8
| docker --version
docker compose version
openssl version
|
2.3 网络规划
| 端口 |
协议 |
用途 |
| 80/443 |
TCP |
HTTP/HTTPS 访问 |
| 5000 |
TCP |
Registry API(内部) |
| 5432 |
TCP |
PostgreSQL(内部) |
| 6379 |
TCP |
Redis(内部) |
三、安装部署
3.1 下载 Harbor
1 2 3 4 5 6
| wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
tar -zxvf harbor-offline-installer-v2.9.0.tgz cd harbor
|
3.2 配置 Harbor
编辑 harbor.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| hostname: harbor.example.com
http: port: 80
https: port: 443 certificate: /data/cert/server.crt private_key: /data/cert/server.key
harbor_admin_password: Harbor12345
database: password: root123 max_idle_conns: 50 max_open_conns: 1000
data_volume: /data
trivy: ignore_unfixed: false skip_update: false offline_scan: false insecure: false
log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor
|
3.3 生成自签名证书(测试环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| mkdir -p /data/cert
openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.example.com" \ -key ca.key -out ca.crt
openssl genrsa -out server.key 4096 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.example.com" \ -key server.key -out server.csr
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=harbor IP.1=192.168.1.10 EOF
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in server.csr \ -out server.crt
|
3.4 安装 Harbor
1 2 3 4 5
| ./install.sh
docker compose up -d
|
3.5 验证安装
1 2 3 4 5 6 7 8 9
| docker compose ps
docker compose logs -f core
|
四、配置与管理
4.1 Docker 客户端配置
1 2 3 4 5 6 7 8 9
| sudo cp /data/cert/ca.crt /etc/docker/certs.d/harbor.example.com/ca.crt sudo systemctl restart docker
{ "insecure-registries": ["harbor.example.com"] }
|
4.2 创建项目
1 2 3 4 5
| curl -u "admin:Harbor12345" -X POST \ -H "Content-Type: application/json" \ -d '{"project_name": "myproject", "public": false}' \ http://harbor.example.com/api/v2.0/projects
|
4.3 推送镜像
1 2 3 4 5 6 7 8 9 10 11 12
| docker login harbor.example.com
docker tag nginx:latest harbor.example.com/myproject/nginx:latest
docker push harbor.example.com/myproject/nginx:latest
docker pull harbor.example.com/myproject/nginx:latest
|
4.4 用户管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| curl -u "admin:Harbor12345" -X POST \ -H "Content-Type: application/json" \ -d '{ "username": "developer", "email": "dev@example.com", "realname": "Developer", "password": "Dev123456", "comment": "开发团队" }' \ http://harbor.example.com/api/v2.0/users
curl -u "admin:Harbor12345" -X POST \ -H "Content-Type: application/json" \ -d '{ "role_id": 2, "member_user": {"username": "developer"} }' \ http://harbor.example.com/api/v2.0/projects/1/members
|
4.5 角色权限
| 角色 |
权限 |
| 项目管理员 |
项目管理、成员管理、镜像管理 |
| 开发人员 |
推送/拉取镜像、查看扫描结果 |
| 访客 |
仅拉取公开镜像 |
五、安全配置
5.1 漏洞扫描
1 2 3 4 5 6 7 8 9 10
|
curl -u "admin:Harbor12345" -X POST \ http://harbor.example.com/api/v2.0/projects/myproject/repositories/nginx%2Flatest/scan
curl -u "admin:Harbor12345" \ http://harbor.example.com/api/v2.0/projects/myproject/repositories/nginx%2Flatest/vulnerabilities
|
5.2 镜像签名
1 2 3 4 5 6 7 8 9 10 11
| export DOCKER_CONTENT_TRUST=1
docker trust key generate
docker trust sign harbor.example.com/myproject/nginx:latest
docker trust inspect harbor.example.com/myproject/nginx:latest
|
5.3 访问控制
1 2 3 4 5 6 7 8 9
|
robot_enabled: true
session_timeout: 60
uaa_client_secret: ""
|
六、高可用部署
6.1 外部数据库
1 2 3 4 5 6 7 8 9 10 11
| external_database: type: postgresql host: pg-cluster.example.com port: 5432 username: harbor password: Harbor_DB_Pass core_database: registry registry_database: registry notary_server_database: notary_server notary_signer_database: notary_signer
|
6.2 外部 Redis
1 2 3 4 5
| external_redis: host: redis-cluster.example.com port: 6379 password: Redis_Pass
|
6.3 共享存储
1 2 3 4 5 6 7 8 9 10
| storage_service: filesystem: rootdirectory: /data/registry
|
6.4 多实例部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
upstream harbor { server harbor1.example.com weight=1; server harbor2.example.com weight=1; }
server { listen 443 ssl; server_name harbor.example.com; location / { proxy_pass http://harbor; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
七、镜像复制
7.1 配置复制端点
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl -u "admin:Harbor12345" -X POST \ -H "Content-Type: application/json" \ -d '{ "name": "backup-harbor", "type": "harbor", "url": "https://backup.example.com", "credential": { "type": "basic", "access_key": "admin", "access_secret": "Harbor12345" } }' \ http://harbor.example.com/api/v2.0/registries
|
7.2 创建复制规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl -u "admin:Harbor12345" -X POST \ -H "Content-Type: application/json" \ -d '{ "name": "backup-rule", "description": "备份到灾备中心", "src_registry": null, "dest_registry": {"id": 1}, "dest_namespace": "backup", "filters": [{"type": "project", "value": "myproject"}], "trigger": {"type": "manual"}, "speed": -1 }' \ http://harbor.example.com/api/v2.0/replication/policies
|
八、运维管理
8.1 日志管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker compose logs -f core docker compose logs -f registry docker compose logs -f trivy
/var/log/harbor/
log: level: info local: rotate_count: 50 rotate_size: 200M
|
8.2 备份与恢复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| pg_dump -h localhost -U harbor -d registry > registry_backup.sql
tar -czvf harbor_data_backup.tar.gz /data
docker compose down
tar -xzvf harbor_data_backup.tar.gz -C /
psql -h localhost -U harbor -d registry < registry_backup.sql
docker compose up -d
|
8.3 升级 Harbor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz tar -zxvf harbor-offline-installer-v2.10.0.tgz
cp harbor.yml /tmp/harbor.yml.bak
cd harbor ./install.sh --upgrade
docker compose ps
|
8.4 监控指标
九、常见问题排查
9.1 无法登录
1 2 3 4 5 6 7 8
| docker compose logs nginx
docker compose logs core
openssl s_client -connect harbor.example.com:443 -showcerts
|
9.2 推送失败
1 2 3 4 5 6 7 8
| docker compose logs registry
df -h /data
ls -la /data/registry
|
9.3 扫描失败
1 2 3 4 5 6 7 8
| docker compose logs trivy
docker compose exec trivy trivy image --download-db-only
docker compose exec trivy ping github.com
|
9.4 数据库连接失败
1 2 3 4 5
| docker compose logs database
docker compose exec database psql -U harbor -d registry -c "SELECT 1"
|
十、最佳实践
10.1 命名规范
1 2 3 4 5 6 7
| # 项目命名 {部门}/{应用} 例如:backend/api-gateway
# 镜像标签 {应用}:{版本}-{环境} 例如:api-gateway:1.2.3-prod
|
10.2 清理策略
1 2 3 4 5 6 7 8
|
curl -u "admin:Harbor12345" -X PUT \ -H "Content-Type: application/json" \ -d '{"retention_id": 1, "scope": {"level": "project", "ref": 1}}' \ http://harbor.example.com/api/v2.0/retentions
|
10.3 安全建议
- 启用 HTTPS:生产环境必须使用 HTTPS
- 定期更新:及时升级 Harbor 和 Trivy 漏洞库
- 最小权限:按角色分配最小必要权限
- 审计日志:定期检查操作日志
- 网络隔离:Harbor 部署在内网,通过反向代理对外
10.4 性能优化
1 2 3 4 5 6 7 8 9 10 11 12
| database: max_idle_conns: 100 max_open_conns: 2000
redis: max_idle: 100 max_active: 500
|
十一、总结
Harbor 是企业级容器镜像仓库的优秀选择,具备以下优势:
- ✅ 功能完整:存储、扫描、签名、复制一站式
- ✅ 易于部署:Docker Compose 一键安装
- ✅ 安全可靠:RBAC、漏洞扫描、镜像签名
- ✅ 扩展性强:支持外部存储、数据库、多实例
合理规划和配置 Harbor,可以为企业容器化转型提供坚实的基础设施支撑。