要准确查看容器磁盘占用,需区分可写层、已停止容器和数据卷:用 docker system df 查全局存储,docker inspect + du -sh 查单个容器可写层及挂载路径,配合 ncdu 分析大文件,生产环境应自动化采集 df 数据并限制日志大小。

直接看容器实际占了多少磁盘空间,不能只靠 docker stats,因为它不显示存储用量。重点要区分三类对象:运行中容器的可写层、已停止但未删除的容器、以及挂载的数据卷——它们各自占用磁盘的方式不同,监控方法也得分开处理。
查整体 Docker 存储占用(镜像+容器+卷)
用 docker system df 快速掌握全局情况:
- 显示镜像、运行/已停止容器、本地卷各自的总大小和可回收空间
- 输出中 SIZE 列是真实磁盘占用,RECLAIMABLE 是删掉无用对象后能释放的量
- 加
-v参数可展开每类资源的明细,比如列出哪些镜像或卷最占空间
查单个容器的可写层大小
每个容器启动时都会创建一个可写层(upperdir),这部分数据独立于镜像,是真正“属于该容器”的磁盘消耗:
- 先用
docker inspect <container></container>找到GraphDriver.Data.UpperDir路径 - 在宿主机上执行
du -sh <upperdir></upperdir>查实际大小 - 注意:这个路径通常在
/var/lib/docker/overlay2/下,权限需 root 或 docker 组用户
查绑定挂载(bind mount)或卷(volume)的实际占用
如果容器通过 -v /host/path:/container/path 或命名卷挂载了外部存储,那空间就记在宿主机目录或 volume 目录里:
- 对 bind mount:查
docker inspect <container></container>中Mounts字段的Source,然后du -sh <source></source> - 对 named volume:用
docker volume inspect <vol-name></vol-name>看Mountpoint,再du -sh该路径 - 推荐用
ncdu交互式查看内部大文件分布,比单纯du更直观
长期监控建议
人工查适合排查问题,生产环境建议自动化:
- 定期采集
docker system df --format "{{.Size}}"做趋势记录 - 结合
cgroups文件系统(如/sys/fs/cgroup/blkio/docker/<id>/blkio.io_service_bytes</id>)抓磁盘 I/O 速率,辅助判断是否写入过载 - 日志目录最容易失控,可在容器启动时用
docker run --log-opt max-size=10m --log-opt max-file=3限制日志体积











