先止血再防复发:快速清空容器-json.log日志释放空间,再通过daemon.json配置max-size/max-file限制日志增长,java应用需挂载外部日志路径并启用滚动策略。

核心思路是“先止血、再防复发”——快速释放空间 + 长效限制日志增长,不依赖人工干预。
快速定位并清空占空间的日志文件
宿主机磁盘告警后,第一步不是删镜像或容器,而是直奔 Docker 容器日志目录:
- 运行 df -h 查看哪个分区满(常见是
/var或根分区) - 确认 Docker 数据路径:默认为
/var/lib/docker/containers/ - 用 du -sh /var/lib/docker/containers/* | sort -hr | head -5 找出前几个最大目录
- 进入对应容器目录,找
*-json.log文件(如abc123...-json.log),它就是 Docker 默认记录的标准输出日志 - 清空而非删除:执行 cat /dev/null > abc123...-json.log —— 这能立即释放磁盘空间,且不影响容器运行和日志写入
全局配置日志大小上限(推荐首选)
避免反复手动清理,应在 Docker 守护进程层面统一设限。编辑或新建 /etc/docker/daemon.json:
- 添加如下内容(示例:单个容器日志最多 100MB,保留最多 3 个轮转文件):
{"log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "3"}} - 保存后执行 systemctl daemon-reload && systemctl restart docker
- 注意:该配置只对重启后新建的容器生效;已有容器需重建(
docker-compose down && up -d或docker rm -f 容器名 && docker run...)才受控
在 Java 应用层配合控制日志输出
Docker 层限制的是标准输出日志(stdout/stderr),但 Java 应用常通过 Logback 或 Log4j 自行写文件(如 /app/logs/)。这类日志不会被 Docker 管理,却同样会撑爆磁盘:
- 务必把应用日志挂载到宿主机外部路径(如
-v /data/app-logs:/app/logs),并确保该路径不在系统盘(例如放在/data大分区) - 在 Logback 配置中启用滚动策略,例如:
logs/app.%d{yyyy-MM-dd}.%i.log
100MB
- 禁止将日志直接写在容器内部无挂载路径下,尤其避免长期运行未清理的定时任务刷日志
补充建议:切换日志驱动或加监控
对高日志量场景可进一步优化:
- 改用 local 日志驱动(比 json-file 更省空间、支持压缩):
{"log-driver": "local", "log-opts": {"max-size": "100m", "max-file": "3"}} - 禁用 json-file 后,
docker logs仍可用,但历史日志不再以明文 JSON 存储 - 在运维侧加磁盘监控告警(如 Prometheus + Node Exporter),阈值设为 85%,早于 95% 触发人工介入
- 定期用 docker system df 和 du -sh /var/lib/docker/containers/*/ 做巡检,不等告警才查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











