容器报“no space left on device”根源在于镜像分层与容器可写层、日志、缓存等均默认写入宿主机根分区;/var/lib/docker下累积的未清理镜像层、停止容器、悬空层及json日志共同导致磁盘耗尽。
容器启动报错 “no space left on device”,和镜像、容器本身的概念密切相关,但问题根源不在概念混淆,而在它们在磁盘上的实际存储行为。
镜像与容器如何占用磁盘空间
镜像是只读的分层文件系统,每次构建或拉取都会在 /var/lib/docker 下新增层数据;容器则是在镜像基础上叠加一个可写层(如 overlay2),同时还会生成日志文件、临时卷、构建缓存等。这些全部默认落在宿主机的根分区(通常是 /)上。即使你只运行一个容器,长期积累的未清理镜像、停止的容器、悬空层和日志也可能撑爆磁盘。
快速定位空间被谁占满
执行以下命令逐层排查:
-
看整体磁盘使用:
df -h—— 确认是不是/或/var分区已 100% 满 -
查 Docker 占用明细:
docker system df -v—— 显示镜像、容器、本地卷、构建缓存各自占多少空间 -
找大日志文件:
du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -5 -
扫悬空资源:
docker system prune -a --volumes(慎用,会删所有未使用的镜像、容器、卷和网络)
针对性清理策略
不建议直接删文件,应通过 Docker 命令安全释放:
- 删掉已退出但未删除的容器:
docker rm $(docker ps -aq -f status=exited) - 清理悬空镜像(无标签、无容器引用):
docker image prune - 限制单个容器日志大小(预防复发):启动时加参数
--log-opt max-size=10m --log-opt max-file=3 - 清空构建缓存(尤其 CI 环境易堆积):
docker builder prune
长期预防措施
避免反复踩坑,建议从部署初期就配置:
- 把
/var/lib/docker挂载到独立大容量磁盘(如挂载点/mnt/docker),并修改/etc/docker/daemon.json中的data-root - 用
docker-compose.yml统一配置日志驱动和限制,例如:logging:driver: "json-file"options:max-size: "10m"max-file: "3" - 定期巡检:加入 cron 任务,每周运行一次
docker system df并告警阈值超 85%











