Docker-搭建私有镜像仓库

引言:为什么需要私有镜像仓库?

在Docker技术普及的今天,镜像管理已成为DevOps流程中的关键环节。公有镜像仓库(如Docker Hub)虽然便捷,但在企业级应用中存在以下痛点:

  1. 安全性风险:敏感镜像(如含密钥的配置)暴露在公网
  2. 网络依赖:国内访问速度慢,影响CI/CD效率
  3. 成本控制:私有仓库可避免公有服务的存储/下载费用
  4. 合规要求:金融/医疗等行业需满足数据本地化存储规范

本文将系统讲解两种主流私有仓库搭建方案:轻量级Registry和企业级Harbor,帮助读者根据实际需求选择合适方案。

一、Docker Registry基础方案

1.1 基础镜像仓库搭建

1.1.1 快速启动

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. registry:2

该命令会启动一个无认证的HTTP仓库,仅适用于内网测试环境。生产环境必须启用HTTPS。

1.1.2 HTTPS配置

生成自签名证书:

  1. mkdir -p certs
  2. openssl req -newkey rsa:4096 -nodes -sha256 \
  3. -keyout certs/domain.key -x5009 -out certs/domain.crt \
  4. -subj "/CN=registry.example.com"

启动带TLS的仓库:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v "$(pwd)"/certs:/certs \
  6. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  7. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  8. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  9. registry:2

1.2 基础认证配置

1.2.1 创建认证文件

  1. mkdir auth
  2. docker run --entrypoint htpasswd \
  3. httpd:2 -Bbn testuser testpass > auth/htpasswd

1.2.2 启动带认证的仓库

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v "$(pwd)"/auth:/auth \
  6. -e "REGISTRY_AUTH=htpasswd" \
  7. -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  8. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  9. -v "$(pwd)"/certs:/certs \
  10. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  11. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  12. registry:2

1.3 存储配置优化

1.3.1 本地存储(默认)

镜像默认存储在容器内的/var/lib/registry,建议通过卷挂载持久化:

  1. -v /data/registry:/var/lib/registry

1.3.2 对象存储集成

支持S3兼容存储(MinIO/AWS S3):

  1. -e REGISTRY_STORAGE=s3 \
  2. -e REGISTRY_STORAGE_S3_ACCESSKEY=accesskey \
  3. -e REGISTRY_STORAGE_S3_SECRETKEY=secretkey \
  4. -e REGISTRY_STORAGE_S3_REGION=us-east-1 \
  5. -e REGISTRY_STORAGE_S3_BUCKET=my-registry \
  6. -e REGISTRY_STORAGE_S3_ENCRYPT=true

二、Harbor企业级方案

2.1 Harbor核心优势

  • 基于角色的访问控制(RBAC)
  • 镜像复制与同步
  • 漏洞扫描(集成Clair)
  • 图形化管理界面
  • 审计日志

2.2 离线安装指南

2.2.1 系统要求

  • Docker Engine 1.10+
  • Docker Compose 1.6.0+
  • 至少4核8GB内存

2.2.2 安装步骤

  1. 下载离线包:

    1. wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
  2. 配置harbor.yml:

    1. hostname: registry.example.com
    2. http:
    3. port: 80
    4. https:
    5. certificate: /path/to/domain.crt
    6. private_key: /path/to/domain.key
    7. harbor_admin_password: Harbor12345
    8. database:
    9. password: root123
  3. 执行安装:

    1. ./install.sh --with-clair --with-trivy

2.3 高级功能配置

2.3.1 复制策略配置

通过Web界面创建复制规则,实现:

  • 多数据中心镜像同步
  • 灾难恢复备份
  • 层级化仓库架构

2.3.2 垃圾回收

定期执行清理未被引用的镜像层:

  1. docker exec -it harbor-core /harbor/harbor_garbage_collect

三、最佳实践与运维建议

3.1 镜像命名规范

采用三级命名体系:

  1. [registry-host]/[project-name]/[image-name]:[tag]
  2. # 示例
  3. registry.example.com/devops/nginx:1.23.4

3.2 性能优化方案

  1. 缓存加速:配置CDN或反向代理缓存
  2. 并发限制:通过REGISTRY_STORAGE_FILESYSTEM_MAXTHREADS参数调整
  3. 存储分片:按项目/团队划分存储目录

3.3 安全加固措施

  1. 定期轮换认证凭证
  2. 启用镜像签名验证
  3. 实施网络隔离策略
  4. 监控异常访问行为

3.4 监控与告警

推荐使用Prometheus+Grafana监控方案,关键指标包括:

  • 存储使用率
  • 请求延迟(P99)
  • 认证失败次数
  • 镜像推送/拉取频率

四、常见问题解决方案

4.1 证书问题处理

现象x509: certificate signed by unknown authority
解决

  1. 将自签名证书添加到客户端信任链
  2. 或配置Docker忽略证书验证(仅测试环境):
    1. echo '{"insecure-registries":["registry.example.com"]}' > /etc/docker/daemon.json
    2. systemctl restart docker

4.2 存储空间不足

解决方案

  1. 执行垃圾回收
  2. 配置存储配额
  3. 扩展存储容量或启用冷热数据分层

4.3 性能瓶颈分析

使用docker statsnmon监控资源使用,典型优化点:

  • 增加Registry容器CPU限制
  • 启用存储驱动缓存
  • 优化网络带宽分配

五、进阶应用场景

5.1 混合云架构

通过Harbor的复制功能实现:

  • 公有云(AWS ECR)与私有云的镜像同步
  • 多区域部署的镜像分发
  • 离线环境的镜像更新

5.2 持续集成集成

在Jenkins/GitLab CI中配置:

  1. pipeline {
  2. agent any
  3. stages {
  4. stage('Build') {
  5. steps {
  6. docker build -t registry.example.com/project/image:$BUILD_ID .
  7. docker push registry.example.com/project/image:$BUILD_ID
  8. }
  9. }
  10. }
  11. }

5.3 镜像安全扫描

配置Trivy自动扫描:

  1. # harbor.yml配置示例
  2. trivy:
  3. ignore_unfixed: false
  4. skip_update: false
  5. severity: HIGH,CRITICAL

结语:选择适合的方案

方案 适用场景 部署复杂度 运维成本
Docker Registry 小型团队/测试环境
Harbor 中大型企业/生产环境 中高

建议从Registry开始验证需求,随着业务发展逐步迁移到Harbor。无论选择哪种方案,关键是要建立完善的镜像管理流程,包括:

  1. 镜像命名规范
  2. 版本控制策略
  3. 定期清理机制
  4. 安全审计流程

通过私有镜像仓库的建设,企业可实现Docker镜像的全生命周期管理,为持续交付提供坚实基础。