Docker 磁盘占用诊断:system df、builder du 与 buildx du
分层查看 Docker 镜像、容器、卷和 BuildKit 构建缓存的磁盘占用,区分可回收空间与活动数据。
#howto
#growing
#ops
#docker
#linux
#linux
[!info] related notes
- 总体流程:Linux 磁盘占用检查与分析
- Docker:Docker、Docker MOC
- Builder Cache:Docker构建器缓存(Builder-Cache)
Docker 磁盘占用诊断:system df、builder du 与 buildx du
定位
当 gdu 看到 /var/lib/docker、/var/lib/containerd 很大时,不要直接 rm -rf。
Docker / containerd 的 layer、snapshot、content blob 有内部引用关系,应优先通过 Docker CLI 判断:
镜像
容器 writable layer
volume
BuildKit cache
第一层:docker system df
docker system df
它给出 Docker 维度的总览:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images
Containers
Local Volumes
Build Cache
重点是 RECLAIMABLE:
它表示 Docker 判断当前没有必要继续持有、理论上可回收的数据,而不是“所有 SIZE 都可以删”。
详细模式
docker system df -v
用于继续定位具体 image、container、volume。
第二层:Builder / BuildKit
经典 builder:
docker builder du
如果当前环境主要使用 Buildx / BuildKit:
docker buildx du
Docker 官方 docker buildx du 会显示:
- cache record ID;
RECLAIMABLE;SIZE;LAST ACCESSED;- Shared / Private / Total。
详细输出:
docker buildx du --verbose
为什么磁盘上看到 30 GB,不等于能删 30 GB
容器镜像采用内容寻址与 layer 共享:
Image A ─┐
├─ shared layer
Image B ─┘
所以:
- 多个 tag 可能指向同一个 image ID;
- 多个 image 可能共享 layer;
- build cache 也可能与 image 共享底层数据。
因此不能把每个 tag 显示的大小直接相加。
清理顺序
1. 先确认活动容器
docker ps
再映射实际 image ID:
docker ps -q | xargs -r docker inspect -f '{{.Name}} {{.Image}}'
2. Builder cache
确认确实是可回收构建缓存后:
docker builder prune
更激进:
docker builder prune -a
-a 会删除更多未使用 cache,可能使下次构建明显变慢。
3. dangling images
docker image prune
4. 明确的旧业务镜像
比 docker system prune -a 更稳妥的方法是:
识别当前运行镜像
→ 保留最近 rollback anchor
→ 按 image ID / tag 精确删除旧构建
docker image rm <image-or-tag>
5. Volume 最谨慎
Volume 很可能就是数据库和业务状态。
docker volume ls
docker system df -v
删除前必须确认 owner、挂载关系和数据生命周期。
不应该做什么
不要直接删除 containerd 数据目录
rm -rf /var/lib/containerd/* # 危险
这可能破坏运行时元数据与正在使用的 snapshot。
不要把 docker system prune -a --volumes 当日常命令
这条命令把多个危险动作捆在一起,不利于审计和回滚。
containerd 占用很大时
先看:
sudo du -xhd1 /var/lib/containerd | sort -h
常见大项:
io.containerd.snapshotter.v1.overlayfs
io.containerd.content.v1.content
再回到 Docker CLI 判断对应镜像 / cache,而不是直接处理目录本身。
来源
- Docker system:https://docs.docker.com/reference/cli/docker/system/
- Docker Buildx disk usage:https://docs.docker.com/reference/cli/docker/buildx/du/