粮草机器人 Docker 容器日志(通常以 -json.log 结尾)无限增长
Docker 容器日志(通常以 -json.log 结尾)无限增长导致磁盘空间耗尽是运维中常见的问题。解
决这一问题需要分三步走:紧急清理、避免错误操作以及配置长效轮转机制。
1. 紧急清理:如何快速释放空间
当磁盘已满急需恢复业务时,核心原则是清空文件内容而非删除文件。
推荐命令:
bash
truncate -s 0 /var/lib/docker/containers/*/*-json.log
该命令会将所有容器的日志文件大小截断为 0,立即释放被占用的磁盘空间,同时保留文件句柄,确保 Docker 进程能继续正常写入日志。
严禁操作:
切勿直接使用 rm 命令删除日志文件。
原因:Linux 文件系统机制规定,如果文件正被进程(如 Docker daemon)占用,直接删除文件并不会立即释放磁盘空间,直到进程关闭或重启。
后果:不仅无法有效释放空间,还可能导致 Docker 引擎无法写入新日志,甚至引发容器运行异常或服务中断。
2. 根治策略:配置日志轮转(Log Rotation)
为了避免问题复发,必须对 Docker 的日志驱动进行配置,限制单个日志文件的大小及保留的历史文件数量。
方案 A:全局配置(推荐)
修改 Docker 守护进程配置文件 /etc/docker/daemon.json,添加或修改 log-opts 参数。
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size: 单个日志文件的最大大小(例如 10m 表示 10MB)。
max-file: 最大保留的日志文件数量(例如 3 表示保留 3 个归档文件,超过后最旧的文件会被删除)。
生效步骤:
保存配置文件。
重启 Docker 服务:systemctl restart docker。
注意:此配置仅对新建的容器生效。已存在的容器需要重建(docker rm 后 docker run)才能应用新的日志限制。
方案 B:单个容器配置
在启动容器时通过 --log-opt 参数指定:
bash
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
your_image_name
3. 日常维护建议
监控磁盘使用:定期使用 df -h 检查 /var/lib/docker/containers/ 目录的大小。
查看日志大小:可以使用以下命令快速定位哪个容器的日志最大:
bash
du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -n 5
应用层优化:除了 Docker 层面的限制,建议在应用程序内部也配置日志轮转(如 Log4j, Logback, Python logging 等),从源头控制日志输出量。
通过上述“紧急清空 + 禁止删除 + 配置轮转”的组合拳,可以彻底解决 Docker 日志撑爆硬盘的问题,并确保系统长期稳定运行。