Docker一键清理 + 全局限制,告别日志报满

问题现象

Docker 容器在运行过程中,默认会无限追加日志 (存储在 /var/lib/docker/containers/ 目录下)。

时间一长,几十 GB 的日志文件轻松占满磁盘,导致服务异常、甚至服务器宕机。

先来查查到底是哪些容器日志在"搞鬼":

复制代码
du -d1 -h /var/lib/docker/containers | sort -h

输出示例:

复制代码
50G    /var/lib/docker/containers/a5f6...
46G    /var/lib/docker/containers/c00c...
36G    /var/lib/docker/containers/ff83...

看到这些数字,是不是心都凉了半截?别急,马上处理!


问题起因

根本原因在于 Docker 的默认日志配置

  • Docker 默认使用的日志驱动是 json-file,它会将容器内标准输出(stdout/stderr)的内容全部写入宿主机的 .json 日志文件。

  • 这个驱动默认没有开启日志轮转(log rotation) ,也就是说,只要容器在运行,日志就会无休止地追加,直到占满整个磁盘分区。

  • 再加上容器内运行的业务程序可能频繁打印日志(比如访问日志、调试输出),或者日志级别设置得过低,都会让日志量急剧膨胀。

一句话总结:不是 Docker 不聪明,是默认没给它设"天花板"。

所以我们要么手动清,要么给它定规矩------下面两种方案分别对应这两种思路。


一次性清理(临时救急)

如果只是想快速释放空间,可以用下面这个脚本一键清空所有容器日志

创建 clean_docker_logs.sh 脚本:

复制代码
#!/bin/bash
echo "==================== start clean docker containers logs =========================="
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
    echo "clean logs : $log"
    cat /dev/null > $log
done
echo "==================== end clean docker containers logs   =========================="

赋予执行权限并运行:

复制代码
chmod +x clean_docker_logs.sh
./clean_docker_logs.sh

执行完再查看:

复制代码
du -sh /var/lib/docker/containers
# 输出:148K    /var/lib/docker/containers

瞬间清爽!但这只是治标不治本 ,日志还会继续增长,我们需要永久控制


永久限制容器日志大小

通过修改 Docker 守护进程配置,让所有新建容器自动遵守日志大小限制。

① 编辑配置文件 /etc/docker/daemon.json(若不存在则新建):

复制代码
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

配置说明:

  • max-size: "50m":单个日志文件最大 50 MB。

  • max-file: "3":保留最近 3 个日志文件(即 id.jsonid+1.jsonid+2.json),超过则自动删除最旧的。

② 重启 Docker 服务使配置生效:

复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

⚠️ 注意 :该配置只对新建的容器生效 ,已经存在的容器需要重建 (重新 docker run)才会应用新限制。


总结
场景 方法 适用情况
紧急释放磁盘空间 运行清理脚本 临时救急
长期预防 修改 daemon.json 配置 max-size/max-file 新建容器生效
已存在容器 删除并重新创建(需挂载卷保留数据) 让旧容器也受限制
相关推荐
早安试言1 小时前
maven安装
java·maven
java_logo2 小时前
Docker 部署 FalkorDB:轻松搭建属性图数据库与知识图谱平台
数据库·docker·知识图谱·falkordb·轩辕镜像·falkordb部署教程·falkordb部署文档
攻城有术2 小时前
专项攻克-SpringBoot启动后 Bean的实例数量问题
java·spring boot·后端
步行cgn2 小时前
PageHelper 的用法
java·后端
Sam_Deep_Thinking2 小时前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
无毁的湖光-Al3 小时前
解Bug之路-with AI-应用被限流?
java·linux
程序员贺加贝3 小时前
别把 ThreadLocal 写进 Serializer:一次 SaaS 多租户 Jackson 上下文污染排查
java·spring boot
许彰午3 小时前
06-EaEngine调度器
java·低代码·架构
彭友圈1013 小时前
K8s 集群部署方法与原理总结
云原生·容器·kubernetes