Docker搭建私有镜像仓库的方法

一、为什么需要私有镜像仓库?

在容器化部署场景中,公有镜像仓库(如Docker Hub)存在以下痛点:网络依赖性强(国内访问速度慢)、安全性风险(公开镜像可能被篡改)、企业级需求(需要存储内部定制镜像)。私有镜像仓库通过本地化部署解决这些问题,同时支持权限控制、镜像签名等企业级功能。典型应用场景包括CI/CD流水线中的镜像缓存、微服务架构的组件分发、以及离线环境下的镜像管理。

二、基础搭建方案:使用Registry镜像

1. 快速启动无认证仓库

  1. docker run -d -p 5000:5000 --restart=always --name registry registry:2

该命令启动一个基础仓库,但存在安全隐患:

  • 缺乏TLS加密,数据明文传输
  • 无访问控制,任何人均可推送镜像
  • 镜像存储在容器内,数据持久性差

2. 数据持久化配置

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /path/to/registry:/var/lib/registry \
  6. registry:2

通过挂载本地目录实现数据持久化,建议使用独立磁盘或分布式存储(如NFS)保障可靠性。

三、安全加固方案

1. 启用HTTPS加密

生成自签名证书(生产环境建议使用CA证书):

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

启动带TLS的仓库:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /path/to/certs:/certs \
  6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  7. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  8. -v /path/to/registry:/var/lib/registry \
  9. registry:2

客户端配置insecure-registries(仅测试环境):

  1. // /etc/docker/daemon.json
  2. {
  3. "insecure-registries": ["registry.example.com:5000"]
  4. }

2. 基础认证配置

创建密码文件:

  1. mkdir -p auth
  2. docker run --entrypoint htpasswd \
  3. httpd:2 -Bbn username password > auth/htpasswd

启动带认证的仓库:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /path/to/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 /path/to/certs:/certs \
  10. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  11. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  12. -v /path/to/registry:/var/lib/registry \
  13. registry:2

客户端登录:

  1. docker login registry.example.com:5000

四、高级功能实现

1. 镜像清理策略

配置存储删除API(需Registry 2.4+):

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /path/to/config.yml:/etc/docker/registry/config.yml \
  6. registry:2

示例配置文件:

  1. # config.yml
  2. version: 0.1
  3. log:
  4. fields:
  5. service: registry
  6. storage:
  7. delete:
  8. enabled: true
  9. cache:
  10. blobdescriptor: inmemory

清理命令示例:

  1. # 删除特定镜像的所有tag
  2. curl -X DELETE http://registry.example.com:5000/v2/library/ubuntu/manifests/sha256:xxx

2. 镜像签名验证

安装Notary工具:

  1. # Ubuntu安装
  2. apt-get install -y notary

初始化Notary服务器(需配合数据库):

  1. notary-server -config notary-server.json
  2. notary-signer -config notary-signer.json

Registry配置信任服务:

  1. # config.yml
  2. http:
  3. addr: :5000
  4. headers:
  5. X-Content-Type-Options: [nosniff]
  6. auth:
  7. token:
  8. realm: http://auth.example.com/auth
  9. service: token-service
  10. issuer: auth-issuer
  11. rootcertbundle: /root/certs/auth-ca.crt
  12. notifications:
  13. endpoints:
  14. - name: notary-server
  15. url: https://notary.example.com/v2/trust/_notifications
  16. timeout: 5s
  17. threshold: 5
  18. backoff: 1s

五、企业级部署方案

1. 高可用架构

采用三节点集群部署:

  1. 负载均衡器 3×Registry节点(共享NFS存储)
  2. 共享存储(如GlusterFS/Ceph

配置要点:

  • 使用Keepalived实现VIP切换
  • 存储层实现RAID或分布式文件系统
  • 数据库主从复制(如用于Notary服务)

2. 监控与日志

Prometheus监控配置:

  1. # prometheus.yml
  2. scrape_configs:
  3. - job_name: 'docker-registry'
  4. metrics_path: '/metrics'
  5. static_configs:
  6. - targets: ['registry.example.com:5001']

ELK日志收集方案:

  1. Registry Filebeat Logstash Elasticsearch Kibana

六、最佳实践建议

  1. 存储规划:按项目/团队划分存储目录,建议单仓库不超过500GB
  2. 备份策略:每日增量备份+每周全量备份,异地存储
  3. 性能优化
    • 启用Registry缓存(proxy.remoteurl配置)
    • 使用SSD存储热数据
    • 调整REGISTRY_STORAGE_FILESYSTEM_MAXTHREADS参数
  4. 安全规范
    • 定期轮换证书和密码
    • 限制客户端IP访问
    • 开启镜像扫描(集成Clair/Trivy)

七、常见问题解决

  1. 500 Internal Server Error

    • 检查存储目录权限(需777或registry用户权限)
    • 查看日志定位具体错误
  2. 推送镜像超时

    • 调整客户端--config-file中的超时设置
    • 检查网络中间件(如防火墙、代理)
  3. 认证失败

    • 确认密码文件格式正确(每行username:password
    • 检查时间同步(NTP服务)

通过以上方案,开发者可根据实际需求选择从基础到企业级的部署方式。建议先在测试环境验证配置,再逐步迁移到生产环境。对于超大规模部署,可考虑Harbor等企业级解决方案,其集成了上述所有功能并提供可视化界面。