Compose 生产环境如何优化日志驱动避免磁盘占满

文章导读
生产环境防止 Docker 日志占满磁盘,最稳妥的做法是在 Compose 文件中为服务配置日志驱动的大小限制,或直接使用集中式日志驱动。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

生产环境防止 Docker 日志占满磁盘,最稳妥的做法是在 Compose 文件中为服务配置日志驱动的大小限制,或直接使用集中式日志驱动。

先说结论:默认配置下日志会无限增长,必须在 Compose 文件或守护进程配置中显式设置轮转策略。

  • 适合:所有使用默认 json-file 驱动且未配置限制的生产服务
  • 先准备:确认当前日志文件大小及磁盘剩余空间,备份现有 compose 文件
  • 验收:重启服务后检查新生成的日志文件是否按大小切割

命令速用版

在 docker-compose.yml 的服务层级添加 logging 配置,示例如下:

Compose 生产环境如何优化日志驱动避免磁盘占满
version: "3"
services:
  web:
    image: nginx
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"

修改后执行 docker compose up -d 重建容器。

Compose 生产环境如何优化日志驱动避免磁盘占满

为什么会这样

Docker 默认的日志驱动是 json-file,它将容器标准输出写入宿主机的 JSON 文件中。如果不加限制,这个文件会随着业务运行一直变大,直到占满磁盘分区。官方文档明确指出了日志驱动需要配置选项来控制大小。

分步处理

  1. 检查现状:使用 docker inspect <容器名> | grep LogPath 找到日志文件路径,用 ls -lh 查看当前大小。
  2. 修改配置:编辑 docker-compose.yml,在每个需要限制的服务下加入上述 logging 块。也可以在全局默认配置中设置,但服务级配置优先级更高。
  3. 重建容器:日志配置仅在容器创建时生效,必须执行 docker compose down 后再 docker compose up -d,单纯重启无效。
  4. 清理旧日志:新配置不会自动删除已产生的巨大日志文件,需手动清理旧文件释放空间。

怎么验证是否生效

容器运行一段时间后,进入日志目录查看。如果配置生效,你会看到类似 container-id-json.logcontainer-id-json.log.1 等多个文件,且单个文件大小不超过设定的 max-size

Compose 生产环境如何优化日志驱动避免磁盘占满

也可以使用 docker inspect <容器名> 查看 LogPath 对应的配置信息,确认 MaxSizeMaxFile 字段已更新。

常见坑

  • 驱动选 none:设置为 driver: "none" 虽能彻底禁止日志,但会导致无法排查问题,生产环境慎用。
  • 配置不生效:修改 compose 文件后只跑了 restartup 而没有 down,容器重建不彻底,配置不会应用。
  • 全局与局部冲突:如果在 daemon.json 设置了全局日志配置,又在 compose 里设置了服务级配置,服务级优先级更高,需确认最终生效的是哪一个。
  • 集中式日志成本:若改用 syslogfluentd 驱动,需确保对应的日志收集服务可用,否则容器可能启动失败或日志丢失。

参考来源

  • Docker Official Documentation - Configure logging drivers: https://docs.docker.com/config/containers/logging/configure/
  • Docker Compose File Reference - Logging: https://docs.docker.com/compose/compose-file/compose-file-v3/#logging