从0到1:手把手搭建私有镜像仓库并推送镜像指南

一、为什么需要自建镜像仓库?

在云原生时代,容器镜像已成为软件交付的标准载体。但使用公有云镜像仓库(如Docker Hub、阿里云ACR)可能面临以下问题:

  • 网络依赖:跨地域拉取镜像速度慢,甚至因网络策略无法访问
  • 安全风险:敏感镜像存储在第三方平台存在数据泄露隐患
  • 成本问题:公有云服务按存储量/流量计费,长期使用成本高
  • 定制需求:企业需要集成权限控制、镜像扫描等高级功能

自建镜像仓库能实现:

  • 完全掌控镜像生命周期
  • 提升内网环境下的镜像分发效率
  • 满足等保2.0等合规要求
  • 与CI/CD流水线深度集成

二、方案选型:Docker Registry vs Harbor

1. 基础版:Docker Registry

适用场景:个人开发者、小型团队、测试环境
优势:轻量级(仅10MB+)、开箱即用、支持基础鉴权
架构:单节点无存储冗余,适合非生产环境

部署步骤(Ubuntu 22.04示例)

  1. # 1. 安装依赖
  2. sudo apt update
  3. sudo apt install -y docker.io
  4. # 2. 启动Registry容器(带基础鉴权)
  5. mkdir -p /auth
  6. docker run --entrypoint htpasswd \
  7. httpd:2 -Bbn admin password123 > /auth/htpasswd
  8. docker run -d \
  9. -p 5000:5000 \
  10. --restart=always \
  11. --name registry \
  12. -v /auth:/auth \
  13. -e REGISTRY_AUTH=htpasswd \
  14. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  15. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  16. -v /var/lib/registry:/var/lib/registry \
  17. registry:2.7.1

关键配置说明

  • -v /var/lib/registry:持久化存储镜像数据
  • 鉴权配置防止未授权访问
  • 建议配置Nginx反向代理(添加HTTPS支持)

2. 企业版:Harbor

适用场景:中大型企业、生产环境、需要高级功能
优势:RBAC权限管理、镜像扫描、漏洞检测、复制策略、UI管理
架构:支持HA部署、集成Notary签名服务

部署步骤(使用离线安装包)

  1. # 1. 下载Harbor安装包(以v2.9.0为例)
  2. wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
  3. tar xzf harbor-offline-installer-v2.9.0.tgz
  4. cd harbor
  5. # 2. 修改配置文件
  6. cp harbor.yml.tmpl harbor.yml
  7. vi harbor.yml
  8. # 关键修改项:
  9. # hostname: registry.example.com
  10. # https:
  11. # certificate: /path/to/cert.pem
  12. # private_key: /path/to/key.pem
  13. # harbor_admin_password: Harbor12345
  14. # 3. 执行安装
  15. ./install.sh

高级配置建议

  • 配置存储后端(如AWS S3、MinIO)
  • 启用自动镜像扫描(集成Clair或Trivy)
  • 设置垃圾回收策略(./prepare脚本配置)

三、镜像推送全流程演示

1. 标记镜像

  1. # 本地构建测试镜像
  2. docker build -t myapp:v1 .
  3. # 标记为私有仓库地址(以Harbor为例)
  4. docker tag myapp:v1 registry.example.com/library/myapp:v1

命名规范

  • 公有仓库:docker.io/username/image:tag
  • 私有仓库:registry.domain.com/project/image:tag

2. 登录仓库

  1. # Docker Registry方式
  2. docker login registry.example.com:5000
  3. # 输入用户名/密码
  4. # Harbor方式(带项目权限)
  5. docker login registry.example.com
  6. # 使用Harbor管理员账号或项目成员账号

安全建议

  • 使用--password-stdin避免密码明文存储
  • 配置机器用户(Machine User)用于CI/CD

3. 推送镜像

  1. docker push registry.example.com/library/myapp:v1

常见问题处理

  • 401 Unauthorized:检查登录凭证和项目权限
  • 500 Internal Error:查看Registry日志(docker logs registry
  • 推送缓慢:调整Registry的storage.delete.enabled配置

4. 拉取验证

  1. # 删除本地镜像后重新拉取
  2. docker rmi registry.example.com/library/myapp:v1
  3. docker pull registry.example.com/library/myapp:v1

四、生产环境强化建议

1. 安全加固

  • 网络隔离:限制Registry仅允许内网访问
  • 镜像签名:集成Notary实现内容信任
  • 审计日志:配置Harbor的日志轮转策略

2. 高可用部署

Harbor HA方案

  1. 前端负载均衡(Nginx/HAProxy)
  2. 共享存储(NFS/Ceph/S3)
  3. 数据库主从(PostgreSQL)
  4. Redis集群缓存

Registry HA方案

  1. # 使用分布式存储(如MinIO)
  2. docker run -d \
  3. -p 5000:5000 \
  4. --name registry \
  5. -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry \
  6. -e REGISTRY_STORAGE_S3_ACCESSKEY=xxx \
  7. -e REGISTRY_STORAGE_S3_SECRETKEY=yyy \
  8. -e REGISTRY_STORAGE_S3_BUCKET=registry \
  9. -e REGISTRY_STORAGE_S3_REGION=us-east-1 \
  10. registry:2.7.1

3. 性能优化

  • 启用Registry缓存(REGISTRY_PROXY_REMOTEURL
  • 配置存储分片(按日期/项目分目录)
  • 使用docker pull --disable-content-trust跳过签名验证(测试环境)

五、监控与运维

1. 基础监控

  1. # 查看Registry存储使用
  2. docker exec registry du -sh /var/lib/registry
  3. # Harbor健康检查
  4. curl -I http://registry.example.com/api/v2.0/health

2. Prometheus监控配置

在Harbor的harbor.yml中启用:

  1. metrics:
  2. enabled: true
  3. core:
  4. path: /api/v2.0/metrics
  5. port: 9090
  6. registry:
  7. path: /metrics
  8. port: 9091

3. 定期维护

  • 每周执行垃圾回收:
    ```bash

    Harbor自带GC功能

    ./prepare —with-trivy —with-clair
    docker-compose down
    docker-compose up -d

Docker Registry手动GC

docker exec registry registry garbage-collect /etc/registry/config.yml
```

  • 每月备份配置(Harbor的common/config目录)

六、总结与扩展

自建镜像仓库是云原生架构的重要组件,建议根据实际需求选择方案:

  • 个人/测试环境:Docker Registry + Nginx反向代理
  • 企业生产环境:Harbor高可用集群
  • 超大规模场景:考虑商业版ACR或JFrog Artifactory

未来可探索:

  • 与Kubernetes的CRD集成(如使用FluxCD自动部署)
  • 镜像加密存储方案
  • 跨集群镜像同步策略

通过完整的镜像生命周期管理,企业能显著提升容器化应用的交付效率和安全性。实际部署时建议先在测试环境验证,再逐步迁移生产流量。