手把手搭建私有镜像仓库:从零开始实现镜像上传与下载

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

在容器化部署中,镜像仓库是核心基础设施。公有云提供的镜像服务(如Docker Hub)虽方便,但存在以下痛点:

  1. 安全性风险:企业核心业务镜像暴露在公网可能被窃取或篡改
  2. 网络依赖:跨国/跨区域拉取镜像速度慢,影响CI/CD效率
  3. 成本控制:公有云镜像存储按量计费,长期使用成本高
  4. 合规要求:金融、医疗等行业需满足数据本地化存储规范

私有镜像仓库可完美解决上述问题,实现镜像的全生命周期管理。本文以开源的Harbor为例,演示如何快速搭建企业级镜像仓库。

二、环境准备与前置条件

1. 服务器要求

  • 操作系统:CentOS 7/8 或 Ubuntu 20.04+
  • 最低配置:2核4G内存,40GB磁盘(生产环境建议8核16G+)
  • 网络要求:公网IP或内网可访问(需开放443/80端口)

2. 依赖安装

  1. # CentOS示例
  2. sudo yum install -y wget curl docker-ce docker-ce-cli containerd.io
  3. sudo systemctl enable --now docker
  4. # Ubuntu示例
  5. sudo apt update
  6. sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  8. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  9. sudo apt install -y docker-ce docker-ce-cli containerd.io

3. 域名准备(可选但推荐)

  1. # 生成自签名证书(测试环境)
  2. mkdir -p /data/cert
  3. openssl req -newkey rsa:4096 -nodes -sha256 -keyout /data/cert/domain.key \
  4. -x509 -days 3650 -out /data/cert/domain.crt -subj "/CN=registry.example.com"

三、Harbor安装与配置

1. 离线安装包获取

  1. # 下载最新稳定版(以v2.5.3为例)
  2. wget https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
  3. tar xzf harbor-offline-installer-v2.5.3.tgz
  4. cd harbor

2. 配置文件修改

编辑harbor.yml核心配置:

  1. hostname: registry.example.com # 必须与证书CN一致
  2. http:
  3. port: 80
  4. https:
  5. port: 443
  6. certificate: /data/cert/domain.crt
  7. private_key: /data/cert/domain.key
  8. harbor_admin_password: Harbor12345 # 初始管理员密码
  9. database:
  10. password: root123
  11. max_idle_conns: 50
  12. max_open_conns: 100
  13. storage_driver:
  14. name: filesystem
  15. fs_driver:
  16. rootdirectory: /data/harbor

3. 安装与启动

  1. # 安装前准备
  2. sudo mkdir -p /data/harbor/logs /data/harbor/data
  3. sudo chown -R 10000:10000 /data/harbor
  4. # 执行安装(需联网下载依赖)
  5. sudo ./install.sh --with-trivy --with-chartmuseum
  6. # 启动状态检查
  7. docker-compose ps

四、核心功能配置

1. 项目管理

  • 登录控制台(https://registry.example.com)
  • 创建项目时需指定:
    • 项目名称(如dev-team
    • 访问级别(公开/私有)
    • 存储配额(建议设置)
    • 镜像扫描策略(推荐启用)

2. 用户与权限

  1. -- 创建本地用户示例(通过Harbor API
  2. POST /api/v2.0/users
  3. {
  4. "username": "dev01",
  5. "email": "dev01@example.com",
  6. "password": "SecurePass123",
  7. "realname": "Developer One"
  8. }
  9. -- 分配项目角色
  10. PUT /api/v2.0/projects/{project_id}/members/{user_id}
  11. {
  12. "role_id": 1 # 1=管理员, 2=开发, 3=访客
  13. }

3. 复制策略配置

用于跨区域镜像同步:

  1. 在目标Harbor实例创建相同项目
  2. 设置复制规则:
    • 名称:region-sync
    • 源资源过滤器:**
    • 目标项目:目标实例项目名
    • 触发模式:定时/事件驱动
    • 带宽限制:建议设置(如10MB/s)

五、镜像操作全流程

1. 镜像标记与推送

  1. # 登录私有仓库
  2. docker login registry.example.com
  3. # 标记镜像(示例)
  4. docker tag nginx:latest registry.example.com/dev-team/nginx:v1.0
  5. # 推送镜像
  6. docker push registry.example.com/dev-team/nginx:v1.0

2. 镜像拉取

  1. # 从私有仓库拉取
  2. docker pull registry.example.com/dev-team/nginx:v1.0
  3. # 跨项目拉取(需权限)
  4. docker pull registry.example.com/prod-team/app:latest

3. 镜像扫描与修复

  1. # 手动触发扫描
  2. curl -X POST "https://registry.example.com/api/v2.0/projects/{project_id}/repositories/{repo_name}/artifacts/{digest}/scan" \
  3. -H "accept: application/json" \
  4. -H "Authorization: Bearer {token}"
  5. # 查看扫描结果
  6. curl "https://registry.example.com/api/v2.0/projects/{project_id}/repositories/{repo_name}/artifacts/{digest}/vulnerabilities"

六、生产环境优化建议

  1. 高可用部署

    • 使用Keepalived+VIP实现双机热备
    • 数据库分离部署(建议使用外部PostgreSQL)
    • 对象存储集成(如MinIO、AWS S3)
  2. 性能调优

    1. # /etc/docker/daemon.json 配置示例
    2. {
    3. "max-concurrent-uploads": 10,
    4. "max-download-attempts": 5,
    5. "registry-mirrors": ["https://registry-1.docker.io"]
    6. }
  3. 监控方案

    • Prometheus+Grafana监控面板
    • 关键指标:
      • 存储使用率
      • 请求延迟(P99)
      • 镜像扫描覆盖率
      • 用户活跃度

七、常见问题解决方案

  1. 证书错误处理

    1. # 将自签名证书加入系统信任
    2. sudo cp /data/cert/domain.crt /etc/pki/ca-trust/source/anchors/
    3. sudo update-ca-trust
  2. 权限拒绝问题

    • 检查项目角色分配
    • 验证/etc/docker/daemon.json中的insecure-registries配置(测试环境)
  3. 存储空间不足

    1. # 清理未使用的镜像(需Harbor 2.0+)
    2. curl -X DELETE "https://registry.example.com/api/v2.0/system/gc" \
    3. -H "accept: application/json" \
    4. -H "Authorization: Bearer {token}"

通过本文的详细指导,开发者可快速搭建满足企业级需求的镜像仓库。实际部署时建议先在测试环境验证,再逐步迁移生产业务。对于超大规模部署(>100TB),可考虑结合CDN加速和分布式存储方案。