Registry 原理

Registry 原理

什么是 Docker Registry

Docker Registry 是存储和分发 Docker 镜像的服务。它是 Docker 架构中不可或缺的组件,负责管理镜像的存储、版本控制和分发。

Registry 的工作流程

开发者                         Registry                      部署环境
  │                             │                             │
  │── docker build ──────────→  │                             │
  │                             │    存储镜像层               │
  │── docker push image ─────→ │────→ 镜像元数据             │
  │                             │    清单文件                 │
  │                             │                             │
  │                             │←──── docker pull image ──→  │
  │                             │                             │
  │── docker search image ───→ │                             │
  │←── 搜索结果 ────────────── │                             │

Registry 的核心组件

1. 仓库(Repository)

仓库是一组相关镜像的集合,通过名称标识:

# 仓库名的结构
[registry-host[:port]/]namespace/repository-name[:tag]

# 示例
docker.io/library/nginx:latest
ghcr.io/myorg/myapp:1.0.0
private.registry.com:5000/team-a/backend:v2

2. 标签(Tag)

标签是镜像版本的标识符:

# 常见标签策略
myapp:1.0.0          # 语义化版本
myapp:latest         # 最新版本
myapp:abc123de       # Git commit SHA
myapp:20231201       # 日期

3. 镜像层(Layer)

镜像由一系列只读层组成,Registry 按层存储:

镜像 myapp:v1.0
  ├── Layer 1: ubuntu:22.04 基础层 (sha256:abc...)
  ├── Layer 2: apt update    (sha256:def...)
  ├── Layer 3: apt install   (sha256:ghi...)
  └── Layer 4: COPY app      (sha256:jkl...)

Registry 通过内容寻址存储层,相同内容的层只存储一份。

4. 清单(Manifest)

清单描述了镜像的元数据和层信息:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 7023,
    "digest": "sha256:config_hash..."
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 1234567,
      "digest": "sha256:layer1_hash..."
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 890123,
      "digest": "sha256:layer2_hash..."
    }
  ]
}

Registry API

Docker Registry 的读写通过 HTTP API 完成:

核心 API 端点

方法 端点 功能
GET /v2/ 检查 API 可用性
GET /v2/_catalog 列出仓库
GET /v2/{name}/tags/list 列出标签
HEAD /v2/{name}/manifests/{ref} 检查清单
GET /v2/{name}/manifests/{ref} 获取清单
PUT /v2/{name}/manifests/{ref} 上传清单
DELETE /v2/{name}/manifests/{ref} 删除清单
GET /v2/{name}/blobs/{digest} 下载层
POST /v2/{name}/blobs/uploads/ 开始上传层
PUT /v2/{name}/blobs/uploads/{uuid} 完成上传层

推送流程

1. POST /v2/myimage/blobs/uploads/            获取上传 URL
2. PATCH /v2/myimage/blobs/uploads/{uuid}     上传层数据
3. PUT   /v2/myimage/blobs/uploads/{uuid}     完成上传
4. PUT   /v2/myimage/manifests/latest         上传清单

拉取流程

1. GET /v2/myimage/manifests/latest           获取清单
2. GET /v2/myimage/blobs/{layer_digest}       下载层数据
3. GET /v2/myimage/blobs/{config_digest}      下载配置
4. GET 所有层  合并为完整的文件系统

Registry 存储后端

Docker Registry 支持多种存储后端:

# Registry 配置示例
version: 0.1
storage:
  filesystem:
    rootdirectory: /var/lib/registry

  # 或使用 S3
  s3:
    accesskey: AKIA...
    secretkey: ...
    region: us-west-1
    bucket: my-registry-bucket
    encrypt: true
    secure: true

  # 或使用 Azure
  azure:
    accountname: mystorageaccount
    accountkey: ...
    container: registry

  # 或使用 GCS
  gcs:
    bucket: my-registry-bucket
    keyfile: /path/to/keyfile.json

镜像分发优化

并发拉取

docker pull nginx
# 实际上多个层并行下载,加快速度

镜像层缓存

Registry 通过内容寻址实现层共享:

# 相同的基础层只需下载一次
docker pull nginx:1.24  # 下载 nginx 层
docker pull nginx:1.25  # 只有差异层需要下载

镜像加速

# 配置镜像加速器
echo '{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]}' > /etc/docker/daemon.json
systemctl restart docker

镜像删除

# 删除标签(不释放存储)
docker rmi myapp:v1.0
curl -X DELETE http://registry:5000/v2/myapp/manifests/{digest}

# 垃圾回收(释放存储)
docker exec registry-container /bin/registry garbage-collect /etc/docker/registry/config.yml

Registry 版本

版本 特性 状态
Docker Hub 官方托管服务 活跃
Docker Registry v2 开源,OCI 兼容 推荐
Docker Registry v1 旧版本,不支持 OCI 已弃用
Harbor 企业级,含安全功能 推荐企业使用

Docker Registry 是镜像存储和分发的核心基础设施。理解其工作原理有助于排查镜像相关的故障,以及选择合适的私有仓库方案。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容