docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

  • 一、问题
  • 二、解决
    • [1、查看 /var/lib/docker 目录](#1、查看 /var/lib/docker 目录)
      • [(1)、containers 目录](#(1)、containers 目录)
      • [(2)、volumes 目录](#(2)、volumes 目录)
      • [(3)、overlay2 目录](#(3)、overlay2 目录)
    • 2、清理

一、问题

今天突然发现跑服务器上的项目挂了,上去看了一下原来是磁盘满了。

powershell 复制代码
df -h

看来是目录 /var/lib/docker/overlay2 下占满了磁盘,看看里面是什么。

二、解决

1、查看 /var/lib/docker 目录

这一块只是查找哪些文件占满了磁盘,不感兴趣的朋友可以不看。

/var/lib/docker 目录是 docker 的默认目录,进去看看

powershell 复制代码
cd /var/lib/docker

检索文件的最大深度1,即只检索汇总计算当前目录下的文件

powershell 复制代码
du -h --max-depth=1

(1)、containers 目录

可以看到 containers 中占磁盘空间最大,这是 docker 存储镜像的目录,进去看看里面有什么

看不出什么来,继续进入

可以看到一个 -json.log 的文件很大,竟然有4G多,这是 docker 的日志文件,看看 containers 目录的其他子目录是不是也有这个类型的文件

看来也有,并且和所在目录同名,直接查看所有的 -json.log 目录吧

powershell 复制代码
du -ha /var/lib/docker/containers/ | grep "json.log" | sort -rh

嗯。。。各个都不小,把他们全清了也能清出来很可观的空间了。

等会停了容器再清。

(2)、volumes 目录

这里接着看看 volumes 目录

看到也是类似 containers 目录的东西,先进第一个看看

可以看到是一个 _data 目录,看不出什么,继续进入

其中 flow.jar 是我的jar包,目录 logs 应该就是日志文件了,进去看看

还放在我的包名命名的目录里,继续进入

也是很多的日志文件。。。回到 logs 目录统计一下吧

powershell 复制代码
du -h --max-depth=1

可以看到有5G多。。。

同样的方式进入 volums 目录中的第二个子目录

可以看到也有2G多。。。

也可以直接查看目录的详细信息,命令如下:

powershell 复制代码
du -ha /var/lib/docker/volumes/ | grep "info.*.log" | sort -rh

可以看到有很多的日志文件,单个虽然不大,但却很多。

这里也先不清,后面再清。

(3)、overlay2 目录

再看看 overlay2 目录

虽然只有11G,但进去发现目录挺多,先看看各个目录的大小

powershell 复制代码
du -h --max-depth=1

找出最大的应该目录,看看里面有什么

看看哪个文件夹比较大

powershell 复制代码
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 ,可以自定义,命令如下:

powershell 复制代码
touch docker_logs_clean.sh

查看文件可以发现 docker_logs_clean.sh 是只读的

赋予读写权限,命令如下:

powershell 复制代码
chmod +777 docker_logs_clean.sh

然后在加入如下脚本:

powershell 复制代码
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日志,保险起见,我这里就先把运行的容器给停了。

之后执行脚本文件,命令如下:

powershell 复制代码
sh docker_logs_clean.sh start

再看一下磁盘空间:

powershell 复制代码
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'

可以用如下命令查看脚本文件换行符是否合法:

powershell 复制代码
cat -v docker_logs_clean.sh

cat -v 文件名:查看换行符是否合法,如果是上述的,则行结尾会是^m

需要转换成linux/unix格式的"\n"

原因:这可能是在window系统中创建好文件,再上传到服务器,导致换行符不符合Linux的格式。

解决办法:

powershell 复制代码
sed 's/\r//' docker_logs_clean.sh > docker_logs_clean.sh

(2)、清理 /var/lib/docker/volumes 目录

假如不更新项目,只是想清一下日志,前面已经查到 /var/lib/docker/volumes 目录下的日志,这里重新查一下,命令如下:

powershell 复制代码
find /var/lib/docker/volumes -name "*.log"

使用如下命令清除

powershell 复制代码
find /var/lib/docker/volumes -type f -name "*.log" -delete

可以看到那些日志文件都清除了。

再检查一下文件docker占比

powershell 复制代码
du -h --max-depth=1

可以看到 /var/lib/docker/volumes 目录只剩下791M了,这些是我的jar包。

假如要更新项目,则清除所有的镜像,命令如下:

powershell 复制代码
docker system prune -a 

输入 y 回车就可以删除了,我使用的是docker-compose部署的微服务,这里就先不删除。

删除所有的卷,命令如下:

powershell 复制代码
docker volume prune 

输入 y 回车就可以删除了,我使用的是docker-compose部署的微服务,这里就先不删除。

使用docker-compose时只清除项目镜像和容器,需要 docker-compose.yml 文件所在目录,我这里是 /www/wwwroot/changjing/jar ,命令如下

powershell 复制代码
docker-compose down --rmi all

看一下docker-compose的容器

powershell 复制代码
docker-compose ps

以及镜像

powershell 复制代码
docker-compose images

可以看到容器和镜像都被删除了。

再查看一下 /var/lib/docker 目录的磁盘占比

powershell 复制代码
du -h --max-depth=1

可能是因为我前面已经清理过日志文件了,看不出什么变化, /var/lib/docker/volumes 目录占791M是jar包。

那再删除一下卷:

powershell 复制代码
docker volume prune

可以看到 /var/lib/docker/volumes 目录释放了一些空间,应该是把jar包清理了。

再查看一下服务器磁盘空间分布

powershell 复制代码
df -h

应该清得差不多了。

(3)、清理 /var/lib/docker/overlay2 目录

经过前面的清理只剩下 /var/lib/docker/overlay2 目录占磁盘空间大一些了,使用删除镜像和容器的命令清理:

powershell 复制代码
docker system prune -a

清除了2G的空间,再看一下docker磁盘占用

powershell 复制代码
du -h --max-depth=1

可以看到 /var/lib/docker/overlay2 目录也清理得差不多了。

(4)、限制docker日志大小

按照前面的方式清理,隔一段时间后磁盘又会被docker日志占满,这里设置一下日志上限。

编辑 /etc/docker/daemon.json 文件,第一次应该是没有的,创建就好了,加入如下配置:

powershell 复制代码
{
	"registry-mirrors": ["http://hub-mirror.c.163.com"],
	"storage-driver": "overlay2",
	"storage-opts": [
		"overlay2.override_kernel_check=true",
		"overlay2.size=15G"
	],
	"log-driver": "json-file",
	"log-opts": {
		"max-size": "1024m",
		"max-file": "3"
	}
}

解释:

registry-mirrors:设置镜像加速。

storage-driver:指定Docker的存储驱动,常见的选项包括 "overlay2"、"aufs"、"btrfs"、"devicemapper" 和 "zfs",一般为 "overlay2"。

storage-opts:存储驱动程序选项。

log-driver:容器日志的默认驱动程序,默认为 "json-file" 。

log-opts:容器默认日志驱动程序选项。

然后重新加载一下docker的配置文件

powershell 复制代码
systemctl daemon-reload

再重启一下docker

powershell 复制代码
systemctl restart docker

注意,重启之后原来的镜像和容器要删除,不然重新启动是报错的!!!

如果启动容器时报如下错就是因为没有重新拉取镜像。

docker: Error response from daemon: open /var/lib/docker/overlay2/2ef38eb701745d5e944dd8c04d404347cd1d7d87140ff48817c935901bcd9550/committed: no such file or directory.

假如重启docker失败

报错如下:

docker.socket: Failed with result 'service-start-limit-hit'.

只要把 daemon.json 的改为 daemon.conf ,命令如下:

powershell 复制代码
mv /etc/docker/daemon.json /etc/docker/daemon.conf

再次重启就好了。

(5)、限制docker-compose的单个容器日志

这个只有使用docker-compose部署项目的小伙伴才能用到,在每个容器配置下加入如下配置:

powershell 复制代码
logging:
  driver: "json-file"
  options:
    max-size: "256m"
    max-file: "3"

然后再使用docker-compose命令启动容器。

相关推荐
妖果yaoyao18 分钟前
docker 部署clickhouse
clickhouse·docker·容器
江湖人称小鱼哥25 分钟前
docker安装flowable ui
ui·docker·容器
weixin_445852881 小时前
Docker部署常见应用之Superset
运维·docker·容器
Roc.Chang2 小时前
理解与清理 Docker 中的悬空镜像(Dangling Images)
运维·docker·容器
又逢乱世3 小时前
Ubuntu 安装 Docker
linux·ubuntu·docker
庸子3 小时前
Docker容器网络架构深度解析与技术实践指南——基于Linux内核特性的企业级容器网络实现
网络·docker·架构
和计算机搏斗的每一天4 小时前
k8s术语之Horizontal Pod Autoscaling
云原生·容器·kubernetes
柚个朵朵6 小时前
Springclound常用五大组件及其使用原理
spring cloud·hystrix·eureka·ribbon·gateway·feign
郭涤生13 小时前
在ubuntu的docker上常用的docker命令
ubuntu·docker