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...
4.2 认证与授权机制
Registry 原生支持基于 的认证流程,并与外部身份提供商(如 LDAP、OAuth2、Harbor 等)集成。认证流程遵循 Bearer 规范,客户端在拉取或推送镜像前需先获取有效的访问令牌。
认证流程步骤:
- 客户端向 Registry 发起请求(如
GET /v2/)。 - Registry 返回
401 Unauthorized,并在Www-Authenticate头中指定 服务地址。 - 客户端携带凭据(用户名/密码或证书)向 服务请求 Bearer 。
- 服务验证凭据后,返回包含
scope(如repository:myapp:pull,push)的 JWT 。 - 客户端使用该 访问 Registry,Registry 验证 签名和权限后放行。
授权模型对比:
| 授权方式 | 粒度 | 适用场景 | 配置复杂度 |
|---|---|---|---|
| 认证 + 静态 ACL | 仓库级别 | 小型团队、单一项目 | 低 |
| OAuth2 + RBAC | 用户/角色/仓库 | 企业多租户、跨部门 | 中 |
| LDAP / AD 集成 | 用户组级别 | 已有统一身份认证的企业 | 中高 |
| mTLS 证书认证 | 客户端证书 | CI/CD 系统、自动化场景 | 高 |
4.3 垃圾回收(GC)机制
Registry 的垃圾回收用于清理未被任何 Manifest 引用的孤立 Blob。由于 Registry 采用引用计数方式管理 Blob,当用户删除某个镜像标签时,对应的 Manifest 被移除,但 Blob 并不会立即删除,而是等待 GC 周期执行。
GC 执行流程:
- 标记阶段(Mark): 遍历所有 Manifest,记录所有被引用的 Blob Digest。
- 清扫阶段(Sweep): 遍历 Blob 存储目录,删除未被标记的 Blob 文件。
- 元数据清理: 删除孤立的 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 的企业级方案。
高可用部署对比:
| 方案 | 存储后端 | 实例数量 | 故障切换时间 | 适用规模 |
|---|---|---|---|---|
| 共享存储 + 多实例 | 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 实例,配合健康检查和自动恢复机制。