直接原因是容器日志持续写入、镜像和数据卷长期累积,填满宿主机根分区,导致dockerd无法创建新容器或写入元数据,表现为守护进程无响应、docker ps卡死及“no space left on device”报错。

直接原因是容器日志持续写入、镜像和数据卷长期累积,最终填满宿主机根分区,触发 dockerd 无法创建新容器、挂载路径或写入元数据,表现为守护进程无响应、docker ps 卡死、no space left on device 报错。
快速止血:立即释放磁盘空间
不等排查完成,先执行以下三步止损:
- 运行
docker system df查看镜像、容器、卷各自占用量,确认是否日志占大头(常见于/var/lib/docker/containers/**/*-json.log) - 用
du -sh /var/lib/docker/containers/*/logs/*.log | sort -hr | head -5找出最大的几个日志文件 - 清空而非删除日志(避免中断正在写入的容器):
truncate -s 0 /var/lib/docker/containers/*/logs/*.log
永久限制容器日志大小
默认日志驱动(json-file)不限制单个日志文件,必须显式配置:
- 全局生效(推荐):修改
/etc/docker/daemon.json,添加日志策略后重启 Docker:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - 单容器覆盖:启动时加参数
--log-opt max-size=5m --log-opt max-file=2 - 验证是否生效:
docker inspect <container_id> | grep -A 5 LogConfig</container_id>
清理残留资源防复发
仅清空日志不够,还需定期清除“看不见”的垃圾:
- 删掉已退出但未移除的容器:
docker rm $(docker ps -aq --filter status=exited) - 清理悬空镜像(
<none>):docker rmi $(docker images -f "dangling=true" -q) - 删除未被任何容器引用的数据卷:
docker volume prune - 一键深度清理(谨慎):
docker system prune -a --volumes(会删掉所有未使用的镜像、卷、网络)
监控与告警前置化
等爆满再处理是被动运维。建议落地两项基础动作:
- 在宿主机部署简单巡检脚本,例如每5分钟检查
df / | awk 'NR==2 {print $5}' | sed 's/%//',超90%发钉钉/邮件 - 为关键容器加健康检查,配合
restart: unless-stopped或编排工具自动恢复,避免因磁盘满导致服务静默不可用 - 把
docker system df和du -sh /var/lib/docker/*加入日常运维 checklist


















