Docker日志太多撑爆硬盘?一次搞定日志轮转与清理
运维过Docker容器的朋友,大概率都经历过这样的惊魂时刻:突然收到磁盘告警,df -h一看,根目录使用率100%。顺着路径查下去,发现/var/lib/docker/containers/下躺着好几个几十GB的日志文件。
没错,Docker默认的json-file日志驱动不会自动轮转。容器里输出的每一条日志都会被原封不动地记录下来,日积月累,直到撑爆你的硬盘。
今天这篇文章,就带你彻底解决这个问题——包含全局配置、单容器配置,以及旧日志的清理方案。
全局配置(推荐生产环境兜底)
修改Docker守护进程的配置文件/etc/docker/daemon.json(如果文件不存在,新建即可):
1 | { |
参数说明:
max-size:单个日志文件的大小上限,达到此值会自动轮转;max-file:保留的日志文件数量,此处为3个,总日志量控制在30MB以内;compress:是否压缩轮转出来的旧日志,节省空间。
配置完成后,执行以下命令使配置生效,该命令会重启所有容器,建议在业务低峰期或维护窗口操作。
1 | sudo systemctl restart docker |
需要注意的是:新增的全局配置仅对后续创建的容器有效,对于既有容器,需通过重建或手动清理的方式清理日志。
单容器配置(更灵活)
如果你不想影响全局,或者只想针对某个特定容器配置更小的日志限制,可以在容器启动时单独指定。
Docker Compose方式(在docker-compose.yml中添加):
1 | services: |
修改后执行docker-compose up -d重建容器即可。
Docker Run方式:
1 | docker run \ |
如何清理已经撑爆的旧日志?
配置轮转之后,只对新产生的日志生效。已经存在的超大日志文件不会自动消失,需要手动清理。
重建容器(最彻底)
如果你刚好要重新配置容器(比如修改了docker-compose.yml),重建时旧容器会被移除,其关联的日志文件也会一并删除。
1 | docker-compose down && docker-compose up -d |
在线清空(不停机)
如果容器不能重启,可以使用truncate命令将日志文件“截断”为0大小,而不会破坏Docker对该文件的写入句柄。
1 | # 先找到日志文件的真实路径: |
一键清理所有容器日志(谨慎操作)
如果你确定要清理当前所有容器的日志,可以执行:
1 | sudo find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \; |
注意:千万不要用
rm直接删除日志文件!因为Docker进程还在占用文件句柄,直接删除会导致写入失败,甚至容器异常。
总结
| 场景 | 推荐方案 |
|---|---|
| 生产环境统一管理 | 修改daemon.json全局配置 |
| 某容器日志特别频繁 | 单容器单独设置更小的max-size |
| 旧日志已撑爆磁盘 | 使用truncate清空或重建容器 |
| 一劳永逸 | 新部署的容器务必加上日志轮转参数 |
日志轮转是容器运维的基础但至关重要的环节。别等到服务器告警才想起来配置,现在就去检查你的Docker环境吧!








