Docker目录占用的磁盘空间
kubernetes部署服务后,会不断生成日志最终导致/var/lib/docker下生成很多日志,以及/var/lib/docker/overlay占用很大,导致磁盘存满。一般有两种情况:无用的镜像和容器太多或者容器输出的日志太大
无用镜像和容器太多
#查看具体占用情况
[root@k8s02 ~]# docker system df -v
#用于清理磁盘,删除关闭的容器、无用的数据卷和网络以及无tag的镜像
[root@k8s02 ~]# docker system prune
#可以将没有容器使用Docker镜像都删掉。注意这两个命令会把你暂时关闭的容器以及暂时没有用到的Docker镜像都删掉了
[root@k8s02 ~]# docker system prune -a
docker system prune,该指令默认会清除所有如下资源:
已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所关联的网络(network)
所有悬空镜像(image)
该指令默认只会清除悬空镜像,未被使用的镜像不会被删除,添加-a或--all参数后,可以一并清除所有未使用的镜像和悬空镜像,可以添加-f或--force参数用以忽略相关告警确认信息,使用时候请根据实际谨慎使用
手工清理
镜像清理
如果通过docker system df分析是镜像占用了过高空间,则可以根据业务情况,评估相关镜像的使用情况,对于悬空和未使用的镜像可以使用如下指令手工清理
#删除所有悬空镜像,但不会删除未使用镜像:
[root@k8s02 ~]# docker rmi $(docker images -f "dangling=true" -q)
#删除所有未使用镜像和悬空镜像
#【说明】:轮询到还在被使用的镜像时会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可
[root@k8s02 ~]# docker rmi $(docker images-q)
卷清理
如果通过docker system df分析,是卷占用了过高空间,则可以根据业务情况评估相关卷的使用情况,对于未被任何容器调用的卷(-v 结果信息中,“LINKS” 显示为 0)可以使用如下指令手工清理
#删除所有未被任何容器关联引用的卷
[root@k8s02 ~]# docker volume rm $(docker volume ls -qf dangling=true)
#也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
#【说明】:轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可
[root@k8s02 ~]# docker volume rm $(docker volume ls -q)
容器清理
如果通过docker system df分析,是某个容器占用了过高空间,则可以根据业务情况评估相关容器的业务归属并进行处理,对于已停止或其它异常状态的容器可以结合-f或--filter筛选器,使用类似如下指令来手工清理
#删除所有已退出的容器
[root@k8s02 ~]# docker rm -v $(docker ps -aq -f status=exited)
#删除所有状态为dead的容器
[root@k8s02 ~]# docker rm -v $(docker ps -aq -f status=dead)
容器输出日志太大
容器长时间运行,容器打印了大量的日志未清理,最终导致/var/lib/docker/containers下生成很多日志,占据了大量磁盘空间
脚本处理
编写cleanlog.sh脚本
#!/bin/sh
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | cut -d'%' -f1)
if [[ $DISK_USAGE -gt 80 ]]; then
echo "========= start clean /var/lib/docker/containers/ logs ============"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs; do
echo "clean logs : $log"
cat /dev/null >$log
done
echo "======== end clean /var/lib/docker/containers/ logs ==============="
else
echo "Disk usage is below 80%."
fi
Docker参数配置
添加log-driver和log-opts,重启docker生效,配置如下:
[root@k8s02 ~]# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
},
...
"storage-opts":["overlay2.override_kernel_check=true"],
"live-restore": true
}
说明:
"max-size":"100m" 表示一个容器日志大小上限是100M
"max-file":"10" 表示一个容器有十个日志,分别是id+.json、id+1.json...id+10.json