服务器磁盘突然满了,十有八九是 Docker 容器日志惹的祸。默认情况下,Docker 使用 json-file 日志驱动,且不限制大小和文件数,一个疯狂输出的容器几天就能吃掉几十 GB。结论先行:先定位大日志文件,再清理,最后配置日志轮转防止复发。
一、定位:哪个容器的日志在吃磁盘
直接查看所有容器日志文件的大小:
du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -20
或者进入容器目录按大小排序:
ls -lhS /var/lib/docker/containers/*/*-json.log | head
找到文件名中的容器 ID 后,用 docker ps -a --no-trunc 匹配出容器名,确认是哪个服务在刷日志。
二、清理:立即释放磁盘空间
不要直接 rm 日志文件,因为容器进程仍持有文件句柄,空间不会释放。正确做法是清空内容:
truncate -s 0 /var/lib/docker/containers/<容器ID>/*-json.log
如果容器已停止且不再需要日志,也可以删除文件,然后重启 Docker:
rm -f /var/lib/docker/containers/<容器ID>/*-json.log
systemctl restart docker
批量清理所有容器日志(谨慎操作,会丢失全部历史日志):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
三、根治:配置日志轮转与大小限制
清理只是治标,必须限制日志大小。Docker 支持在 daemon 级别或容器级别设置。
全局配置(推荐):编辑 /etc/docker/daemon.json,添加:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
然后重启 Docker:
systemctl restart docker
注意:该配置只对新建的容器生效,已有容器需要重建。如果不想重建,可以单独为运行中的容器动态调整(Docker 20.10+):
docker update --log-opt max-size=100m --log-opt max-file=3 <容器名>
或者用 docker-compose 在服务下指定:
services:
app:
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"
四、补充:清理其他 Docker 占用
日志之外,无用镜像、停止的容器、构建缓存也会占空间。定期执行:
docker system df查看总占用docker system prune -a清理所有未使用资源(谨慎,会删除未运行镜像)docker container prune只清理停止的容器
总结:先 truncate 清空大日志救急,再通过 daemon.json 设置 max-size 和 max-file 防止复发,最后定期 docker system prune 保持整洁。三步做完,磁盘不会再被日志撑爆。


