IT

Docker容器日志占用磁盘过大?三种清理方法彻底解决

AI智能摘要

Docker 日志不限制大小,很容易把磁盘写满。这篇文章教你三步搞定:先用 du 找到大日志文件,再用 truncate 清空释放空间,最后在 daemon.json 里配置 max-size 和 max-file 做日志轮转。还附了 docker system prune 清理其他垃圾的常用命令,照着做就能彻底解决。

服务器磁盘突然满了,十有八九是 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 保持整洁。三步做完,磁盘不会再被日志撑爆。

发表评论