你的硬盘被 Docker 容器日志爆掉了吗?

问题来了

今天下午,我在群里「疯狂」被 @,奶油葡萄又双叒叕访问不了啦!?

怎么肥事

首先,我试了试其它服务,发现能够正常访问。

然后,我通过 Portainer 查看奶油的网站和伺服服务,都在正常工作。为了确保 Portainer 没有「隐瞒真相」,我登录上了其中一个主节点,发现服务确实正常运行,而且各节点也均在线。

然后,我想到其它服务没有使用 Redis,会不会是奶油的 Redis 挂了呢?首先访问奶油一个静态页面,正常工作。再访问一个测试页面(测试 MySQL 数据库和 Redis 的读写性能),发现确实连不上 Redis。

很好,到这个时候,就要真相大白了吗?内心想着一定是 AOF Rewrite 又 GG,然后把磁盘爆了。一顿操作之后,发现重写功能正常着呢。

不过,磁盘确实爆了!持续 du 操作之后,定位到了是奶油伺服服务的容器中的日志文件把磁盘爆了。

怎么解决

根据官方文档,Docker 默认会获取所有容器的标准输出/错误,并以 JSON 格式记录下来。虽然官方文档没有说日志的存储上限,但根据实际使用情况来看,应该是硬盘空间有多少用多少!

But,文档中也是有提供配置方法,用来限制日志大小的!如果你希望全局设置限制,修改 deamon.json 文件,将以下配置内容加入,并根据自身情况修改。保存之后,重启 Docker 生效。

1
2
3
4
5
6
7
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}

除了全局配置之外,也可以在运行容器时,通过 --log-opt 选项实现容器日志的独立配置。

1
docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash

更多的选项,就看看 官方文档 吧!

完美收官

其中一台 VPS,限制之前的磁盘使用为 93%,限制之后为 35%,效果感人!

1
2
3
4
5
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1 32G 28G 2.2G 93% /

Filesystem Size Used Avail Use% Mounted on
/dev/vda1 32G 11G 20G 35% /