可通过 Docker Registry HTTP API v2 获取镜像层大小:先用 Accept 头请求 manifest 解析 layer digest,再对每个 digest 发送 HEAD 请求获取 Content-Length,注意处理认证与重定向。

可以通过 Docker Registry HTTP API v2 直接查询镜像的 manifest,再结合 blob(layer)的 GET /v2/<name>/blobs/<digest> 请求头获取 Content-Length,从而得到每层大小。关键在于正确解析 manifest 中的 layer digest,并发起 HEAD 请求避免下载内容。
获取镜像 manifest 并提取 layer digest
Registry API 不直接返回 layer 大小,需先拉取镜像的 manifest(注意指定 Accept: application/vnd.docker.distribution.manifest.v2+json)。例如查询 library/nginx:alpine:
- 先用
GET /v2/library/nginx/manifests/alpine获取 manifest - 响应体中
layers字段包含每个 layer 的digest(如sha256:abc123...)和size(该 size 是压缩后上传大小,即 registry 存储大小,通常就是你要的“层大小”) - 注意:manifest 响应默认不含
size字段,除非使用Accept: application/vnd.docker.distribution.manifest.v2+json且 registry 支持返回size;更可靠的方式是后续对每个 digest 发起 HEAD 请求
对每个 layer digest 发起 HEAD 请求获取 Content-Length
对 manifest 中每个 digest,向 /v2/<name>/blobs/<digest> 发送 HEAD 请求:
- 必须携带有效的
Authorization头(可通过GET /v2/auth获取 token,或复用 login 凭据) - 成功响应的
Content-Lengthheader 即为该 layer 的字节数(即压缩后大小) - HEAD 比 GET 更高效,不传输 body,适合批量查询
处理认证与重定向
公有 registry(如 Docker Hub)和私有 registry 认证方式不同:
- Docker Hub 使用 bearer token:先请求
https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/nginx:pull,再用返回的 token 设置Authorization: Bearer <token> - 私有 registry 若启用了 basic auth,可直接用
Authorization: Basic <base64(user:pass)> - 注意部分 registry 会返回 307 重定向到 CDN 地址,需跟随重定向并保持认证头(某些 client 默认不带,需显式配置)
示例脚本逻辑(Python + requests)
核心步骤可封装为:
- 构造 registry 基础 URL(如
https://registry-1.docker.io) - 获取 token 或基础认证凭据
- GET manifest,解析 layers 数组
- 对每个 layer.digest 执行 HEAD,提取
r.headers.get('Content-Length') - 汇总输出 digest → size 映射,支持排序或格式化为 MB/GB
不复杂但容易忽略认证头传递和重定向处理。


















