Docker容器日志管理与磁盘空间优化
一、问题背景
Docker容器运行时会持续生成日志文件(默认存储路径 /var/lib/docker/containers/
),日志文件以 -json.log
结尾。长期运行的容器可能导致日志文件占用大量磁盘空间,最终引发系统磁盘空间不足的问题。
二、解决方案
1. 容器级限制
通过 docker run
或 docker 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
的旧文件会被自动删除。
六、最佳实践
- 同时设置容器级和全局限制,避免单一配置失效。
- 定期执行清理脚本(如配合
crontab
)。 - 监控磁盘使用:使用
docker info
或df -h
跟踪日志占用情况。 - 生产环境禁用默认日志:通过配置
log-driver=none
禁用无用日志。