Docker镜像仓库原生不支持层使用率统计,但可通过调用Registry API枚举镜像、提取layer digest、统计复用频次并结合HEAD请求获取blob大小,近似推导出层复用率与冗余空间。

Docker镜像仓库(Registry)本身不提供“镜像层使用率”统计功能,它是一个内容寻址存储系统,只负责按 digest 存取 blob(层或配置),不记录、不追踪某一层被多少个镜像引用。所以,无法直接通过 Registry API 获取“某层被多少镜像共用”或“各层空间占用占比”这类使用率报告。
但你可以通过组合调用 Registry API + 本地/服务端分析逻辑,近似推导出“层复用程度”和“潜在冗余情况”,用于生成类使用率的审计报告。关键思路是:枚举所有镜像 → 提取各镜像 manifest 中的 layers[].digest → 统计 digest 出现频次 → 关联 blob 大小(需额外获取)→ 计算复用率与空间贡献度。
以下是可落地的自动化步骤:
获取所有目标镜像清单
调用 /v2/_catalog(标准 Registry)或 Harbor 对应路径(如 /api/v2.0/projects/{proj}/repositories),分页拉取全部仓库名及 tag 列表。
- 必须携带有效认证(Basic Auth 或 Bearer Token)
- 使用
n=100&last=xxx分页,避免截断 - Harbor 用户注意:需项目级 read 权限,且 catalog 接口默认可能关闭,需确认
harbor.yml中registry.compatibility.schema1: false且未禁用_catalog
遍历每个镜像,提取 layer digest 列表
对每个 <repo>:<tag>,发起请求:
curl -H "Accept: application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.v2+json" \
-H "Authorization: Bearer $TOKEN" \
https://reg.example.com/v2/$repo/manifests/$tag解析响应 JSON,提取 layers[].digest(跳过 mediaType 为 config 的项)。
⚠️ 注意:digest 格式统一为 sha256:abcdef123...,比对前建议标准化(去除前缀或统一保留)
统计 digest 复用频次
将所有镜像的 layer digest 收集到一个列表,用 Python/Shell 统计每个 digest 出现次数:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 出现 1 次 → 独占层(低复用)
- 出现 ≥3 次 → 高复用层(如基础 alpine、distroless 层)
- 可计算“复用层占比” =(复用频次 ≥2 的 digest 数)/ 总 layer digest 数
(可选)估算各层空间占用
Registry API 不返回 blob 大小,但可通过 HEAD 请求 /v2/$repo/blobs/$digest 获取 Content-Length 响应头:
curl -I -H "Authorization: Bearer $TOKEN" \ https://reg.example.com/v2/$repo/blobs/sha256:abc...
将 digest 频次 × 对应大小,即可得出:
- 每层实际磁盘贡献(bytes)
- 每层因复用节省的空间 =
size × (freq - 1) - 总体冗余空间 = 所有
size × (freq - 1)之和
生成报告要点
输出 CSV 或 Markdown 表格,至少包含:
-
digest(缩略显示) -
referenced_by(引用该层的镜像数) -
size_bytes(原始大小) -
saved_bytes(因复用节省的空间) -
top_images(引用它的前 3 个镜像 tag)
这样一份报告虽非 Registry 原生“使用率”,但真实反映层复用效率,可用于:
- 识别可下线的老旧镜像(其独占层拖累存储)
- 评估基础镜像升级影响范围
- 优化多架构镜像构建策略(减少重复层)
不复杂但容易忽略。

















