Docker四步搭建本地私有镜像仓库:从零到一的完整指南

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

在容器化部署日益普及的今天,Docker镜像已成为应用分发的核心载体。然而,依赖公共仓库(如Docker Hub)存在三大痛点:网络依赖性强(尤其国内用户)、安全性风险(镜像可能被篡改)、版本管理混乱(缺乏权限控制)。本地私有仓库的搭建,能够彻底解决这些问题:

  • 性能优化:内网传输速度远超公网,尤其适合大规模集群部署。
  • 安全可控:通过TLS加密和认证机制,确保镜像传输和存储安全。
  • 合规需求:满足金融、医疗等行业对数据本地化的监管要求。
  • 团队协作:支持多用户权限管理,避免镜像冲突。

二、四步搭建流程详解

步骤1:环境准备与依赖安装

1.1 系统要求

  • 操作系统:推荐CentOS 7/8或Ubuntu 20.04 LTS,需支持systemd服务管理。
  • 硬件配置:至少2核CPU、4GB内存、20GB磁盘空间(根据镜像数量动态调整)。
  • 网络环境:确保服务器有固定IP,开放5000端口(默认Registry端口)。

1.2 安装Docker引擎

以Ubuntu为例,执行以下命令:

  1. # 卸载旧版本(如有)
  2. sudo apt-get remove docker docker-engine docker.io containerd runc
  3. # 安装依赖
  4. sudo apt-get update
  5. sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  6. # 添加Docker官方GPG密钥
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  8. # 添加稳定版仓库
  9. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  10. # 安装Docker CE
  11. sudo apt-get update
  12. sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  13. # 验证安装
  14. sudo docker run hello-world

步骤2:部署Registry服务

2.1 基础Registry启动

使用官方Registry镜像快速启动:

  1. sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2
  • -d:后台运行
  • -p 5000:5000:端口映射
  • --restart=always:容器异常退出时自动重启
  • --name registry:指定容器名称

2.2 持久化存储配置

默认情况下,Registry数据存储在容器内,重启后数据丢失。需挂载本地目录:

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

2.3 验证服务可用性

  1. curl -I http://localhost:5000/v2/

返回HTTP/1.1 200 OK表示服务正常。

步骤3:安全加固与认证配置

3.1 启用HTTPS加密

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

  1. sudo mkdir -p /certs
  2. sudo 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"

修改Registry启动命令:

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

3.2 配置基本认证

创建密码文件:

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

启动带认证的Registry:

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

3.3 客户端配置

修改Docker守护进程配置(/etc/docker/daemon.json):

  1. {
  2. "insecure-registries": [],
  3. "registry-mirrors": [],
  4. "allow-nondistributable-artifacts": ["registry.example.com:5000"]
  5. }

重启Docker服务:

  1. sudo systemctl restart docker

步骤4:镜像推送与拉取测试

4.1 标记并推送镜像

  1. # 标记本地镜像
  2. docker tag ubuntu:latest registry.example.com:5000/ubuntu:latest
  3. # 登录私有仓库
  4. docker login registry.example.com:5000
  5. # 输入用户名testuser和密码testpassword
  6. # 推送镜像
  7. docker push registry.example.com:5000/ubuntu:latest

4.2 从私有仓库拉取镜像

  1. # 删除本地镜像(模拟无缓存环境)
  2. docker rmi ubuntu:latest
  3. # 拉取私有仓库镜像
  4. docker pull registry.example.com:5000/ubuntu:latest

三、高级功能扩展

3.1 镜像清理策略

配置Registry的垃圾回收机制:

  1. # 进入Registry容器
  2. sudo docker exec -it registry sh
  3. # 执行垃圾回收(需先停止推送)
  4. registry garbage-collect /etc/docker/registry/config.yml

3.2 镜像复制与同步

使用registry-cli工具实现多仓库同步:

  1. # 安装工具
  2. npm install -g registry-cli
  3. # 配置同步任务
  4. registry-cli sync \
  5. --source https://registry-1.docker.io \
  6. --target http://registry.example.com:5000 \
  7. --images ubuntu:latest,nginx:alpine

3.3 日志与监控集成

通过Prometheus和Grafana监控Registry指标:

  1. 部署Prometheus收集器
  2. 配置Registry暴露/metrics端点
  3. 在Grafana中导入Docker Registry仪表盘模板

四、常见问题解决方案

4.1 推送镜像报错x509: certificate signed by unknown authority

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

  • 将证书文件(domain.crt)复制到/etc/docker/certs.d/registry.example.com:5000/目录
  • 重启Docker服务

4.2 认证失败401 Unauthorized

检查点

  • 确认htpasswd文件权限为600
  • 验证用户名密码是否匹配
  • 检查Registry日志中的认证模块加载情况

4.3 存储空间不足

优化建议

  • 定期执行garbage-collect
  • 配置存储驱动为filesystem以外的选项(如S3、Azure Blob)
  • 设置镜像保留策略(如保留最近N个版本)

五、最佳实践建议

  1. 备份策略:每周全量备份/data/registry目录,增量备份使用rsync
  2. 高可用方案:部署多节点Registry集群,使用NFS或分布式存储
  3. 镜像签名:集成Notary实现镜像内容信任(DCT)
  4. 网络隔离:将Registry部署在独立VLAN,限制访问IP范围

通过以上四步操作,您已成功搭建一个功能完备、安全可靠的本地私有Docker镜像仓库。该方案不仅适用于开发测试环境,也可通过扩展满足生产级需求。建议定期审查Registry配置,结合CI/CD流水线实现镜像的自动化构建与推送,最大化发挥容器化技术的优势。