Docker容器日志管理与磁盘空间优化


一、问题背景

Docker容器运行时会持续生成日志文件(默认存储路径 /var/lib/docker/containers/),日志文件以 -json.log 结尾。长期运行的容器可能导致日志文件占用大量磁盘空间,最终引发系统磁盘空间不足的问题。


二、解决方案

1. 容器级限制

通过 docker rundocker create 命令指定日志限制参数:

docker run --log-opt max-size=10m --log-opt max-file=3 <image_name>
  • 参数说明

    参数作用
    max-size=10m单个日志文件最大10MB
    max-file=3最多保留3个日志文件(含当前日志)

2. 全局限制

修改 Docker 守护进程配置文件 /etc/docker/daemon.json

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}
  • 生效步骤

    systemctl daemon-reload
    systemctl restart docker
    ⚠️ 注意:此配置仅对新建容器生效,已有容器需重建或重启。

三、日志清理脚本

1. 清理脚本

#!/bin/sh
echo "======== 开始清理容器日志 ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs; do
  echo "清理日志: $log"
  cat /dev/null > $log
done
echo "======== 容器日志清理完成 ========"

2. 注意事项

  • 禁止直接删除:使用 rm -rf 删除运行中的容器日志不会释放磁盘空间(文件被进程占用)。
  • 推荐方式

    • 使用脚本覆盖清空:cat /dev/null > <日志文件>
    • 或删除后重启容器:rm -rf <日志文件> && docker restart <容器名>

四、进阶配置(Docker Compose)

1. 服务级限制

docker-compose.yml 中配置日志参数:

services:
  nginx:
    image: nginx:1.12.1
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "2"
  • 效果:单个服务日志总大小上限为 50m × 2 = 100MB

2. 全局配置示例

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m",
    "max-file": "3"
  }
}
  • 总日志上限500m × 3 = 1.5GB(每个容器独立计算)。

五、原理说明

1. 日志驱动机制

  • 默认使用 json-file 驱动,日志以 JSON 格式存储,包含时间戳、来源(stdout/stderr)等元数据。
  • 支持的高级参数:

    参数用途
    labels按容器标签过滤日志
    env按环境变量过滤日志
    env-regex正则匹配环境变量

2. 日志滚动策略

  • 当日志文件达到 max-size 时,Docker 会重命名文件为 .1, .2 等后缀,并创建新文件。
  • 超出 max-file 的旧文件会被自动删除。

六、最佳实践

  1. 同时设置容器级和全局限制,避免单一配置失效。
  2. 定期执行清理脚本(如配合 crontab)。
  3. 监控磁盘使用:使用 docker infodf -h 跟踪日志占用情况。
  4. 生产环境禁用默认日志:通过配置 log-driver=none 禁用无用日志。
最后修改:2025 年 05 月 23 日
如果觉得我的文章对你有用,请随意赞赏