问题现象
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.json、id+1.json、id+2.json),超过则自动删除最旧的。
② 重启 Docker 服务使配置生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
⚠️ 注意 :该配置只对新建的容器生效 ,已经存在的容器需要重建 (重新
docker run)才会应用新限制。
总结
| 场景 | 方法 | 适用情况 |
|---|---|---|
| 紧急释放磁盘空间 | 运行清理脚本 | 临时救急 |
| 长期预防 | 修改 daemon.json 配置 max-size/max-file |
新建容器生效 |
| 已存在容器 | 删除并重新创建(需挂载卷保留数据) | 让旧容器也受限制 |