Docker 容器日志轮转怎么配置防止磁盘占满操作指南

文章导读
最稳妥的做法是在 Docker 守护进程层面统一配置日志轮转策略,这样新建容器会自动生效,适合大多数生产环境。
📋 目录
  1. A 紧急场景:启动时指定
  2. B 排查:哪个容器日志占用最大
  3. C 永久生效:全局配置(推荐)
  4. D 验证配置是否生效
  5. E 常见坑
  6. F 参考来源
A A

最稳妥的做法是在 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 容器日志轮转怎么配置防止磁盘占满操作指南
docker inspect `--format`='{{.LogPath}}' $(docker ps -q) | xargs du -h 2>/dev/null | sort -rh | head -n 5

如果某些容器使用了其他日志驱动(如 journald),该命令可能会报错,忽略即可。

永久生效:全局配置(推荐)

  1. 找到 Docker 配置文件,通常位于 /etc/docker/daemon.json。如果文件不存在,可以新建。
  2. 编辑文件,加入日志驱动配置:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  1. 重载配置并重启 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/