最稳妥的做法是在 Docker 守护进程层面统一配置日志轮转策略,这样新建容器会自动生效,适合大多数生产环境。
先说结论:通过配置 max-size 和 max-file 限制单个日志文件大小和数量,能有效防止日志无限增长。
- 适合:所有使用默认 json-file 驱动的场景
- 先准备:确认当前 Docker 版本及存储驱动,备份现有配置文件,评估业务低峰期
- 验收:检查新容器日志文件是否按预期轮转,旧容器需重建或重启
紧急场景:启动时指定
如果你希望立即生效且不影响现有容器,可以在启动命令中加参数(注意参数格式):
docker run `--log-opt` max-size=10m `--log-opt` max-file=3 ...
如果要全局生效,修改 daemon.json 后重启服务:
sudo systemctl restart docker
排查:哪个容器日志占用最大
在配置之前,建议先定位当前磁盘占用最高的容器日志。以下命令可列出日志文件最大的前 5 个容器(仅适用于 json-file 驱动):
docker inspect `--format`='{{.LogPath}}' $(docker ps -q) | xargs du -h 2>/dev/null | sort -rh | head -n 5
如果某些容器使用了其他日志驱动(如 journald),该命令可能会报错,忽略即可。
永久生效:全局配置(推荐)
- 找到 Docker 配置文件,通常位于
/etc/docker/daemon.json。如果文件不存在,可以新建。 - 编辑文件,加入日志驱动配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 重载配置并重启 Docker 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
高风险提示:重启 Docker 服务会导致宿主机上所有容器中断。生产环境请务必在业务低峰期操作,或提前规划滚动更新策略,避免服务不可用。
验证配置是否生效
启动一个新容器,写入一些日志,然后动态获取日志路径进行检查,避免硬编码路径导致验证失败:
# 获取容器日志路径
LOG_PATH=$(docker inspect `--format`='{{.LogPath}}' <容器 ID>)
# 查看日志文件大小及轮转文件
ls -lh $LOG_PATH*
观察是否有类似 -json.log.1、-json.log.2 的轮转文件生成,且总大小不超过设定值的倍数。
常见坑
- 已运行的容器不会自动继承全局配置,需要重建或重启容器才能生效。
- 如果使用了 syslog 或 journald 等其他驱动,max-size 参数可能不适用,需查阅对应驱动文档。
- 设置过小可能导致重要日志丢失,设置过大则失去轮转意义,需根据业务日志量权衡。
- 修改 daemon.json 前建议备份,格式错误会导致 Docker 服务无法启动。
参考来源
- Docker 官方文档 - Configure logging drivers: https://docs.docker.com/config/containers/logging/configure/
- Docker 官方文档 - JSON File Logging Driver: https://docs.docker.com/config/containers/logging/json-file/