为何du显示Docker占用空间超过EBS卷可用容量?
问题原因与解决方案
为什么du统计的overlay2大小远超磁盘实际容量?
这是Docker overlay2存储驱动的分层特性导致的重复统计:
- overlay2采用分层存储,基础镜像层、中间层会被多个容器共享复用。
du是遍历文件系统的每个文件路径统计大小,会把每个容器引用的共享层都单独算一遍,叠加起来就会远大于实际物理磁盘占用。 df是从文件系统层面统计已使用的物理块,共享层的物理空间只会被计算一次,所以df的结果才是磁盘实际占用情况。
如何获取Docker实际占用的准确空间?
用Docker官方提供的命令替代du,它会自动处理共享层的重复统计问题:
docker system df
加上-v参数可以查看详细的分层、容器、镜像占用情况,共享层会被标记为SHARED SIZE,仅统计一次:
docker system df -v
容器内显示22G的逻辑
容器内看到的是逻辑空间大小,包含该容器的可写层+所有只读层(基础镜像、中间层)的总和,但只读层是多个容器共享的,实际物理磁盘上只读层只存储了一份,所以容器内的统计不等于物理磁盘的实际占用。
先解决当前磁盘满的问题
- 清理Docker冗余资源:
- 清理未使用的镜像(包括悬空镜像):
docker image prune -a -f - 清理已停止的容器:
docker container prune -f - 清理未使用的卷和网络:
docker volume prune -f docker network prune -f
- 清理未使用的镜像(包括悬空镜像):
- 清理容器日志:
容器日志默认无轮转机制,会持续占用磁盘空间。找到对应容器的日志文件(路径为/var/lib/docker/containers/<容器ID>/<容器ID>-json.log),执行命令清空:
永久解决可修改Docker配置文件truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log/etc/docker/daemon.json,添加日志轮转规则(修改后重启Docker服务生效):{ "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }
扩容前的确认
用docker system df确认Docker实际占用的物理空间,结合df -h的结果判断是否真的需要扩容:
- 如果清理后磁盘空间足够,无需扩容;
- 若确实需要扩容EBS卷,先在AWS控制台调整卷的大小,再在Ubuntu实例上扩展文件系统:
sudo growpart /dev/nvme0n1 1 sudo resize2fs /dev/nvme0n1p1
内容的提问来源于stack exchange,提问作者jlmt
相关产品推荐
相关产品推荐

