Docker Compose一键部署Harbor镜像仓库(附SSL证书配置避坑指南)
Docker Compose实战:10分钟构建高可用Harbor镜像仓库(含SSL全自动配置方案)
当团队需要管理大量容器镜像时,单机版Docker Registry很快就会遇到性能瓶颈。上周我们的CI/CD流水线突然崩溃,追查发现竟是自建镜像仓库的磁盘IO爆满导致。这次事故让我彻底明白——是时候上企业级解决方案了。
Harbor作为CNCF毕业项目,不仅提供镜像存储功能,更集成了漏洞扫描、权限管理、多租户支持等生产级特性。本文将分享如何用Docker Compose快速搭建带SSL加密的Harbor服务,特别针对证书配置这个高频踩坑点,给出全自动解决方案。所有配置已通过测试环境验证,适配v2.7+版本。
1. 环境准备与智能检测脚本
在开始前,建议运行这个环境检查脚本一键验证系统状态:
#!/bin/bash # 环境检查脚本 check_docker() { if ! command -v docker &> /dev/null; then echo "❌ Docker未安装" return 1 fi docker_version=$(docker --version | cut -d' ' -f3 | tr -d ',') if [ "$(printf '%s\n' "20.10.0" "$docker_version" | sort -V | head -n1)" != "20.10.0" ]; then echo "❌ Docker版本过低(当前: $docker_version)" return 1 fi echo "✅ Docker $docker_version" } check_compose() { if ! command -v docker-compose &> /dev/null; then echo "❌ Docker Compose未安装" return 1 fi compose_version=$(docker-compose --version | grep -oP '\d+\.\d+\.\d+') if [ "$(printf '%s\n' "1.29.0" "$compose_version" | sort -V | head -n1)" != "1.29.0" ]; then echo "❌ Docker Compose版本过低(当前: $compose_version)" return 1 fi echo "✅ Docker Compose $compose_version" } check_docker && check_compose常见环境问题解决方案:
| 问题类型 | 修复命令 | 适用系统 |
|---|---|---|
| Docker版本过低 | `curl -fsSL https://get.docker.com | sh` |
| Compose未安装 | sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose | 所有Linux |
| 权限不足 | sudo usermod -aG docker $USER && newgrp docker | 需要sudo权限 |
提示:生产环境建议预留至少4核CPU、8GB内存和100GB存储空间,否则可能触发OOM Killer终止Harbor组件
2. 全自动部署方案
传统部署需要手动修改十余个配置项,我们通过环境变量注入实现零配置部署。新建harbor-auto.yml文件:
version: '3.7' services: harbor: image: goharbor/harbor:v2.7.0 container_name: harbor restart: unless-stopped ports: - "80:8080" - "443:8443" volumes: - ./data:/data - ./certs:/etc/harbor/ssl environment: - HARBOR_HOSTNAME=${HOSTNAME:-harbor.local} - HARBOR_ADMIN_PASSWORD=${ADMIN_PWD:-Harbor12345} - DB_PASSWORD=${DB_PWD:-Harbor12345} - CORE_SECRET=${CORE_SECRET:-$(openssl rand -hex 16)} - REGISTRY_STORAGE_DELETE_ENABLED=true depends_on: - redis - postgresql redis: image: redis:6.2-alpine restart: unless-stopped volumes: - ./redis-data:/data postgresql: image: postgres:13-alpine restart: unless-stopped volumes: - ./pg-data:/var/lib/postgresql/data environment: - POSTGRES_USER=harbor - POSTGRES_PASSWORD=${DB_PWD:-Harbor12345} - POSTGRES_DB=registry启动服务时通过.env文件注入配置:
# 生成随机密码和密钥 echo "ADMIN_PWD=$(openssl rand -base64 12)" > .env echo "DB_PWD=$(openssl rand -base64 12)" >> .env echo "HOSTNAME=harbor.yourdomain.com" >> .env # 启动服务 docker-compose -f harbor-auto.yml up -d关键参数说明:
REGISTRY_STORAGE_DELETE_ENABLED=true允许通过API删除镜像CORE_SECRET使用随机生成的密钥增强安全性unless-stopped策略确保异常退出后自动恢复
3. SSL证书自动化配置
自签名证书导致浏览器警告是常见问题,这里给出三种解决方案:
方案A:自动生成可信证书(推荐)
使用mkcert工具生成本地信任的证书:
# 安装mkcert brew install mkcert # macOS sudo apt install libnss3-tools && curl -s https://api.github.com/repos/FiloSottile/mkcert/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d'"' -f4 | wget -qi - && chmod +x mkcert-v*-linux-amd64 && sudo mv mkcert-v*-linux-amd64 /usr/local/bin/mkcert # 生成证书 mkcert -install mkcert "harbor.yourdomain.com" "*.harbor.yourdomain.com" # 自动配置到Harbor mkdir -p certs mv harbor.yourdomain.com*.pem certs/ docker-compose -f harbor-auto.yml down docker-compose -f harbor-auto.yml up -d方案B:Let's Encrypt自动化
适合有公网域名的情况:
# 使用certbot获取证书 sudo apt install certbot certbot certonly --standalone -d harbor.yourdomain.com # 配置证书软链接 ln -s /etc/letsencrypt/live/harbor.yourdomain.com/fullchain.pem certs/harbor.crt ln -s /etc/letsencrypt/live/harbor.yourdomain.com/privkey.pem certs/harbor.key # 设置自动续期 (crontab -l 2>/dev/null; echo "0 3 * * * certbot renew --quiet --post-hook 'docker-compose -f /path/to/harbor-auto.yml restart'") | crontab -方案C:企业证书配置
已有CA证书时的配置方法:
# 转换证书格式(如需) openssl pkcs12 -in cert.pfx -out cert.pem -nodes # 验证证书链 openssl verify -CAfile ca.crt harbor.crt # 目录结构 certs/ ├── ca.crt # CA根证书 ├── harbor.crt # 服务器证书 └── harbor.key # 私钥证书验证命令:
# 检查端口响应 openssl s_client -connect harbor.yourdomain.com:443 -servername harbor.yourdomain.com # 验证证书日期 openssl x509 -in certs/harbor.crt -noout -dates4. 运维监控与故障排查
健康检查方案
内置的健康检查端点:
# API健康检查 curl -k https://harbor.yourdomain.com/api/v2.0/health | jq # 组件状态检查 docker-compose -f harbor-auto.yml ps # 资源监控 docker stats $(docker-compose -f harbor-auto.yml ps -q)常见故障处理指南:
| 故障现象 | 排查命令 | 解决方案 |
|---|---|---|
| 503 Service Unavailable | docker logs harbor-core | 检查数据库连接,确认postgresql容器运行 |
| 证书不受信任 | openssl verify -CAfile ca.crt harbor.crt | 确保证书链完整,客户端安装CA证书 |
| 镜像推送失败 | `docker info | grep -A5 Insecure Registries` |
| 存储空间不足 | docker system df | 清理旧镜像或扩展存储卷 |
性能优化参数
在harbor-auto.yml中添加这些调优参数:
services: harbor: environment: - REGISTRY_HTTP_MAX_CONNECTIONS=1000 - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=redis - REGISTRY_REDIS_ADDR=redis:6379 - JOBSERVICE_POOL_WORKERS=10 deploy: resources: limits: cpus: '4' memory: 8G日志分析技巧:
# 实时错误监控 tail -f ./data/log/harbor/*.log | grep -E 'ERROR|WARN' # 请求耗时分析 cat ./data/log/nginx/access.log | awk '{print $1,$4,$7,$NF}' | sort -k4 -nr | head5. 高级功能配置
镜像自动清理
配置定期清理策略(每周日凌晨3点):
services: harbor-jobservice: environment: - CLEANUP_CRON="0 3 * * 0" - CLEANUP_DRY_RUN=false - CLEANUP_KEEP_COUNT=10手动触发清理:
curl -X POST -H "Authorization: Basic $(echo -n "admin:$ADMIN_PWD" | base64)" https://harbor.yourdomain.com/api/v2.0/system/gc/schedule -d '{"schedule":{"type":"Manual"},"parameters":{"delete_untagged":true}}'漏洞扫描集成
启用Trivy扫描器:
services: trivy: image: goharbor/trivy-adapter:v2.7.0 container_name: trivy restart: unless-stopped volumes: - ./trivy-cache:/root/.cache environment: - SCANNER_LOG_LEVEL=debug - TRIVY_NON_SSL=true扫描策略配置示例:
{ "scan_all": false, "daily_scan": true, "scan_on_push": true, "severity_threshold": "high" }多租户权限管理
通过API创建项目并设置权限:
# 创建项目 curl -X POST -H "Authorization: Basic $(echo -n "admin:$ADMIN_PWD" | base64)" -H "Content-Type: application/json" -d '{"project_name": "prod","metadata": {"public": "false"}}' https://harbor.yourdomain.com/api/v2.0/projects # 添加用户 curl -X POST -H "Authorization: Basic $(echo -n "admin:$ADMIN_PWD" | base64)" -H "Content-Type: application/json" -d '{"username": "dev1","email": "dev1@company.com","password": "Dev12345","realname": "Developer 1"}' https://harbor.yourdomain.com/api/v2.0/users # 设置权限 curl -X POST -H "Authorization: Basic $(echo -n "admin:$ADMIN_PWD" | base64)" -H "Content-Type: application/json" -d '{"role_id": 2,"member_user": {"username": "dev1"}}' https://harbor.yourdomain.com/api/v2.0/projects/prod/members权限角色对照表:
| 角色ID | 角色名称 | 权限范围 |
|---|---|---|
| 1 | 项目管理员 | 所有操作 |
| 2 | 开发人员 | 推送/拉取镜像 |
| 3 | 访客 | 仅拉取 |
| 4 | 维护人员 | 推送/拉取+扫描 |
