Linux Docker 日志占满磁盘解决

13次阅读

linux docker 日志占满磁盘主因是容器日志默认不轮转、不限大小,需从清理(用 truncate 清空而非 rm)、限制(单容器或全局配置 json-file 的 max-size 和 max-file)、监控(定期统计日志大小、分区使用率)三方面解决。

Linux Docker 日志占满磁盘解决

Linux 上 Docker 日志占满磁盘,核心是容器日志默认不轮转、不限大小,长期运行后 /var/lib/docker/containers/**/*-json.log 文件会持续膨胀。解决需从清理、限制、监控三方面入手。

快速释放已占磁盘空间

先定位大日志文件并清空(注意:不能直接 rm,Docker 进程仍持有句柄,磁盘空间不会释放):

  • 查最大日志:du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -10
  • 清空指定日志:truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log</container-id></container-id>
  • 批量清空所有日志(谨慎执行):find /var/lib/docker/containers/ -name '*-json.log' -exec truncate -s 0 {} ;

永久限制单个容器日志大小和数量

docker rundocker-compose.yml 中配置日志驱动参数,推荐使用 json-file 驱动并启用轮转:

  • 命令行启动时加参数:--log-driver json-file --log-opt max-size=10m --log-opt max-file=3
  • Docker Compose 示例:
    services:   app:     image: nginx     logging:       driver: "json-file"       options:         max-size: "10m"         max-file: "3"
  • 生效后新容器日志单个不超过 10MB,最多保留 3 个历史文件(即最多 30MB)

全局配置所有新容器默认日志策略

修改 Docker 守护进程配置,让所有后续创建的容器自动继承日志限制:

  • 编辑 /etc/docker/daemon.json(若不存在则新建):
  • 加入以下内容(示例限制为 20MB/ 5 个文件):
    {"log-driver": "json-file",   "log-opts": {     "max-size": "20m",     "max-file": "5"} }
  • 重启 Docker:systemctl restart docker(旧容器不受影响,仅对新创建的容器生效)

日常监控与预防建议

避免问题复发,建议建立简单检查机制:

  • 定期查看日志总占用:du -sh /var/lib/docker/containers/*/*-json.log | awk '{sum += $1} END {print sum/1024/1024 " MB"}'
  • 将日志路径加入 df 监控范围,比如监控 /var/lib/docker 所在分区使用率
  • 生产环境慎用 docker logs -f 长时间挂起,尤其当日志量大时可能阻塞或本地缓存激增
  • 如需详细日志分析,建议接入 ELK、Loki 或直接配置容器输出到 syslog/rsyslog,脱离 JSON 日志文件依赖

text=ZqhQzanResources