用 Docker 跑应用很方便,但它的日志默认是"无限写"。一个跑了三个月的容器,*-json.log 长到几百兆是常事,几台机器加起来能吃掉几个 G。
先看现状
docker system df
ls -lhS /var/lib/docker/containers/*/*-json.log | head
第一条看镜像、容器、卷、构建缓存各占多少;第二条直接列出最大的容器日志。通常你会看到某一个容器的日志远大于其他。
根治:配置 daemon.json
新建或编辑 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
含义是单个日志最大 50M,最多保留 3 个,合计上限 150M。这个配置只对新建的容器生效,已经存在的容器要重建才会应用。
不想重启怎么办
生产环境往往不方便重启 Docker(会中断所有容器)。临时方案是直接截断:
truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log
用 truncate 而不是 rm,原因和普通日志一样:进程还持有文件句柄,rm 不会释放空间。
但截断只是止血。要么找时间重建容器让它吃到新配置,要么在维护脚本里加一条"每周截断超过 10M 的容器日志"的兜底。
还有两个隐藏的占用
构建缓存:docker builder prune 能清掉不再使用的层,有时候能释放好几个 G。
悬空镜像:docker image prune 清理没有标签的中间镜像。注意不要随手 docker system prune -a,它会把没在运行的容器和所有未使用镜像都删掉,容易误伤。
日志本身也值得管
如果某个容器日志涨得特别快,往往不是磁盘问题,是应用在刷错误。先看日志内容:
docker logs --tail 200 容器名
反复出现同一个报错,说明有连接失败、认证过期或者死循环。把应用修好,日志自然就不涨了。这一步比任何清理都有效。





还没有评论,来说两句吧...