容器磁盘占用只计算其可写层增量数据,非镜像体积;用docker ps --size查运行中容器的size列(独有数据)和virtual size列(镜像+size),docker system df -v可查全部容器(含已停止)的size,该值与docker ps --size一致。
镜像是只读的模板,用来创建容器;容器是镜像的运行实例,包含可写层,实际磁盘占用主要来自这一层。查看容器磁盘大小,关键不是看镜像体积,而是它自己的增量写入部分。
用 docker ps --size 快速看运行中容器的大小
这个命令直接显示每个运行中容器的可写层大小(SIZE列),以及叠加镜像后的虚拟总大小(VIRTUAL SIZE):
- SIZE 是容器独有的变更数据,比如日志、临时文件、应用生成的数据
- VIRTUAL SIZE = 镜像大小 + SIZE,但多个容器共享同一镜像时,镜像部分不重复计算
- 注意:已停止的容器不会出现在
docker ps结果里,此命令查不到
用 docker system df -v 查所有容器(含已停止)的详细占用
执行 docker system df -v 后,在 “Containers space usage” 区域会列出每个容器的 ID、镜像、命令、创建时间、状态、名称和 SIZE —— 这个 SIZE 和 docker ps --size 中的一致,且覆盖全部容器(包括 docker ps -a 能看到的)。
- 输出中的 SIZE 列就是该容器可写层实际占用的磁盘空间
- 如果某容器 SIZE 异常大(比如几百 MB 以上),说明它内部可能积累了大量日志或缓存
- 配合
docker ps -a --format "{{.Names}}\t{{.Size}}" | sort -k2 -h -r可按大小倒序排列,快速定位大户
深入定位:进 overlay2 目录查真实目录大小
当需要确认某个容器是否真占用了那么多空间,或排查异常增长时,可以查它的底层存储路径:
- 先获取容器的 UpperDir 路径:
docker inspect -f '{{.GraphDriver.Data.UpperDir}}' <container_id></container_id> - 进入该路径(通常是
/var/lib/docker/overlay2/<xxx>/diff</xxx>),运行du -sh . - 结果即为该容器可写层的真实磁盘占用,和
docker ps --size显示值基本一致 - 若发现
diff很小但整体磁盘吃紧,问题可能出在卷(volumes)或构建缓存上
顺带一提:别混淆镜像大小和容器大小
docker images 显示的是镜像层总和,是只读的、可被多个容器共享的;而容器大小只算它自己写的那部分。一个 500MB 的镜像,启动 10 个容器,镜像本身仍只占一份空间,但 10 个容器各自的可写层加起来可能再占几个 GB。











