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 新建容器生效
已存在容器 删除并重新创建(需挂载卷保留数据) 让旧容器也受限制
相关推荐
cpolar技术支持7 小时前
Docker 容器启动失败怎么查?端口、日志、权限与网络排障完整教程
linux·docker·容器·cpolar·网络排障
暮雨哀尘7 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言
想要入门的程序猿7 小时前
回调函数学习
java·网络·学习
泡海椒7 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python
步行cgn8 小时前
Spring 启动报错:BeanFactory not initialized 的原因与解决
java·python·spring
步行cgn8 小时前
Spring 报错:No bean class specified on bean definition 的原因与解决
java·后端·spring
zhangjw348 小时前
第47篇:Java综合实战:电商秒杀系统(高并发场景)
java·开发语言
土司大王9 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
Wang's Blog9 小时前
Java框架快速入门:Spring Security+OAuth2之用户注册与唯一性校验实现
java·数据库·spring
一技安身9 小时前
【大模型】Win11 部署 DeepSeek+ RAGFlow0.27.2 (Ollama方案,断网可用)
docker·ai·语言模型