首页 > 其他分享 >docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

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

时间:2024-04-09 10:24:18浏览次数:29  
标签:logs lib 目录 var overlay2 docker

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

一、问题

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

df -h(或 df -TH)【df命令是用来查看linux系统服务器文件系统的磁盘使用情况】

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

二、解决

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

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

cd /var/lib/docker

检索文件的最大深度1,即只检索汇总计算当前目录下的文件(或查询当前目录下所有文件和目录的大小,包括子目录中的文件大小(通过汇总子目录的大小))

du -h --max-depth=1(du -sh *)

(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

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

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

docker volume prune

 

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

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

docker-compose down --rmi all

 看一下docker-compose的容器

docker-compose ps

以及镜像

docker-compose images

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

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

du -h --max-depth=1

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

那再删除一下卷:

docker volume prune

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

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

df -h

 应该清得差不多了。

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

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

docker system prune -a

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

du -h --max-depth=1

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

(4)、限制docker日志大小

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

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

{
"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的配置文件

systemctl daemon-reload

 再重启一下docker

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 ,命令如下:

mv /etc/docker/daemon.json /etc/docker/daemon.conf

再次重启就好了。

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

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

logging:
driver: "json-file"
options:
max-size: "256m"
max-file: "3"

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

 

转自:https://blog.csdn.net/studio_1/article/details/135605084

标签:logs,lib,目录,var,overlay2,docker
From: https://www.cnblogs.com/tk-bolg/p/18120787

相关文章

  • 解决Docker端口映射后外部访问未开启的端口问题
    在使用Docker时,经常会遇到需要将容器内部的服务映射到宿主机上的端口,以便外部可以访问。但有时候会遇到这样的问题:即使宿主机上未开启对应的端口,外部依然可以通过这些端口直接访问到服务,这可能存在一定的安全隐患。本文将介绍如何解决这个问题。首先,让我们了解一下Docker端......
  • 如何使用Docker容器化改善你的开发流程
    使用Docker容器化技术可以大大改善开发流程,提高软件开发和部署的效率。Docker提供了一个轻量级的、可执行的包装环境,使得应用程序可以在几乎任何地方以相同的方式运行,这减少了从开发到生产环境的“它在我的机器上可以正常工作”的问题。参考文档:如何使用Docker容器化改善你的开......
  • JDK proxy 和cglib 源码解读
    HelloWorld1JDKProxy案例创建接口packagecom.gientech.proxy.jdk;publicinterfaceICalculator{publicIntegeradd(Integeri,Integerj);publicIntegersub(Integeri,Integerj);publicIntegermul(Integeri,Integerj);publicIntegerdiv......
  • 【Linux系统编程】libevent库介绍与安装
    libevent库介绍与安装libevent介绍libevent是一个异步事件处理软件函式库。libevent是一个提供异步事件通知的软件库。libevent提供了一组应用程序编程接口(API),libeventAPI提供的机制允许开发者为事件注册回调函数,例如文件描述符上的发生了特定事件或者等待特定事件超时,接收到......
  • docker部署clickhouse
    拉取镜像最新镜像不加版本号即可dockerpullclickhouse/clickhouse-server:latest宿主机创建目录mkdir-p/usr/local/docker/clickhouse/conf/usr/local/docker/clickhouse/data/usr/lcoal/docker/clickhouse/log启动临时容器获取配置文件dockerrun--rm-d--nam......
  • asp.core生成docker镜像(使用本地nuget)
    生成Dockerfilevs自带生成Dockerfile功能了使用本地的nuget包加入nuget配置文件NuGet.ConfigNuGet.Config配置文件,配置地址如果没有配置生成镜像会报错,没找到package生成镜像生成Docker映像(想深入了解,可以网上看看dockerbuild的参数)dockerbuild-f"C:\Projec......
  • [docker] rockylinux8安装docker
    rockylinux8默认使用podman代替podman,但是在使用podman+portainer时出现不少问题,所以打算安装回docker,在此记录一下安装dockeryuminstall-yhttps://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpmyuminstall-yyum-......
  • Docker 三要素:镜像 容器 仓库
    镜像、容器、仓库为docker的三要素。首先,我们来了解一下docker容器实例吧。   所谓的镜像就是Book,在java里面叫做(类模板),所谓的newBook();基于同一份镜像模板,基于同一项java对象弄出来的,不同的实例对象,模板均来自同一份,等号左边叫类模板,等号右边叫整体叫做实例对象。 ......
  • MySQL - varchar(N) 的N代表什么?怎么存储?
    varchar(N)的N代表什么?N代表“字符”varchar(32)表示:可以存储32个字符,包括中文和其他字符。跟中英文无关,也就是该字段可以存储32个中文,或者是32个英文,或者是32个中文和英文的混搭都行。但如果字符数超过32个的话就会报错。参考:什么是字符?什么是字节? 原文内容......
  • Docker部署xxl-job
    官方文档:https://www.xuxueli.com/xxl-job/#《分布式任务调度平台XXL-JOB》参考文档:https://www.jianshu.com/p/c47a405e98c4安装正常情况下,mysql的账号和密码如果和xxl-job上面的密码是一样的话,直接使用官方文档命令行即可:dockerrun-p8080:8080-v/tmp:/data/applogs--n......