8讲Docker | 2分钟搭建私人镜像仓库

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

在Docker生态中,镜像仓库是存储和分发容器镜像的核心组件。公有仓库(如Docker Hub)虽方便,但存在以下痛点:

  1. 安全性风险:企业敏感镜像可能泄露至公共平台;
  2. 网络依赖:国内访问Docker Hub常受限于网络速度;
  3. 定制化需求:需对镜像进行权限控制、版本管理等。
    私人镜像仓库可解决上述问题,尤其适合企业内网环境或对数据主权有强要求的场景。

二、技术选型:Registry vs Harbor

  1. Docker Registry
    • 官方开源的轻量级镜像仓库,仅需一个容器即可运行;
    • 适合个人开发者或小型团队,功能基础但足够用。
  2. Harbor
    • VMware开源的企业级镜像仓库,支持RBAC权限、镜像扫描、多租户等;
    • 适合中大型企业,但部署复杂度较高。

本文以Docker Registry为例,因其部署简单,可实现“2分钟极速搭建”。

三、2分钟搭建实战(命令行版)

步骤1:拉取Registry镜像

  1. docker pull registry:2

此命令从Docker Hub拉取官方Registry镜像(版本2)。

步骤2:启动Registry容器

  1. docker run -d -p 5000:5000 --restart=always --name registry registry:2
  • -d:后台运行;
  • -p 5000:5000:将容器5000端口映射到宿主机;
  • --restart=always:容器退出时自动重启;
  • --name registry:指定容器名称为registry

此时,访问http://<宿主机IP>:5000/v2/_catalog即可看到空仓库列表。

四、进阶配置:HTTPS与认证

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

生成自签名证书(假设域名registry.example.com):

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

启动Registry时挂载证书:

  1. docker run -d -p 5000:5000 \
  2. --restart=always \
  3. --name registry \
  4. -v "$(pwd)"/certs:/certs \
  5. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  7. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  8. registry:2

2. 添加Basic认证

生成用户名密码文件(用户admin,密码123456):

  1. mkdir -p auth
  2. docker run --entrypoint htpasswd httpd:2 -Bbn admin 123456 > auth/htpasswd

启动Registry时挂载认证文件:

  1. docker run -d -p 5000:5000 \
  2. --restart=always \
  3. --name registry \
  4. -v "$(pwd)"/auth:/auth \
  5. -e REGISTRY_AUTH=htpasswd \
  6. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  7. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
  8. registry:2

五、客户端操作指南

1. 标记并推送镜像

  1. docker tag nginx:latest localhost:5000/my-nginx:v1
  2. docker push localhost:5000/my-nginx:v1

若Registry启用HTTPS且使用自签名证书,需在/etc/docker/daemon.json中添加:

  1. {
  2. "insecure-registries": ["registry.example.com"]
  3. }

重启Docker服务后重试。

2. 拉取私有镜像

  1. docker pull localhost:5000/my-nginx:v1

六、高级功能扩展

  1. 镜像清理
    使用registry:2的垃圾回收功能清理未被引用的镜像层:
    1. docker exec -it registry /bin/registry garbage-collect /etc/registry/config.yml
  2. 存储后端
    默认使用本地存储,可替换为S3、Azure Blob等对象存储:
    1. # config.yml示例
    2. storage:
    3. s3:
    4. accesskey: "AKIA..."
    5. secretkey: "..."
    6. region: "us-east-1"
    7. bucket: "my-registry"

七、常见问题排查

  1. 500错误:检查Registry日志(docker logs registry),常见原因包括存储权限不足、端口冲突等;
  2. 401未授权:确认认证文件路径和用户名密码是否正确;
  3. 推送超时:调整客户端超时时间(--config参数指定Docker配置文件)。

八、最佳实践建议

  1. 备份策略:定期备份/var/lib/registry目录(默认存储路径);
  2. 监控告警:通过Prometheus+Grafana监控Registry的存储使用率和请求延迟;
  3. 多节点部署:使用Harbor或分布式Registry方案实现高可用。

通过本文的步骤,开发者可在2分钟内完成基础部署,再通过进阶配置满足生产环境需求。私人镜像仓库的搭建不仅提升了安全性,更为持续集成/持续部署(CI/CD)流程提供了可靠的镜像管理基础设施。”