从0到1搭建私有镜像仓库:完整指南与实战操作

引言:为什么需要私有镜像仓库?

在容器化部署成为主流的今天,Docker镜像作为应用交付的核心载体,其存储与分发效率直接影响开发运维流程。公有云提供的镜像仓库(如Docker Hub、阿里云ACR)虽方便,但存在以下痛点:

  1. 安全性风险:敏感镜像(如含密钥的配置文件)暴露在公共平台;
  2. 网络依赖:跨地域拉取镜像速度慢,甚至因网络策略无法访问;
  3. 成本控制:大规模镜像存储可能产生高额费用;
  4. 合规要求:金融、医疗等行业需满足数据本地化存储规范。

私有镜像仓库通过本地化部署,可实现镜像的集中管理、权限控制与高速分发,是企业级容器化部署的基础设施。本文将详细介绍如何从零开始搭建私有仓库,并完成镜像的推送与拉取操作。

一、方案选型:Harbor vs Docker Registry

1. Docker Registry(轻量级方案)

适用场景:小型团队、开发测试环境、对功能要求简单的场景。
优势

  • 开源免费,部署简单;
  • 官方维护,兼容性强。
    劣势
  • 缺乏图形界面;
  • 权限管理、镜像清理等高级功能需自行开发。

2. Harbor(企业级方案)

适用场景:中大型企业、生产环境、需要完整权限与审计的场景。
优势

  • 提供Web界面,支持用户/项目管理;
  • 内置镜像复制、漏洞扫描、签名验证等功能;
  • 支持RBAC权限模型与LDAP集成。
    劣势
  • 部署复杂度高于Docker Registry;
  • 资源占用较高(需数据库、Redis等依赖)。

推荐选择

  • 开发阶段或资源有限时,优先使用Docker Registry;
  • 生产环境或需要企业级功能时,选择Harbor。

二、从0到1搭建Docker Registry

1. 基础部署(单机版)

  1. # 拉取官方镜像
  2. docker pull registry:2
  3. # 启动Registry容器(默认端口5000)
  4. docker run -d \
  5. --name registry \
  6. -p 5000:5000 \
  7. --restart=always \
  8. registry:2

验证部署
访问 http://<服务器IP>:5000/v2/_catalog,应返回 {}(空仓库)。

2. 配置HTTPS(生产环境必需)

Docker客户端默认拒绝非HTTPS仓库,需生成证书并配置Nginx反向代理:

  1. # 生成自签名证书(替换yourdomain.com为实际域名)
  2. mkdir -p /certs
  3. openssl req -newkey rsa:4096 -nodes -sha256 -keyout /certs/domain.key \
  4. -x509 -days 365 -out /certs/domain.crt \
  5. -subj "/CN=yourdomain.com"
  6. # 配置Nginx(示例片段)
  7. server {
  8. listen 443 ssl;
  9. server_name yourdomain.com;
  10. ssl_certificate /certs/domain.crt;
  11. ssl_certificate_key /certs/domain.key;
  12. location / {
  13. proxy_pass http://localhost:5000;
  14. }
  15. }

客户端配置
/etc/docker/daemon.json 中添加:

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

重启Docker服务:systemctl restart docker

3. 镜像推送与拉取

  1. # 标记镜像(替换yourdomain.com为实际域名)
  2. docker tag nginx:latest yourdomain.com/library/nginx:v1
  3. # 登录私有仓库(需先配置HTTPS)
  4. docker login yourdomain.com
  5. # 推送镜像
  6. docker push yourdomain.com/library/nginx:v1
  7. # 拉取镜像
  8. docker pull yourdomain.com/library/nginx:v1

三、从0到1搭建Harbor

1. 安装依赖

  1. # 安装Docker Compose
  2. curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" \
  3. -o /usr/local/bin/docker-compose
  4. chmod +x /usr/local/bin/docker-compose
  5. # 安装Harbor(需提前下载离线包)
  6. tar xvf harbor-offline-installer-v2.9.0.tgz
  7. cd harbor

2. 配置Harbor

修改 harbor.yml 关键参数:

  1. hostname: yourdomain.com
  2. https:
  3. certificate: /certs/domain.crt
  4. private_key: /certs/domain.key
  5. harbor_admin_password: Admin@123 # 默认管理员密码
  6. database:
  7. password: root123 # 数据库密码

3. 启动服务

  1. # 初始化配置
  2. ./prepare
  3. # 启动Harbor
  4. docker-compose up -d

访问 https://yourdomain.com,使用默认账号 admin/Admin@123 登录。

4. 创建项目与用户

  1. 创建项目:在Web界面点击“新建项目”,输入名称(如dev-team);
  2. 创建用户:进入“用户管理”→“新建用户”,分配至对应项目;
  3. 配置权限:在项目设置中调整用户角色(如“开发人员”仅限推送)。

5. 镜像操作

  1. # 登录Harbor(需HTTPS)
  2. docker login yourdomain.com
  3. # 推送镜像
  4. docker tag alpine:latest yourdomain.com/dev-team/alpine:v1
  5. docker push yourdomain.com/dev-team/alpine:v1
  6. # 拉取镜像
  7. docker pull yourdomain.com/dev-team/alpine:v1

四、高级功能实践

1. 镜像自动清理

Docker Registry:通过 registry garbage-collect 命令清理未标记的镜像层。
Harbor:在“系统管理”→“垃圾回收”中配置定时任务。

2. 镜像复制(多地域同步)

在Harbor中配置“复制规则”,将镜像自动同步至其他Registry实例。

3. 漏洞扫描

Harbor集成Clair或Trivy,可在项目设置中启用“自动扫描”,推送镜像后自动检测CVE漏洞。

五、常见问题与解决方案

  1. 推送失败(401 Unauthorized)

    • 检查是否登录:docker logout 后重新登录;
    • 确认项目权限:用户需有“推送”权限。
  2. 证书错误(x509: certificate signed by unknown authority)

    • 将自签名证书添加至客户端信任链:
      1. sudo mkdir -p /etc/docker/certs.d/yourdomain.com
      2. sudo cp /certs/domain.crt /etc/docker/certs.d/yourdomain.com/ca.crt
  3. Harbor启动失败(Database Connection Error)

    • 检查 harbor.yml 中的数据库密码是否与 docker-compose.yml 一致;
    • 确保数据库容器已启动:docker-compose ps

六、总结与建议

  1. 开发阶段:优先使用Docker Registry,快速验证功能;
  2. 生产环境:选择Harbor,利用其企业级功能降低运维成本;
  3. 备份策略:定期备份Harbor的数据库与存储目录(/data);
  4. 监控告警:通过Prometheus+Grafana监控Registry的存储使用率与请求延迟。

通过私有镜像仓库的搭建,开发者可实现镜像的全生命周期管理,从开发到生产形成闭环,为容器化部署提供坚实基础。