Docker Compose 日志文件过大如何配置 logging 驱动切割

文章导读
通过在 docker-compose.yml 中配置 logging 驱动的 max-size 为 10m 和 max-file 为 3,可有效将单个容器日志文件限制在 30MB 以内,防止磁盘空间耗尽导致节点宕机。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

Docker Compose 日志文件过大如何配置 logging 驱动切割

通过在 docker-compose.yml 中配置 logging 驱动的 max-size 为 10m 和 max-file 为 3,可有效将单个容器日志文件限制在 30MB 以内,防止磁盘空间耗尽导致节点宕机。

原因分析

Docker 默认使用 json-file 日志驱动将容器的标准输出和标准错误输出写入本地文件,路径位于/var/lib/docker/containers//-json.log。这种简单直接的方式在初期部署中表现良好,但随着服务规模扩大,容器持续运行过程中产生的日志会不断追加到磁盘文件中,若缺乏有效的轮转和清理策略,极易导致磁盘空间耗尽。一个高频输出日志的微服务在数小时内可能生成数 GB 日志,节点宕机风险因磁盘满而上升。

解决方案

方案一:Docker Compose 原生日志轮转配置

在 docker-compose.yml 文件中通过 logging 字段指定日志驱动及选项,这是最推荐的配置方式:

version:'3.8'
services:
  web:
    image: nginx
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

上述配置表示使用 json-file 驱动,限制每个日志文件最大为 10MB,最多保留 3 个历史文件,防止磁盘空间被无限占用。该配置于 2025 年 11 月 20 日发布的技术文档中被验证有效。

方案二:Docker 守护进程全局配置

如果要对所有容器应用统一的日志轮转策略,可修改 Docker 的守护进程配置文件/etc/docker/daemon.json:

Docker Compose 日志文件过大如何配置 logging 驱动切割
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

保存文件后,需要重启 Docker 服务以使配置生效:sudo systemctl restart docker。若结果显示"Job for docker.service failed because the control process exited with error code",则需运行 systemctl status docker.service 和 journalctl -xe 查看详细信息。

方案三:使用外部日志管理工具 logrotate

如果内置日志驱动的功能不满足需求,可考虑使用 logrotate 这样的外部日志管理工具。创建配置文件/etc/logrotate.d/docker-container:

/var/lib/docker/containers/*/*.log {
  rotate 3
  size 10M
  copytruncate
  missingok
  notifempty
  compress
  delaycompress
}

该配置会针对所有 Docker 容器日志,当大小达到 10MB 时进行分割,最多保留 3 个文件,压缩旧文件。此方案于 2024 年 7 月 8 日的技术资料中被记录。

Docker Compose 日志文件过大如何配置 logging 驱动切割

方案四:使用集中式日志驱动

在生产环境中,通常需要更高效的日志处理方案,例如通过 fluentd 将日志发送至集中式日志系统:

version:'3.8'
services:
  nginx:
    image: nginx:alpine
    logging:
      driver: "fluentd"
      options:
        fluentd-address: "localhost:24224"
        tag: "service.nginx"

确保目标 Fluentd 服务正在运行并监听指定端口,否则容器可能因日志写入失败而启动异常。

注意事项

第一,nginx 采用 docker 部署时,日志没有自动切割会导致 access.log 无限增大,原因是 nginx 容器里面没有 logrotate 服务,会出现"logrotate: command not found"报错,该问题于 2024 年 10 月 17 日被用户反馈。第二,当日志写入速度超过采集处理能力时,可能造成应用阻塞,建议结合异步采集工具(如 Fluent Bit)与轻量级驱动配合使用。第三,在容器频繁启停或被调度系统重建时,若未对接外部日志系统,原有日志将随容器生命周期结束而消失,给故障排查带来巨大挑战。第四,Docker 安装完成后默认未启动,需要执行 systemctl enable docker 和 systemctl start docker 命令,若安装特定版本如 docker-ce-24.0.0,需使用完整软件包名称安装。

参考来源

来源:CSDN 博客 - Docker 运维必知技巧:掌握这 4 个参数,轻松实现日志自动切割与删除

Docker Compose 日志文件过大如何配置 logging 驱动切割

来源:博客园 - Docker 日志文件切割以及大小配置(Dsz.java,2021 年 12 月 15 日)

来源:技术社区 - Docker Compose 日志驱动深度解析(2025 年 11 月 20 日发布)

来源:技术社区 - docker 里日志分割的方法(2024 年 7 月 8 日)