Docker日志太多撑爆硬盘?一次搞定日志轮转与清理
运维过Docker容器的朋友,大概率都经历过这样的惊魂时刻:突然收到磁盘告警,df -h一看,根目录使用率100%。顺着路径查下去,发现/var/lib/docker/containers/下躺着好几个几十GB的日志文件。
没错,Docker默认的json-file日志驱动不会自动轮转。容器里输出的每一条日志都会被原封不动地记录下来,日积月累,直到撑爆你的硬盘。
今天这篇文章,就带你彻底解决这个问题——包含全局配置、单容器配置,以及旧日志的清理方案。
全局配置(推荐生产环境兜底)
修改Docker守护进程的配置文件/etc/docker/daemon.json(如果文件不存在,新建即可):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
参数说明:
max-size:单个日志文件的大小上限,达到此值会自动轮转;max-file:保留的日志文件数量,此处为3个,总日志量控制在30MB以内;compress:是否压缩轮转出来的旧日志,节省空间。
配置完成后,执行以下命令使配置生效,该命令会重启所有容器,建议在业务低峰期或维护窗口操作。
sudo systemctl restart docker
需要注意的是:新增的全局配置仅对后续创建的容器有效,对于既有容器,需通过重建或手动清理的方式清理日志。
单容器配置(更灵活)
如果你不想影响全局,或者只想针对某个特定容器配置更小的日志限制,可以在容器启动时单独指定。
Docker Compose方式(在docker-compose.yml中添加):
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
logging:
driver: "json-file"
options:
max-size: "5m"
max-file: "2"
# ... 其他配置
修改后执行docker-compose up -d重建容器即可。
Docker Run方式:
docker run \
--log-opt max-size=5m \
--log-opt max-file=2 \
--name wg-easy \
ghcr.io/wg-easy/wg-easy:15
如何清理已经撑爆的旧日志?
配置轮转之后,只对新产生的日志生效。已经存在的超大日志文件不会自动消失,需要手动清理。
重建容器(最彻底)
如果你刚好要重新配置容器(比如修改了docker-compose.yml),重建时旧容器会被移除,其关联的日志文件也会一并删除。
docker-compose down && docker-compose up -d
在线清空(不停机)
如果容器不能重启,可以使用truncate命令将日志文件“截断”为0大小,而不会破坏Docker对该文件的写入句柄。
# 先找到日志文件的真实路径:
docker inspect --format='{{.LogPath}}' <容器名>
# 执行清空(需要sudo权限):
sudo truncate -s 0 /var/lib/docker/containers/<完整路径>/<文件名>-json.log
一键清理所有容器日志(谨慎操作)
如果你确定要清理当前所有容器的日志,可以执行:
sudo find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
注意:千万不要用
rm直接删除日志文件!因为Docker进程还在占用文件句柄,直接删除会导致写入失败,甚至容器异常。
总结
| 场景 | 推荐方案 |
|---|---|
| 生产环境统一管理 | 修改daemon.json全局配置 |
| 某容器日志特别频繁 | 单容器单独设置更小的max-size |
| 旧日志已撑爆磁盘 | 使用truncate清空或重建容器 |
| 一劳永逸 | 新部署的容器务必加上日志轮转参数 |
日志轮转是容器运维的基础但至关重要的环节。别等到服务器告警才想起来配置,现在就去检查你的Docker环境吧!

浙公网安备 33010602011771号