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

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

在容器化部署成为主流的今天,Docker Hub等公共仓库存在以下痛点:

  1. 网络依赖:国内访问速度不稳定,拉取镜像耗时
  2. 安全隐患:敏感镜像(如含密钥的配置)暴露在公共平台
  3. 成本问题:企业级用户需支付私有仓库费用
  4. 合规要求:金融、医疗等行业需满足数据本地化存储规范

通过自建镜像仓库,可实现:

  • 完全可控的镜像存储环境
  • 自定义认证授权体系
  • 镜像版本追溯与审计
  • 配合CI/CD实现自动化部署

二、技术选型与方案对比

主流私有仓库方案对比:
| 方案 | 优点 | 缺点 |
|——————|—————————————|—————————————|
| Docker Registry | 轻量级,开箱即用 | 缺乏界面,功能基础 |
| Harbor | 企业级功能完善 | 部署复杂,资源占用高 |
| Nexus Repository | 支持多类型制品管理 | 非容器原生设计 |

推荐方案:Docker Registry + Nginx反向代理(适合中小团队)或Harbor(适合企业级需求)

三、从0到1搭建Docker Registry

3.1 基础环境准备

  1. # 示例系统:Ubuntu 22.04 LTS
  2. sudo apt update
  3. sudo apt install -y docker.io nginx certbot python3-certbot-nginx

3.2 启动基础Registry服务

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

关键参数说明:

  • -v:持久化存储镜像数据
  • --restart:容器异常时自动重启
  • 建议使用registry:2.8.1(LTS版本)

3.3 配置HTTPS访问(必做)

  1. 获取SSL证书:

    1. sudo certbot --nginx -d registry.yourdomain.com
  2. 配置Nginx反向代理:

    1. server {
    2. listen 443 ssl;
    3. server_name registry.yourdomain.com;
    4. ssl_certificate /etc/letsencrypt/live/registry.yourdomain.com/fullchain.pem;
    5. ssl_certificate_key /etc/letsencrypt/live/registry.yourdomain.com/privkey.pem;
    6. location / {
    7. proxy_pass http://localhost:5000;
    8. proxy_set_header Host $host;
    9. proxy_set_header X-Real-IP $remote_addr;
    10. }
    11. }

3.4 添加基本认证

  1. 创建密码文件:

    1. mkdir -p /data/registry/auth
    2. docker run --entrypoint htpasswd \
    3. httpd:2 -Bbn username password > /data/registry/auth/htpasswd
  2. 修改Registry启动参数:

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

四、企业级方案:Harbor部署指南

4.1 安装前准备

  1. # 安装依赖
  2. sudo apt install -y docker-compose
  3. # 下载Harbor安装包
  4. wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-online-installer-v2.7.0.tgz
  5. tar xvf harbor-online-installer-v2.7.0.tgz
  6. cd harbor

4.2 配置harbor.yml

  1. hostname: harbor.yourdomain.com
  2. http:
  3. port: 80
  4. https:
  5. certificate: /path/to/cert.pem
  6. private_key: /path/to/key.pem
  7. harbor_admin_password: Harbor12345
  8. database:
  9. password: root123
  10. max_open_conns: 1000
  11. max_idle_conns: 500

4.3 启动服务

  1. sudo ./install.sh --with-trivy --with-chartmuseum

关键组件说明:

  • Trivy:漏洞扫描
  • ChartMuseum:Helm Chart存储
  • 默认管理账号:admin/Harbor12345

五、镜像推送全流程演示

5.1 登录私有仓库

  1. # Docker Registry方式
  2. docker login registry.yourdomain.com
  3. # Harbor方式
  4. docker login harbor.yourdomain.com

5.2 标记并推送镜像

  1. # 标记本地镜像
  2. docker tag nginx:latest registry.yourdomain.com/library/nginx:v1
  3. # 推送镜像
  4. docker push registry.yourdomain.com/library/nginx:v1

5.3 验证镜像存储

  1. # 查看仓库中的镜像
  2. curl -u username:password https://registry.yourdomain.com/v2/_catalog
  3. # 查看特定镜像的tags
  4. curl -u username:password https://registry.yourdomain.com/v2/library/nginx/tags/list

六、高级功能实现

6.1 镜像自动清理策略

  1. # 在Registry配置中添加
  2. storage:
  3. delete:
  4. enabled: true
  5. maintenance:
  6. uploadpurging:
  7. enabled: true
  8. age: 168h
  9. interval: 24h
  10. dryrun: false

6.2 镜像复制(多地域同步)

Harbor中配置复制规则:

  1. 创建目标端点(另一个Harbor实例)
  2. 设置复制模式(Push/Pull)
  3. 配置过滤规则(按项目/标签)

6.3 日志审计配置

  1. # Nginx日志配置示例
  2. log_format registry_log '$remote_addr - $remote_user [$time_local] '
  3. '"$request" $status $body_bytes_sent '
  4. '"$http_referer" "$http_user_agent" "$docker_image"';
  5. server {
  6. ...
  7. access_log /var/log/nginx/registry.access.log registry_log;
  8. ...
  9. }

七、常见问题解决方案

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

解决方案:

  1. 获取CA证书并添加到系统信任链
  2. 或配置Docker信任该仓库(不推荐生产环境):
    1. {
    2. "insecure-registries" : ["registry.yourdomain.com"]
    3. }

7.2 Harbor启动失败排查步骤

  1. 检查端口冲突:netstat -tulnp | grep 80
  2. 查看日志:docker logs -f harbor-core
  3. 验证配置文件语法:./prepare --conf harbor.yml

7.3 镜像拉取速度优化

  1. 配置镜像缓存代理
  2. 使用CDN加速(如阿里云镜像加速)
  3. 实施P2P分发(如Dragonfly)

八、最佳实践建议

  1. 备份策略

    • 每日快照Registry数据目录
    • 定期备份Harbor数据库
  2. 安全加固

    • 启用双因素认证(Harbor 2.0+)
    • 定期轮换证书和密码
    • 限制管理员权限
  3. 监控告警

    • 监控存储空间使用率
    • 跟踪镜像推送/拉取频率
    • 设置异常登录告警
  4. 升级策略

    • 小版本每月升级
    • 大版本测试环境验证后升级
    • 升级前备份所有数据

通过以上步骤,您已成功搭建并配置了私有镜像仓库,实现了从0到1的完整建设。根据实际需求,可选择轻量级的Docker Registry方案或功能全面的Harbor企业级方案。建议从基础方案开始,随着业务发展逐步扩展功能。