Docker容器日志清理,防止磁盘占满
服务器磁盘突然被占满,大概率是Docker容器的日志文件在持续增长。
默认情况下,Docker使用json-file日志驱动,每个容器的日志会一直写入/var/lib/docker/containers/下的*-json.log文件,不做任何大小限制。
本文从零开始,先教你定位日志、临时清理,再通过全局配置永久限制日志大小,最后验证效果并给出避坑提醒。
先判断是不是Docker日志把磁盘撑满了
登录服务器后,先看磁盘整体使用情况:
df -h
如果/var/lib/docker所在分区使用率接近100%,继续查看Docker目录占用:
du -sh /var/lib/docker/* | sort -rh | head -10
重点看containers目录。
更精确的方法是直接列出所有容器日志文件大小:
find /var/lib/docker/containers/ -name "*-json.log" -exec du -h {} + | sort -rh | head -20
如果输出里有几百MB甚至几个GB的.log文件,
基本可以确认是Docker日志没有限制导致的。判断条件:
单个*-json.log超过100MB,
或者多个日志文件合计占用了磁盘10%以上空间,
就应该立即处理。
临时清理:释放空间但不重启容器
确认日志文件后,不要直接rm删除,因为容器进程还在写入,直接删除可能导致文件句柄未释放,空间不会立即回收。
正确的临时清空方式是:
# 先进入日志目录,找到大文件
cd /var/lib/docker/containers/<容器ID>/
# 用truncate清空,保留文件句柄
truncate -s 0 *-json.log
如果容器很多,可以用一条命令批量清空:
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
执行后再次运行df -h,磁盘空间应该立刻下降。这个操作不会停止容器,但只是临时方案,日志还会继续增长。
永久限制:配置Docker全局日志大小和数量
要防止磁盘再次被占满,需要修改Docker守护进程配置。
编辑或创建/etc/docker/daemon.json:
nano /etc/docker/daemon.json
写入以下内容(如果文件已有其他配置,合并进去,不要覆盖):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
解释一下:max-size表示单个日志文件最大100MB,max-file表示最多保留3个文件,也就是每个容器日志最多占用300MB。
超过后会滚动覆盖旧日志。
保存后重启Docker服务:
systemctl restart docker
注意:这个配置只对之后新建或重启的容器生效。 已经运行的容器需要重启一次才能应用新的日志限制。
可以用docker restart <容器名>逐个重启,或者安排维护窗口统一重启。
验证日志限制是否生效
重启容器后,进入容器日志目录查看:
ls -lh /var/lib/docker/containers/<容器ID>/
应该能看到类似*-json.log、*-json.log.1、*-json.log.2这样的滚动文件,且每个文件大小不超过100MB。
也可以直接查看Docker信息:
docker info | grep -A5 "Logging Driver"
如果显示Logging Driver:,
json-file
并且下面的Log Options里有max-size和max-file,
说明配置已经生效。验证标准:
新建一个容器,
持续输出日志,
观察日志文件不会无限增长,
而是滚动成多个小文件。
避坑与常见问题
不要直接删除正在写入的日志文件。 用rm删除后,df -h可能仍然显示磁盘满,因为进程还在写已删除的文件。
必须用truncate -s 0清空。
修改daemon.json后Docker起不来怎么办? 最常见原因是JSON格式错误,比如多了逗号、少了引号。
可以用python -m json.tool /etc/docker/daemon.json检查格式,修正后再重启。
容器日志仍然很大,但配置已经加了限制? 检查容器是否在配置修改后重启过。
没有重启的容器仍然沿用旧的日志驱动设置。
另外,docker run时如果单独指定了--log-opt,会覆盖全局配置,需要检查启动参数。
如果使用Docker Compose或Kubernetes,需要单独配置吗? Compose可以在docker-compose.yml中为每个服务添加logging选项;
Kubernetes则需要在Pod配置中设置logConfig或使用集群级别的日志策略。
全局daemon.json对它们同样有基础作用,但按需覆盖更稳妥。
磁盘已经满了,Docker命令都执行不了怎么办? 先手动truncate最大的几个日志文件释放空间,再执行systemctl restart docker。
如果truncate也失败,可以尝试echo >重定向清空,但优先用truncate。
最后提醒:日志限制不是越大越好。max-size设置太小会导致排查问题时缺少历史日志,建议根据业务量设置50MB到200MB之间,保留2到5个文件。
定期用df -h和du -sh /var/lib/docker检查磁盘趋势,比事后清理更省心。