4. Docker Registry 架构:存储后端、认证与授权、GC 机制、高可用部署

Docker Registry 是容器镜像分发体系的核心组件,负责镜像的存储、版本管理、访问控制与生命周期清理。在生产环境中,Registry 的架构设计直接影响镜像拉取速度、多租户隔离能力以及运维稳定性。本节从存储后端、认证授权、垃圾回收(GC)和高可用部署四个维度深入剖析 Registry 的内部机制。

4.1 存储后端架构

Registry 采用分层存储模型,将镜像元数据与 Blob(层数据)分离存储。元数据通常存储在关系型数据库中,而 Blob 则存放在对象存储或文件系统中。这种设计使得 Registry 能够灵活适配不同的存储后端,同时支持大规模并发读写。

核心存储后端对比:
存储后端 适用场景 优势 劣势
本地文件系统 开发测试、单节点部署 部署简单、延迟低 无扩展性、单点故障
S3 / MinIO 生产环境、多云部署 高可用、弹性扩展、成本低 网络延迟、需额外配置
Azure Blob Storage Azure 云原生环境 与 Azure 生态深度集成 厂商锁定
GCS GCP 环境 强一致性、全球分发 跨区域成本较高
NFS / NAS 传统数据中心 兼容现有存储架构 性能瓶颈、单点风险

Registry 的存储路径结构遵循 OCI 分发规范,Blob 按 sha256:<digest> 的哈希值进行两级目录散列存储,避免单个目录下文件过多。元数据则通过 _manifests 和 _layers 目录组织,支持多版本标签引用。

# Registry 存储目录结构示例
/var/lib/registry/
├── docker/
│   └── registry/
│       └── v2/
│           ├── blobs/
│           │   └── sha256/
│           │       ├── 1a/
│           │       │   └── 1a2b3c... (Blob 文件)
│           │       └── 2b/
│           │           └── 2b3c4d...
│           └── repositories/
│               └── myapp/
│                   ├── _manifests/
│                   │   ├── revisions/
│                   │   │   └── sha256/
│                   │   │       └── abc123...
│                   │   └── tags/
│                   │       └── latest/
│                   │           ├── current/
│                   │           └── index/
│                   └── _layers/
│                       └── sha256/
│                           └── def456...
Registry 存储后端架构 Registry 存储后端架构 Docker 客户端 Docker Registry (API v2) 认证 / 授权 / 路由 / 元数据管理 存储后端适配层 元数据存储 Manifests / Tags (MySQL / PostgreSQL) Blob 存储 镜像层数据 (S3 / GCS / Azure) 缓存层 Redis / 本地缓存 加速热点 Blob 访问 存储后端设计要点 元数据与 Blob 分离存储,支持多后端适配;Blob 按 sha256 散列分布,避免单目录文件过多

4.2 认证与授权机制

Registry 原生支持基于 的认证流程,并与外部身份提供商(如 LDAP、OAuth2、Harbor 等)集成。认证流程遵循 Bearer 规范,客户端在拉取或推送镜像前需先获取有效的访问令牌。

生产建议: 推荐使用 Harbor 或 Nexus 作为企业级 Registry 前端,它们内置了 RBAC、LDAP 集成和审计日志,能够满足多租户场景下的细粒度权限控制。

认证流程步骤:

  1. 客户端向 Registry 发起请求(如 GET /v2/)。
  2. Registry 返回 401 Unauthorized,并在 Www-Authenticate 头中指定 服务地址。
  3. 客户端携带凭据(用户名/密码或证书)向 服务请求 Bearer 。
  4. 服务验证凭据后,返回包含 scope(如 repository:myapp:pull,push)的 JWT 。
  5. 客户端使用该 访问 Registry,Registry 验证 签名和权限后放行。

授权模型对比:

授权方式 粒度 适用场景 配置复杂度
认证 + 静态 ACL 仓库级别 小型团队、单一项目 低
OAuth2 + RBAC 用户/角色/仓库 企业多租户、跨部门 中
LDAP / AD 集成 用户组级别 已有统一身份认证的企业 中高
mTLS 证书认证 客户端证书 CI/CD 系统、自动化场景 高

4.3 垃圾回收(GC)机制

Registry 的垃圾回收用于清理未被任何 Manifest 引用的孤立 Blob。由于 Registry 采用引用计数方式管理 Blob,当用户删除某个镜像标签时,对应的 Manifest 被移除,但 Blob 并不会立即删除,而是等待 GC 周期执行。

注意: Registry 的 GC 是“停止世界”(Stop-the-World)操作,执行期间 Registry 会暂停写入请求。在生产环境中,建议在业务低峰期执行,或使用支持在线 GC 的 Harbor 等替代方案。

GC 执行流程:

  1. 标记阶段(Mark): 遍历所有 Manifest,记录所有被引用的 Blob Digest。
  2. 清扫阶段(Sweep): 遍历 Blob 存储目录,删除未被标记的 Blob 文件。
  3. 元数据清理: 删除孤立的 Manifest 记录和空目录。
# 手动触发 GC 命令(Registry v2)
docker run -it --rm \
  -v /var/lib/registry:/var/lib/registry \
  registry:2 \
  garbage-collect /etc/docker/registry/config.yml

# 启用 dry-run 模式预览待删除 Blob
docker run -it --rm \
  -v /var/lib/registry:/var/lib/registry \
  registry:2 \
  garbage-collect --dry-run /etc/docker/registry/config.yml

GC 性能指标参考:

镜像仓库大小 GC 执行时间 磁盘回收比例 建议执行频率
< 100 GB 5-15 分钟 10%-30% 每周
100 GB - 1 TB 15-60 分钟 20%-50% 每两周
> 1 TB 1-4 小时 30%-70% 每月

4.4 高可用部署方案

生产环境的 Registry 必须支持高可用部署,避免单点故障导致镜像分发中断。常见的高可用架构包括:共享存储 + 多实例、分布式存储 + 负载均衡、以及基于 Harbor 的企业级方案。

Registry 高可用部署架构 Registry 高可用部署架构 负载均衡器 (Nginx/HAProxy) Registry 实例 1 192.168.1.10:5000 Registry 实例 2 192.168.1.11:5000 Registry 实例 3 192.168.1.12:5000 共享存储后端 (S3 / NFS / MinIO) 所有 Registry 实例共享同一存储池,保证数据一致性 支持多区域复制和跨 AZ 容灾 高可用部署关键点 1. 共享存储必须支持并发读写和锁机制(如 S3 的强一致性) 2. 负载均衡器需配置健康检查,自动剔除故障实例

高可用部署对比:

方案 存储后端 实例数量 故障切换时间 适用规模
共享存储 + 多实例 NFS / NAS 2-3 < 30 秒 中小规模
对象存储 + 多实例 S3 / MinIO 3-5 < 10 秒 大规模生产
Harbor 企业级方案 S3 + 数据库 3+ < 5 秒 企业级多租户
分布式 Registry (DTR) 内置分布式存储 3+ < 15 秒 超大规模集群
最佳实践总结:
  • 存储后端优先选择 S3 兼容的对象存储,兼顾性能与扩展性。
  • 认证授权集成企业 IdP(LDAP/OAuth2),实现多租户隔离。
  • GC 策略结合业务镜像生命周期,避免频繁执行导致服务抖动。
  • 高可用部署至少 3 个 Registry 实例,配合健康检查和自动恢复机制。