如何搭建与使用Docker私有镜像仓库:从零开始的完整指南

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

在Docker生态中,公有镜像仓库(如Docker Hub)适合开源项目或个人开发者,但在企业场景下存在三大痛点:安全性风险(镜像可能包含敏感信息)、网络依赖(拉取镜像受限于公网速度)、版本管理混乱(缺乏权限控制导致镜像被随意覆盖)。私有镜像仓库通过隔离环境、权限控制、高速本地化访问等特性,成为企业级Docker部署的核心组件。

以某金融公司为例,其生产环境要求所有镜像必须经过安全扫描后才能部署,且开发团队与运维团队需独立管理镜像版本。通过搭建私有Registry,该公司实现了镜像的全生命周期管理:开发人员推送镜像至测试环境仓库,扫描通过后自动同步至生产环境仓库,最终由CI/CD流水线拉取部署。这一流程将镜像发布时间从2小时缩短至15分钟,同时杜绝了未授权镜像的部署风险。

二、基础安装:快速启动一个私有Registry

1. 使用Docker官方Registry镜像

最简单的方式是直接运行官方Registry容器:

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

此命令会启动一个监听5000端口的Registry服务,数据存储在容器的/var/lib/registry目录中。但这种方式存在两个问题:数据持久化(容器删除后镜像丢失)和安全性(未加密传输)。

2. 数据持久化改进

通过挂载本地目录解决数据持久化问题:

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

此时所有镜像会存储在宿主机的/data/docker-registry目录下,即使容器重建数据也不会丢失。

三、进阶配置:HTTPS与用户认证

1. HTTPS加密配置

未加密的HTTP连接会导致镜像推送时被中间人攻击。配置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 \
    4. -subj "/CN=registry.example.com"
  • 启动支持HTTPS的Registry
    1. docker run -d \
    2. -p 5000:5000 \
    3. --restart=always \
    4. --name registry \
    5. -v /data/docker-registry:/var/lib/registry \
    6. -v $(pwd)/certs:/certs \
    7. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
    8. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    9. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    10. registry:2

2. 用户认证配置

通过htpasswd实现基本认证:

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

启动带认证的Registry:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /data/docker-registry:/var/lib/registry \
  6. -v $(pwd)/auth:/auth \
  7. -e REGISTRY_AUTH=htpasswd \
  8. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  9. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
  10. registry:2

此时客户端需先登录才能推送镜像:

  1. docker login registry.example.com:5000

四、镜像操作全流程

1. 标记并推送镜像

  1. docker tag nginx:latest registry.example.com:5000/my-nginx:v1
  2. docker push registry.example.com:5000/my-nginx:v1

2. 从私有仓库拉取镜像

  1. docker pull registry.example.com:5000/my-nginx:v1

3. 删除镜像(需Registry 2.4+)

首先配置Registry允许删除:

  1. -e REGISTRY_STORAGE_DELETE_ENABLED=true

然后通过API删除(需先获取镜像的digest值):

  1. curl -X DELETE http://registry.example.com:5000/v2/my-nginx/manifests/<digest>

五、生产环境优化建议

1. 高可用架构

  • 多节点部署:使用NFS或分布式存储(如Ceph)共享存储层
  • 负载均衡:通过Nginx反向代理实现多Registry节点负载均衡
  • 缓存层:在边缘节点部署缓存Registry,加速镜像拉取

2. 镜像清理策略

定期清理未使用的镜像层,可通过以下命令实现:

  1. # 查找未被引用的blobs
  2. find /data/docker-registry/docker/registry/v2/blobs/sha256 \
  3. -type f -name "link" -mtime +30 -exec sh -c '
  4. manifest=$(dirname $(dirname $(dirname $(dirname $0))))/\
  5. $(grep -oP '"manifest"\s*:\s*"\K[^"]+' $0)
  6. [ ! -f "$manifest" ] && echo "Deleting orphan blob: $0" && rm $0
  7. ' {} \;

3. 监控与日志

配置Registry的日志驱动和监控指标:

  1. -e REGISTRY_LOG_LEVEL=info \
  2. -e REGISTRY_LOG_FORMATTER=text \
  3. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  4. -v /var/log/registry:/var/log/registry

通过Prometheus+Grafana监控Registry的存储使用率、请求延迟等关键指标。

六、常见问题解决方案

1. 推送镜像时报错”x509: certificate signed by unknown authority”

原因:客户端不信任自签名证书。解决方案:

  • 将证书添加到客户端的信任链(Linux:/etc/docker/certs.d/registry.example.com:5000/ca.crt
  • 或临时禁用证书验证(不推荐生产环境使用):
    1. echo '{"insecure-registries":["registry.example.com:5000"]}' > /etc/docker/daemon.json
    2. systemctl restart docker

2. 镜像推送卡在”Uploading”状态

可能原因:网络带宽不足、Registry存储写入延迟。排查步骤:

  1. 检查Registry容器日志:docker logs registry
  2. 监控存储I/O:iostat -x 1
  3. 调整Registry的并发写入限制:
    1. -e REGISTRY_STORAGE_FILESYSTEM_MAXTHREADS=100

七、替代方案对比

方案 优点 缺点
官方Registry 轻量级、开箱即用 功能有限,缺乏企业级特性
Harbor 图形化管理、RBAC权限控制 部署复杂,资源消耗较高
Nexus Repository 支持多类型制品(Docker/Maven) 付费版功能更完善
JFrog Artifactory 企业级功能全面 价格昂贵,学习曲线陡峭

对于中小型企业,推荐从官方Registry+Nginx反向代理开始,逐步根据需求引入Harbor或Nexus。大型企业可直接部署Artifactory以获得完整的制品管理解决方案。

通过本文的详细指导,读者可以完成从基础私有Registry搭建到生产环境优化的全流程。实际部署时,建议先在测试环境验证所有配置,再逐步迁移至生产环境。私有镜像仓库的稳定运行需要持续的监控和维护,建议建立定期的备份和清理机制,确保镜像数据的安全性和存储效率。