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


暂无评论内容