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

慈云数据 6个月前 (05-14) 技术支持 30 0

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

  • 一、问题
  • 二、解决
    • 1、查看 /var/lib/docker 目录
      • (1)、containers 目录
      • (2)、volumes 目录
      • (3)、overlay2 目录
      • 2、清理
        • (1)、清理 /var/lib/docker/containers 目录
        • (2)、清理 /var/lib/docker/volumes 目录
        • (3)、清理 /var/lib/docker/overlay2 目录
        • (4)、限制docker日志大小
        • (5)、限制docker-compose的单个容器日志

          一、问题

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

          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 
          

          在这里插入图片描述

          输入 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命令启动容器。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon