参考:
https://www.jb51.net/server/319801u4q.htm
查看容量:
df -h
看来是目录 /var/lib/docker/overlay2 下占满了磁盘,看看里面是什么。
二、解决
1、查看 /var/lib/docker 目录
这一块只是查找哪些文件占满了磁盘,不感兴趣的朋友可以不看。
/var/lib/docker 目录是 docker 的默认目录,进去看看
cd
/var/lib/docker
检索文件的最大深度1,即只检索汇总计算当前目录下的文件
du -h
--max-depth=1
(1)、containers 目录
可以看到 containers 中占磁盘空间最大,这是 docker 存储镜像的目录,进去看看里面有什么
看不出什么来,继续进入
可以看到一个 -json.log 的文件很大,竟然有4G多,这是 docker 的日志文件,看看 containers 目录的其他子目录是不是也有这个类型的文件
看来也有,并且和所在目录同名,直接查看所有的 -json.log 目录吧
du -ha
/var/lib/docker/containers/ | grep "json.log"
| sort
-rh
嗯。。。各个都不小,把他们全清了也能清出来很可观的空间了。
等会停了容器再清。
(2)、volumes 目录
这里接着看看 volumes 目录
看到也是类似 containers 目录的东西,先进第一个看看
可以看到是一个 _data 目录,看不出什么,继续进入
其中 flow.jar 是我的jar包,目录 logs 应该就是日志文件了,进去看看
还放在我的包名命名的目录里,继续进入
也是很多的日志文件。。。回到 logs 目录统计一下吧
du -h
--max-depth=1
可以看到有5G多。。。
同样的方式进入 volums 目录中的第二个子目录
可以看到也有2G多。。。
也可以直接查看目录的详细信息,命令如下:
du -ha
/var/lib/docker/volumes/ | grep "info.*.log"
| sort
-rh
可以看到有很多的日志文件,单个虽然不大,但却很多。
这里也先不清,后面再清。
(3)、overlay2 目录
再看看 overlay2 目录
虽然只有11G,但进去发现目录挺多,先看看各个目录的大小
du -h
--max-depth=1
找出最大的应该目录,看看里面有什么
看看哪个文件夹比较大
du -h
--max-depth=1
可以看到 merged 和 diff 占磁盘空间比较大,work 目录可以不用管。
diff :
diff 文件夹是一个只读的文件系统层,它包含了Docker镜像的变更内容。当您对容器进行修改或添加新文件时,这些变更会被记录在 diff 文件夹中。每个Docker镜像都有一个对应的 diff 文件夹,用于存储与基础镜像的差异。
merged:
merged 文件夹是一个可读写的文件系统层,它是由基础镜像和 diff 文件夹合并而成的。当您启动一个Docker容器时, merged 文件夹中的内容将作为容器的文件系统。这个文件夹是容器运行时的可写层,您可以在容器中对文件进行修改或添加新文件,这些修改将存储在 merged 文件夹中。
2、清理
前面已经知道了日志在
/var/lib/docker/containers
/var/lib/docker/volumes
/var/lib/docker/overlay2
(1)、清理 /var/lib/docker/containers 目录
先创建清理脚本文件,这里名为 docker_logs_clean.sh ,可以自定义,命令如下:
touch docker_logs_clean.sh
查看文件可以发现 docker_logs_clean.sh 是只读的
赋予读写权限,命令如下:
chmod +777 docker_logs_clean.sh
然后在加入如下脚本:
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean containers logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
这是从这个老哥的博客中拿到的,很多博客都说这个脚本可以清除还在运行的docker日志,保险起见,我这里就先把运行的容器给停了。
之后执行脚本文件,命令如下:
sh docker_logs_clean.sh start
再看一下磁盘空间:
df -h
可以看到清理出一些空间了。
如果保存时报如下错:
“docker_logs_clean.sh” E514: write error (file system full?)
这是因为磁盘已满,先手动清理一些空间出来。我这里就清除了一下 /var/lib/docker/volumes 目录下的日志文件。
假如执行清理脚本报错:
line 4: syntax error near unexpected token `$‘do\r’
可以用如下命令查看脚本文件换行符是否合法:
cat
-v
docker_logs_clean.sh
cat -v 文件名:查看换行符是否合法,如果是上述的,则行结尾会是^m
需要转换成linux/unix格式的”\n”
原因:这可能是在window系统中创建好文件,再上传到服务器,导致换行符不符合Linux的格式。
解决办法:
sed 's/\r//'
docker_logs_clean.sh > docker_logs_clean.sh
(2)、清理 /var/lib/docker/volumes 目录
假如不更新项目,只是想清一下日志,前面已经查到 /var/lib/docker/volumes 目录下的日志,这里重新查一下,命令如下:
find /var/lib/docker/volumes -name
"*.log"
使用如下命令清除
find /var/lib/docker/volumes -type
f -name
"*.log"
-delete
可以看到那些日志文件都清除了。
再检查一下文件docker占比
du -h
--max-depth=1
可以看到 /var/lib/docker/volumes 目录只剩下791M了,这些是我的jar包。
假如要更新项目,则清除所有的镜像,命令如下:
docker system prune -a