Docker容器日志打爆磁盘?教你用3招彻底搞定日志轮转与清理

举报
yd_225891185 发表于 2026/11/06 14:29:17 2026/11/06
【摘要】 Docker容器日志打爆磁盘?教你用3招彻底搞定日志轮转与清理在生产或日常开发测试环境中,很多开发者都踩过同一个坑:某天服务器突然报警磁盘使用率 100%,连 SSH 自动补全甚至某些基础服务都挂了。排查一通 du -sh,发现罪魁祸首居然是 /var/lib/docker/containers/ 下面几十甚至上百个 G 的 *-json.log 文件。默认情况下,Docker 使用 js...

Docker容器日志打爆磁盘?教你用3招彻底搞定日志轮转与清理

在生产或日常开发测试环境中,很多开发者都踩过同一个坑:某天服务器突然报警磁盘使用率 100%,连 SSH 自动补全甚至某些基础服务都挂了。排查一通 du -sh,发现罪魁祸首居然是 /var/lib/docker/containers/ 下面几十甚至上百个 G 的 *-json.log 文件。

默认情况下,Docker 使用 json-file 作为日志驱动,而且默认不会限制单个日志文件大小,也不会自动滚动删除。如果容器内服务输出日志未做控制(例如高频 Debug 日志或异常循环打印),撑爆磁盘只是时间问题。

本文介绍 3 种具体可落地的解决方案:全局兜底策略、单容器按需配置以及紧急避险清理手法。


方案一:全局兜底配置(推荐生产标配)

最省心且治本的方法,是修改 Docker daemon 的全局配置。这样新启动的容器无论有没有单独配置,都会继承这个限制。

编辑 /etc/docker/daemon.json(若文件不存在则新建):

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}
  • max-size:单个日志文件上限(如 50m 或 100m)。
  • max-file:滚动保留的文件数量。当达到上限后,旧日志会自动被轮转覆盖。单个容器的日志占用上限即为 50m * 3 = 150m。

保存后,重载并重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

注意:全局配置修改后,仅对新创建的容器生效。已存在的存量容器需要重新 docker compose down && docker compose up -d 或重新 run 才能应用新规则。


方案二:单个容器或 Docker Compose 定向配置

如果你只需要对某些“日志大户”(如 Nginx 反代、爬虫、高吞吐 API)进行单独限制,或者没有修改主机 daemon 的权限,可以在容器定义中指定参数。

1. docker run 命令行参数

docker run -d \
  --name web-app \
  --log-opt max-size=20m \
  --log-opt max-file=3 \
  -p 8080:80 \
  nginx:alpine

2. docker-compose.yml 语法

在服务声明中使用 logging 配置块:

version: '3.8'

services:
  app:
    image: my-service:latest
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"
    restart: unless-stopped

该方式优先级高于 daemon.json,适合不同服务差异化日志策略的场景。


方案三:磁盘已满时的“急救”与踩坑避雷

当服务器磁盘已经 100% 时,切忌盲目执行 rm -rf *.log!

为什么不能直接 rm?

在 Linux 中,如果容器进程仍然持有该日志文件的句柄(fd),直接用 rm 删除文件,只是删除了目录项引用,inode 并没有被释放。结果就是磁盘空间依然占用 100%,必须重启 Docker 守护进程才能释放空间。

正确的在线清空姿势

使用重定向置空文件内容,inode 保持不变且空间立即释放:

# 1. 查找体积超过 1G 的容器日志
find /var/lib/docker/containers/ -name "*-json.log" -size +1G

# 2. 安全清空指定的日志文件
truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
# 或者:
cat /dev/null > /var/lib/docker/containers/<container-id>/<container-id>-json.log

如果容器众多,可以用单行命令批量清空所有容器日志:

find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} +

最佳实践总结

  1. 装机即配置:在部署新服务器时,把 daemon.json 的 max-size 和 max-file 纳入初始化自动化脚本(Ansible / Shell)。
  2. 应用日志内聚:业务系统内日志尽量挂载出来由统一的收集器(Logstash / Vector / FluentBit)打到远端,标准输出(stdout/stderr)仅保留必要的生命周期与核心告警信息。
  3. 监控巡检:通过 Prometheus + Node Exporter 监控 Docker root dir 所在挂载盘的利用率,在达到 85% 时即时告警,防患于未然。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。