快速搭建Docker镜像仓库:从零到一的完整指南

快速搭建Docker镜像仓库:从零到一的完整指南

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

在容器化技术普及的今天,Docker镜像已成为应用分发和部署的核心载体。然而,依赖公共仓库(如Docker Hub)存在安全隐患、网络依赖、速率限制等问题。私有Docker镜像仓库不仅能提升安全性,还能优化CI/CD流程、控制镜像版本、降低网络依赖,尤其适合企业级开发、离线环境或需要严格权限管理的场景。

本文将围绕“快速搭建Docker镜像仓库”这一核心需求,提供一套从环境准备到实际使用的完整方案,兼顾效率与稳定性,帮助开发者在1小时内完成私有仓库的部署。

一、方案选型:Docker Registry vs Harbor

在搭建私有仓库前,需明确技术选型。当前主流方案有两种:

  1. Docker官方Registry:轻量级、开源免费,适合小型团队或快速验证场景。
  2. Harbor:企业级镜像仓库,基于Registry扩展,提供权限管理、镜像扫描、UI界面等高级功能。

对比结论

  • 若追求快速搭建且功能需求简单,选择Docker Registry;
  • 若需企业级管理功能(如RBAC权限、漏洞扫描),选择Harbor。

本文以Docker Registry为例,因其部署更简单,适合“快速搭建”的核心目标。

二、环境准备:服务器与依赖检查

1. 服务器要求

  • 操作系统:Linux(推荐Ubuntu 20.04/CentOS 7+)
  • 硬件配置
    • 最低:2核CPU、4GB内存、20GB磁盘
    • 推荐:4核CPU、8GB内存、100GB磁盘(根据镜像存储量调整)
  • 网络要求
    • 公网IP(可选,若需外部访问)
    • 开放端口:5000(默认Registry端口)

2. 依赖安装

  1. # Ubuntu示例
  2. sudo apt update
  3. sudo apt install -y docker.io nginx certbot # 若需HTTPS,安装Nginx和Certbot
  4. # 启动Docker服务
  5. sudo systemctl enable --now docker

3. 磁盘空间优化

建议将Registry数据存储在独立磁盘分区,避免系统盘空间不足:

  1. # 创建数据目录
  2. sudo mkdir -p /data/registry
  3. sudo chown -R 1000:1000 /data/registry # Registry默认以用户ID 1000运行

三、快速部署Docker Registry

1. 使用Docker容器部署

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

参数说明

  • -v:将宿主机目录挂载到容器内,实现数据持久化。
  • --restart:容器退出时自动重启。
  • registry:2.8:指定最新稳定版镜像。

2. 验证部署

  1. # 检查容器状态
  2. docker ps | grep registry
  3. # 测试访问(需本地存在测试镜像)
  4. docker pull alpine:latest
  5. docker tag alpine:latest localhost:5000/my-alpine:latest
  6. docker push localhost:5000/my-alpine:latest

若推送成功,说明Registry已正常运行。

四、进阶配置:HTTPS与认证

1. 启用HTTPS(生产环境必备)

步骤1:生成自签名证书(测试用)

  1. mkdir -p /etc/docker/registry/certs
  2. openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker/registry/certs/domain.key \
  3. -x509 -days 365 -out /etc/docker/registry/certs/domain.crt \
  4. -subj "/CN=registry.example.com"

步骤2:配置Nginx反向代理

编辑/etc/nginx/conf.d/registry.conf

  1. server {
  2. listen 443 ssl;
  3. server_name registry.example.com;
  4. ssl_certificate /etc/docker/registry/certs/domain.crt;
  5. ssl_certificate_key /etc/docker/registry/certs/domain.key;
  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. }

重启Nginx:

  1. sudo systemctl restart nginx

步骤3:修改Docker客户端配置

编辑/etc/docker/daemon.json

  1. {
  2. "insecure-registries": [], # 移除或清空此项
  3. "registry-mirrors": [],
  4. "tls-verify": true
  5. }

重启Docker:

  1. sudo systemctl restart docker

2. 添加基本认证

步骤1:生成密码文件

  1. mkdir -p /etc/docker/registry/auth
  2. docker run --entrypoint htpasswd \
  3. httpd:2 -Bbn admin password123 > /etc/docker/registry/auth/htpasswd

步骤2:修改Registry启动参数

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

步骤3:测试认证

  1. docker login registry.example.com
  2. # 输入用户名admin和密码password123

五、镜像管理:推送与拉取

1. 标记并推送镜像

  1. docker pull nginx:latest
  2. docker tag nginx:latest registry.example.com/my-nginx:latest
  3. docker push registry.example.com/my-nginx:latest

2. 从私有仓库拉取镜像

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

3. 清理无用镜像

  1. # 进入Registry容器
  2. docker exec -it registry sh
  3. # 删除未被引用的blob(需安装registry-cli工具或手动操作)
  4. # 更推荐使用Harbor的垃圾回收功能

六、企业级扩展:Harbor部署指南

若需更强大的功能,可部署Harbor:

1. 安装Harbor

  1. # 下载Harbor安装包
  2. wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
  3. tar xvf harbor-offline-installer-v2.7.0.tgz
  4. cd harbor
  5. # 修改配置文件harbor.yml
  6. # 重点配置:hostname、https、database密码、admin密码

2. 运行安装脚本

  1. sudo ./install.sh

3. 访问Harbor Web界面

打开https://harbor.example.com,使用配置的admin账号登录。

七、常见问题与优化

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

原因:未配置客户端信任Registry的CA证书。
解决:将Registry的CA证书(domain.crt)复制到/etc/docker/certs.d/registry.example.com/目录下。

2. 磁盘空间不足

优化方案

  • 定期清理未被引用的镜像层。
  • 配置存储驱动为filesystem(默认)或s3(对象存储)。

3. 性能调优

  • 增加Registry容器的内存限制(--memory参数)。
  • 使用缓存代理(如registry-proxy)加速镜像拉取。

八、总结与最佳实践

  1. 快速验证:优先使用Docker Registry,10分钟内可完成基础部署。
  2. 生产环境:启用HTTPS、认证和定期备份。
  3. 企业需求:选择Harbor,利用其权限管理、镜像扫描和UI界面。
  4. 高可用:多节点部署Registry,配合负载均衡器。

通过本文的步骤,开发者可以快速搭建一个功能完善的Docker镜像仓库,为容器化应用提供可靠的镜像存储与管理服务。