简介:本文详细介绍企业级Docker容器镜像仓库Harbor的搭建流程、核心配置及高可用实践,涵盖环境准备、安装部署、安全策略与运维优化,助力开发者构建安全高效的镜像管理体系。
在企业级Docker应用中,镜像仓库是构建持续集成/持续部署(CI/CD)流水线的核心基础设施。Harbor作为CNCF(云原生计算基金会)毕业项目,相比开源Registry提供了企业级增强功能:
典型应用场景包括:
| 组件 | 最小配置 | 推荐配置 |
|---|---|---|
| 服务器 | 4核8G | 8核16G+ |
| 磁盘空间 | 200GB(SSD) | 500GB+(NVMe) |
| 网络带宽 | 100Mbps | 1Gbps+ |
# 检查Docker版本(需19.03+)docker version --format '{{.Server.Version}}'# 检查Docker Compose版本(需1.25+)docker-compose version# 安装依赖工具sudo apt-get install -y apt-transport-https ca-certificates curl
# 获取最新稳定版VERSION=2.9.0wget https://github.com/goharbor/harbor/releases/download/v${VERSION}/harbor-offline-installer-v${VERSION}.tgztar xzf harbor-offline-installer-v${VERSION}.tgzcd harbor
编辑harbor.yml.tmpl(安装前重命名为harbor.yml):
hostname: harbor.example.com # 必须为FQDNhttp:port: 80https:certificate: /data/cert/harbor.crtprivate_key: /data/cert/harbor.keyharbor_admin_password: Harbor12345 # 初始密码database:password: root123max_open_conns: 1000max_idle_conns: 100storage_driver:name: filesystemfilesystem:rootdirectory: /var/lib/registry
# 生成自签名证书(生产环境应使用CA签发)sudo mkdir -p /data/certsudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /data/cert/harbor.key -out /data/cert/harbor.crt \-subj "/CN=harbor.example.com"# 启动安装sudo ./install.sh --with-notary --with-trivy --with-clair
创建项目:
curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" \-d '{"project_name": "devops", "public": false}' \https://harbor.example.com/api/v2.0/projects
添加用户:
# 通过API创建用户curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" \-d '{"username": "devuser", "email": "dev@example.com", "password": "DevPass123"}' \https://harbor.example.com/api/v2.0/users
分配角色:
配置跨数据中心镜像同步:
# 在admin portal -> System Management -> Replication{"name": "us-to-cn","src_registry": {"url": "https://harbor.us.example.com","insecure": false},"dest_registry": {"url": "https://harbor.cn.example.com","insecure": false},"trigger": {"type": "manual", # 或"schedule""schedule_param": {"cron": "0 0 * * *"}},"filters": [{"type": "name","pattern": "^library/.*"}]}
启用Trivy扫描器:
# 在harbor.yml中添加trivy:ignore_unfixed: falseskip_update: falseinsecure: falseseverity: "CRITICAL,HIGH"debug_mode: false
扫描结果查看:
# 获取扫描报告curl -u "admin:Harbor12345" \https://harbor.example.com/api/v2.0/projects/1/repositories/library%2Fnginx/artifacts/latest/vulnerabilities
主库配置my.cnf:
[mysqld]server-id = 1log_bin = mysql-binbinlog_format = ROWbinlog_do_db = registry
从库配置:
[mysqld]server-id = 2relay_log = mysql-relay-binread_only = 1
配置Harbor连接主库:
database:type: mysqlmysql:host: master-db.example.comport: 3306username: harborpassword: SecurePass123ssl_mode: disable
对象存储集成:
storage_driver:name: s3s3:accesskey: AKIAXXXXXXXXXXXXXXsecretkey: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXregion: us-west-2bucket: harbor-registryendpoint: https://s3.us-west-2.amazonaws.comchunksize: "5242880" # 5MBrootdirectory: /registry
本地存储多路径:
# 创建LVM逻辑卷sudo pvcreate /dev/sdb /dev/sdcsudo vgcreate registry_vg /dev/sdb /dev/sdcsudo lvcreate -l 100%FREE -n registry_lv registry_vgsudo mkfs.xfs /dev/registry_vg/registry_lv
配置Filebeat收集日志:
# filebeat.yml配置示例filebeat.inputs:- type: logpaths:- /var/log/harbor/*.logfields_under_root: truefields:app: harboroutput.elasticsearch:hosts: ["es.example.com:9200"]index: "harbor-logs-%{+yyyy.MM.dd}"
关键监控项:
| 指标名称 | 告警阈值 | 检查频率 |
|————————————|————————|—————|
| 磁盘使用率 | >85% | 5分钟 |
| 数据库连接数 | >max_connections*80% | 1分钟 |
| API响应时间(P99) | >500ms | 10分钟 |
| 镜像推送失败率 | >1% | 实时 |
完整备份方案:
# 数据库备份mysqldump -h db.example.com -u harbor -p registry > harbor_db_backup.sql# 配置文件备份tar czf harbor_config_backup.tar.gz /etc/harbor/# 存储备份(使用restic)restic -r s3:https://backup.example.com/harbor backup /var/lib/registry
错误现象:x509: certificate signed by unknown authority
解决方案:
将CA证书添加到Docker信任链:
sudo mkdir -p /etc/docker/certs.d/harbor.example.comsudo cp /data/cert/harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crtsudo systemctl restart docker
或在/etc/docker/daemon.json中配置:
{"insecure-registries": ["harbor.example.com"]}
诊断步骤:
检查Registry日志:
journalctl -u registry -n 100 --no-pager
分析慢查询:
SELECT * FROM information_schema.processlistWHERE TIME > 10ORDER BY TIME DESC;
优化方案:
# 在harbor.yml中registry:storage:cache:layerinfo: redisblobdescriptor: redisredis:host: redis.example.comport: 6379password: RedisPass123
启用Chart博物馆:
# 在harbor.yml中chartmuseum:enabled: true
推送Chart示例:
# 打包Charthelm package mychart/# 登录Harborhelm registry login harbor.example.com --username admin --password Harbor12345# 推送Charthelm push mychart-0.1.0.tgz oci://harbor.example.com/myrepo
创建服务账号:
curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" \-d '{"name": "ci-bot", "disabled": false}' \https://harbor.example.com/api/v2.0/robots
生成访问令牌:
# 获取机器人账号IDROBOT_ID=$(curl -s -u "admin:Harbor12345" \"https://harbor.example.com/api/v2.0/robots?name=ci-bot" | \jq -r '.[0].id')# 创建令牌curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" \-d '{"expires_in": 0}' \"https://harbor.example.com/api/v2.0/robots/$ROBOT_ID/token"
通过系统化的Harbor部署与管理,企业可以构建起安全、高效、可扩展的容器镜像管理体系,为云原生转型奠定坚实基础。实际部署中应结合具体业务场景,在安全性、可用性和成本之间取得平衡。