相信不少用 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 守护进程还持有它的文件句柄。正确的做法是清空文件内容,而不是删除文件本身。
二、环境准备与前置要求
💡 延伸阅读:别再瞎折腾端口映射了!聊聊 Docker 容器间内网互通的正确打开方式
- 一台能 SSH 登录的 Linux 服务器(CentOS / Ubuntu / Debian 均可,笔者以 Ubuntu 22.04 为例)。
- 拥有
root或sudo权限。 - 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 稳定、支持快照备份的服务商,出问题时能快速回滚,省心不少。希望这篇实操记录能帮你彻底解决日志爆盘的问题,少走弯路。