如何查找Docker镜像压缩层在本地文件系统的存储位置
本地Docker压缩镜像层路径及manifest定位方法
首先明确两个容易混淆的概念,避免找错位置:
- manifest.json里记录的层sha256是压缩态tar包的哈希(distribution digest),是镜像拉取时和镜像仓库做校验用的值,对应你要找的压缩版镜像层
- 本地存储驱动挂载用的是解压后的层,对应的哈希叫diffid,和前者不是同一套值,不要搞混
具体定位步骤
- 第一步:确认当前Docker使用的存储驱动,执行以下命令查询:
docker info | grep "Storage Driver"
绝大多数默认安装的环境返回值都是overlay2,后续路径里涉及存储驱动的字段,替换成你实际查询到的结果即可。
- 第二步:定位压缩层存储根目录,所有未被GC清理的原始压缩层,默认存放在:
/var/lib/docker/image/<你的存储驱动名>/distribution/blobstores/sha256/
- 第三步:根据manifest里的sha256值匹配文件:
根目录下的一级子目录名,是压缩层sha256值去掉sha256:前缀后的前2位十六进制字符;进入对应子目录后,文件名就是sha256值剩下的62位字符,该文件就是gzip压缩格式的原始镜像层tar包。
举个实际匹配例子:如果manifest.json里记录某层的sha256为sha256:8a39c39b7c0d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f,那它的完整存放路径就是:
/var/lib/docker/image/overlay2/distribution/blobstores/sha256/8a/39c39b7c0d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f
注意事项
如果在对应路径找不到目标文件,是因为Docker默认会在镜像拉取、校验、解压全流程完成后,定期回收无引用的压缩层缓存,这种情况下本地已经没有留存压缩态的层文件。你可以选择重新拉取镜像,在缓存未被清理时复制对应文件,也可以通过
docker save <镜像名>:<标签>导出镜像包,解压导出包后就能在包内的blobs目录下找到完整的压缩层文件。
如果你误找了解压后的运行时层,它的存放路径是/var/lib/docker/overlay2/,目录名为层的cache-id,需要先通过层diffid到layerdb目录下查询对应cache-id才能定位,和manifest里记录的压缩层哈希不通用,不要直接用压缩层sha256去该路径下查找。
内容的提问来源于stack exchange,提问作者Or-G
相关产品推荐
相关产品推荐

