Linux 脚本

Docker日志过大的解决方案

管某 4 分钟阅读

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


一、问题背景

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


二、解决方案

1. 容器级限制

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

1
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

1
2
3
4
5
6
7
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
  • 生效步骤
    1
    2
    systemctl daemon-reload
    systemctl restart docker

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


三、日志清理脚本

1. 清理脚本

1
2
3
4
5
6
7
8
#!/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 中配置日志参数:

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

2. 全局配置示例

1
2
3
4
5
6
7
{
"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 禁用无用日志。