Docker 容器日志占满磁盘,教你自动清理
问题现象
运行一段时间后,发现服务器磁盘报警,df -h显示/var/lib/docker目录占用异常高。
这往往是Docker容器日志文件(*-json.log)在无限增长。
如果手动删除这些日志文件,容器会报错,甚至导致日志丢失。
我们需要一种自动清理方案,既控制新日志的大小,又安全清理历史日志。
准备工作
- 一台已安装Docker的Linux服务器(CentOS 7+或Ubuntu 18.04+)
- 拥有root或sudo权限
- 确认当前日志占用:
du -sh /var/lib/docker/containers/*/*.log
配置全局日志自动清理
修改Docker守护进程配置文件/etc/docker/daemon.json(如果不存在则创建),加入以下内容:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size表示单个日志文件最大10MB,max-file表示最多保留3个文件(轮转)。
保存后重启Docker:
sudo systemctl restart docker
注意:重启会使所有容器停止,建议提前规划业务低峰期。
如果不想重启,可以逐个容器配置--log-opt参数,但新配置只对新启动的容器生效。
安全清理已有日志
已存在的日志文件不会自动删除,需要手动清理。
不要直接rm日志文件,否则容器会出错。
正确做法是用truncate清空内容:
sudo find /var/lib/docker/containers/ -name "*.log" -exec truncate -s 0 {} \;
执行后立刻释放磁盘空间,且不影响容器正常运行。
或者对单个容器:
docker logs --tail 0 容器名 > /dev/null 2>&1
(此方法会保留最近0行日志,实则清空)推荐使用truncate命令,更直观。
效果验证与高频问题
- 查看磁盘是否释放:
df -h观察/var/lib/docker目录可用空间增大。 - 新日志是否受控:运行一个产生日志的容器,过一段时间检查日志文件大小:
ls -lh /var/lib/docker/containers/<容器ID>/*.log,应不超过10MB。 - 为什么重启Docker后有些容器日志还在增长? 因为重启时已有容器被停止,日志驱动配置未生效?实际配置是全局的,容器重启后(比如重启Docker后容器也被重启)会应用新配置;如果容器未重启,旧容器仍在用原有配置。所以建议重启Docker后也重启容器(或重新创建容器)。
- 能直接删除日志文件吗? 绝对不要!删除文件后容器会丢失日志文件句柄,导致无法写日志,并不断报错。用
truncate才安全。
避坑说明
- 修改
daemon.json前先备份:cp /etc/docker/daemon.json /etc/docker/daemon.json.bak - 如果Docker版本较旧(<19.03),部分参数可能不支持,请升级Docker。
- 清理日志后建议同时启用Docker的日志轮转,并在系统层面配合
logrotate(可选)避免长期积累。
现在你可以按照上述步骤,一键解决Docker容器日志占满磁盘的问题。
平常多留意磁盘监控,将日志清理做成自动化任务,省心不少。