1、现象
服务是微服务,docker部署的。然后就碰到了一个问题:发版上线一段时间了,磁盘就告警,占用率直接100%,导致服务挂掉。
此时重启实例(docker restart)是没有用的,需要重新创建实例才行
2、问题的调查过程
(1)首先是用df -h查看磁盘的占用清况
# 查看整体磁盘使用情况
df -h
初步得到的结论是:docker的overlay2的磁盘太大
(2)查看具体的占用清况
# 查看 Docker 存储目录大小
du -sh /var/lib/docker/*
# 查看 overlay2 各层大小
du -sh /var/lib/docker/overlay2/* | sort -hr | head -n 20
这样的话可以查到具体的哪个镜像的磁盘占用比较的厉害
(3)、解决方式1 - 直接清理
# 查看前20大日志文件
find /var/lib/docker/containers -name "*.log" -exec du -sh {} \; | sort -hr | head -n 20
然后清空日志文件
# 安全地清空单个日志文件
truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
此处理了可以结合定时任务来处理
(4)、解决方式2 - 设置日志大小限制
4.1、全局方式
编辑 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
然后重启 Docker:
systemctl daemon-reload
systemctl restart docker
4.2、单容器设置
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name myapp myimage
3、查看docker的日志位置
运行以下命令查看日志驱动和日志文件路径:
docker inspect -f '{{.HostConfig.LogConfig}}' <container-name>
docker inspect -f '{{.LogPath}}' <container-name>
4、原因
使用docker部署的jar服务。由于日志级别太低(DEBUG级别),所以导致日志打印量太大