Docker 日志把磁盘吃满了?别慌,手把手教你清理并永久限制大小

相信不少用 Docker 部署服务的站长都遇到过这种糟心事:明明没跑几个容器,服务器磁盘却突然爆满,网站 502、数据库连不上,SSH 敲命令都卡半天。登上去一查,罪魁祸首往往是 /var/lib/docker/containers/ 目录下那些体积惊人的 *-json.log 文件。

笔者前几天就碰上一回,一个跑了半年的小服务,日志文件硬生生涨到了 30 多个 G,直接把 40G 的系统盘撑爆了。这其实是 Docker 默认日志驱动的“锅”——它会把容器标准输出全部记录到宿主机上,而且默认不限制大小、不自动轮转。今天笔者就把自己清理日志和永久限制大小的完整操作记录下来,希望能帮到同样踩坑的朋友。

一、先搞清楚:日志到底藏在哪,谁在作怪

💡 推荐阅读:WordPress 被刷到 CPU 爆满?手把手教你彻底关掉 XML-RPC 和 Pingback 这两个“内鬼”

Docker 默认使用 json-file 日志驱动,每个容器的日志存放在:

/var/lib/docker/containers/<容器ID>/<容器ID>-json.log

这个文件会随着容器运行时间线性增长,尤其是那些输出频繁的服务(比如 Nginx、Java 应用),几天就能吃掉几十 G。更麻烦的是,直接 rm 删除这个文件并不会释放磁盘空间,因为 Docker 守护进程还持有它的文件句柄。正确的做法是清空文件内容,而不是删除文件本身。

二、环境准备与前置要求

🔥 【限时特惠福利】高性价比独享云服务器限时 1 折起

搭建网站或部署容器推荐选择高稳定性独享云服务器。限时特惠通道开放中,点击即可领取专属满减代金券与特惠折扣:

👉 立刻领取云服务器限时优惠券

💡 延伸阅读:别再瞎折腾端口映射了!聊聊 Docker 容器间内网互通的正确打开方式

  • 一台能 SSH 登录的 Linux 服务器(CentOS / Ubuntu / Debian 均可,笔者以 Ubuntu 22.04 为例)。
  • 拥有 rootsudo 权限。
  • Docker 已安装并正常运行,可用 docker ps 验证。
  • 强烈建议:操作前先确认磁盘剩余空间,避免清理过程中服务异常。如果服务器本身磁盘就小,建议尽早换一台配置更宽裕的云服务器,笔者自己用的是 2 核 4G、80G 系统盘的配置,跑几个轻量服务绰绰有余,选对服务商能省掉很多后续折腾。

三、详细实操步骤

💡 深度技术指南:别再把防火墙当摆设了:从80/443到业务端口,聊聊我踩过的UFW配置坑

步骤 1:定位“元凶”——找出大日志文件

先别急着删,用下面这条命令按大小排序,看看哪些容器的日志最占地方:

# 查看所有容器日志文件大小,按从大到小排序
du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -20

输出结果会列出每个日志文件的体积,排在最前面的就是需要优先处理的。

步骤 2:应急清理——安全清空日志文件

确认目标后,用 truncate 或重定向方式清空,不要用 rm

# 方式一:truncate 清空(推荐,立即释放空间)
truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log

# 方式二:重定向清空(效果相同)
: > /var/lib/docker/containers/<容器ID>/<容器ID>-json.log

如果想一次性清空所有容器日志,可以执行:

# 批量清空所有容器的 json 日志文件
truncate -s 0 /var/lib/docker/containers/*/*-json.log

清空后再用 df -h 看一眼,磁盘空间应该已经回来了。

步骤 3:永久限制——配置日志轮转与大小上限

应急清理只是治标,治本要在 Docker 守护进程层面配置日志上限。编辑 /etc/docker/daemon.json(没有就新建):

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

参数含义:max-size 表示单个日志文件最大 100MB,max-file 表示最多保留 3 个轮转文件。这样单个容器日志总占用不会超过 300MB,彻底告别磁盘被撑爆。

保存后重启 Docker 使配置生效:

# 重启 Docker 守护进程
sudo systemctl restart docker

# 验证配置是否生效
docker info | grep -A 5 "Logging Driver"

注意:这个全局配置只对新创建的容器生效。已经运行的容器需要重建才能应用,可以逐个 docker rm -f 后重新 docker run,或者用 Docker Compose 重新 up -d

步骤 4:针对单个容器单独限制(可选)

如果不想改全局配置,也可以在启动容器时单独指定:

docker run -d \
  --log-opt max-size=50m \
  --log-opt max-file=2 \
  --name myapp nginx:latest

四、避坑清单

坑点 正确做法
直接 rm 删除日志文件 truncate -s 0 清空内容,否则空间不释放
只清理不配置上限 必须修改 daemon.json,否则几天后再次爆满
改完配置不重启 Docker 执行 systemctl restart docker 才生效
以为全局配置对旧容器生效 旧容器需重建,或单独用 --log-opt 启动
磁盘本身太小 建议系统盘至少 40G 起步,云服务器选型时别省这点钱

五、总结

Docker 日志占满磁盘这件事,说到底就是默认配置太“宽松”。笔者的建议是:新服务器装好 Docker 第一件事,就是先把 daemon.json 的日志上限配好,别等出事再补救。日常运维中也可以写个定时任务,每周检查一次日志体积,做到心中有数。

如果你正准备入手新服务器跑 Docker,记得选一家磁盘 IO 稳定、支持快照备份的服务商,出问题时能快速回滚,省心不少。希望这篇实操记录能帮你彻底解决日志爆盘的问题,少走弯路。

相关技术专题与延伸阅读

滚动至顶部