You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证containerd存储的相同容器镜像并非冗余重复?

如何确认containerd中同名镜像的空间占用是否为冗余浪费

使用du命令统计containerd存储Docker镜像的磁盘空间时,会出现同一镜像按命名空间累加占用的现象——比如在microk8s环境中,10个校验和完全一致的镜像,du统计总占用达到单镜像的10倍,但这可能只是测量假象,可通过以下方法验证:


方法1:用containerd原生工具查看实际占用

containerd自带的ctr或crictl工具能准确区分镜像的虚拟大小(包含共享层的总大小)和实际磁盘占用(仅计算一次共享层+独占层),不会重复统计:

# 用ctr查看k8s.io命名空间下的镜像实际大小
ctr -n k8s.io images ls --size

# k8s环境下也可用crictl
crictl images --size

输出中的SIZE字段为实际磁盘占用,VIRTUAL SIZE为包含共享层的总大小,前者才是真实的空间消耗。

方法2:检查镜像层的硬链接

containerd默认通过硬链接共享镜像层,可通过inode编号确认:

# 进入containerd镜像层存储目录(microk8s默认路径)
cd /var/snap/microk8s/common/containerd/io.containerd.content.v1.content/blobs/sha256/

# 查看不同镜像目录下对应层文件的inode
ls -i <目标镜像层的sha256值>

如果多个文件的inode编号相同,说明它们是硬链接,实际仅占用一份磁盘空间,du的累加只是统计了不同路径下的链接,而非实际存储。

方法3:删除单个命名空间镜像,观察磁盘变化

删除一个命名空间下的目标镜像,对比删除前后的磁盘使用情况:

# 记录当前磁盘使用状态
df -h /var/snap/microk8s/common/

# 切换到目标命名空间并删除镜像
kubectl config use-context ak-tst
crictl rmi docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b

# 再次查看磁盘使用
df -h /var/snap/microk8s/common/

如果磁盘空间仅减少少量元数据大小(而非8.2GiB),说明镜像层是共享的,没有冗余占用。

方法4:用支持硬链接识别的工具统计

使用ncdu或带特定参数的du统计,它们会自动识别硬链接并只计算一次:

# 用ncdu扫描存储目录,可视化查看真实占用
ncdu /var/snap/microk8s/common/containerd/

# 用du的参数统计真实总占用
du -sh --one-file-system --count-links /var/snap/microk8s/common/containerd/k8s.io/

真实案例验证

某开发服务器的microk8s环境中,du统计显示10个相同镜像总占用101G,但实际通过ctr images ls --size验证,真实总占用仅为单个镜像的8.2GiB左右,确认du的累加是测量假象:

# du统计的累加结果
101G    k8s.io/

# 每个命名空间下的镜像目录大小(du统计)
8.2G    d8a5f98e90a4240465bce9011ee9855f38a1355d98001651692ac32b60de692a/
8.2G    c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8/
# ... 共10个8.2G目录

# 不同du参数的结果对比
du -sh c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8
# 8.2G    c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8

du -sh --apparent-size c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8
# 7.7G    c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8

# 验证所有命名空间的镜像校验和一致
Now using project "ak-tst" on server "https://localhost:8080".
    Image ID:       docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b
Now using project "ks-tst" on server "https://localhost:8080".
    Image ID:       docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b
# ... 其余8个命名空间镜像ID完全一致

内容的提问来源于stack exchange,提问作者mirekphd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:17:03