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-sizemax-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 -hdu -sh /var/lib/docker检查磁盘趋势,比事后清理更省心。

分享到:
上一篇
Docker Compose一键部署WordPress站点
下一篇
KVM虚拟机磁盘扩容,在线扩展虚拟硬盘
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意