/var/cache/apt/archives/内存不足问题:

Solution:

1. 将/var/cache/apt/archives/下的deb安装包都清掉。

 
  1. sudo apt-get install autoremove
  2. sudo apt-get clean
 

再试试行不行,要是空间还不够,就找一个空间大的地方,建一个单独的目录,将/var/cache/apt/archives/换成指向这个目录的软链接。

 

2. 查看内存使用情况 

df -h

可以看出/dev/shm还有2GB的空间,故在其下建立单独目录debs

 
  1. mkdir /dev/shm/debs
  2. sudo rm -rf /var/cache/apt/archives
  3. sudo ln -s /dev/shm/debs /var/cache/apt/archives
 

再试试成不成!!!

Docker下/var/lib/docker/overlay2空间清理办法_docker overlay2清理-CSDN博客

Docker下/var/lib/docker/overlay2空间清理办法
1. 查看磁盘占用
    df -h
2. Docker 的内置 CLI 指令docker system df
    可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使用大户的空间占用情况。
    ~]# docker system df
    查看详细
    ~]# docker system df -v
3. 空间清理
    【1】通过 Docker 内置的 CLI 指令docker system prune来进行自动空间清理。
    ~]# docker system prune --help
    该指令默认会清除所有如下资源:
        已停止的容器(container)
        未被任何容器所使用的卷(volume)
        未被任何容器所关联的网络(network)
        所有悬空镜像(image)。
        
    该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。添加-a 或 --all参数后,可以一并清除所有未使用的镜像和悬空镜像。
    可以添加-f 或 --force参数用以忽略相关告警确认信息。
    【2】另外除了system级别的,还有针对容器或是镜像级别的删除命令:
    docker image prune:删除悬空的镜像。
    docker container prune:删除无用的容器。
      --默认情况下docker container prune命令会清理掉所有处于stopped状态的容器
      --如果不想那么残忍统统都删掉,也可以使用--filter标志来筛选出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24内创建的除外:
      --$ docker container prune --filter "until=24h"  

    docker volume prune:删除无用的卷。
    docker network prune:删除无用的网络
    【3】手动清除
        对于悬空镜像和未使用镜像可以使用手动进行个别删除:
        1、删除所有悬空镜像,不删除未使用镜像:
        docker rmi $(docker images -f "dangling=true" -q)


        2、删除所有未使用镜像和悬空镜像
        docker rmi $(docker images -q)


        3、清理卷
        如果卷占用空间过高,可以清除一些不使用的卷,包括一些未被任何容器调用的卷(-v 详细信息中若显示 LINKS = 0,则是未被调用):
        删除所有未被容器引用的卷:
        docker volume rm $(docker volume ls -qf dangling=true)


        4、容器清理
        如果发现是容器占用过高的空间,可以手动删除一些:
        删除所有已退出的容器:
        docker rm -v $(docker ps -aq -f status=exited)
        删除所有状态为dead的容器
        docker rm -v $(docker ps -aq -f status=dead)
4. 查找系统中的大文件【以上三步仍然不可以的时候执行】
     find /var/lib/docker/overlay2/ -type f -size +100M -print0 | xargs -0 du -h | sort -nr 
     # 查找指定目录下所有大于100M的所有文件
     
5. 对标准输入日志大小与数量进行限制
    新建或修改/etc/docker/daemon.json,添加log-dirver和log-opts参数
    vi /etc/docker/daemon.json
    {
       "log-driver":"json-file",
       "log-opts": {"max-size":"3m", "max-file":"1"}
    }

    重启docker的守护线程

    systemctl daemon-reload
    systemctl restart docker
6. docker 清理空间命令
    删除悬空镜像
    docker rmi $(docker images -f "dangling=true" -q)
    docker image prune -a -f
    #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,
    sudo docker ps -a|grep Exited|awk '{print $1}'
    #查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器
    sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`
    方法二: 
    #删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
    sudo docker rm $(sudo docker ps -a -q)
     
    方法三:
    #根据容器的状态,删除Exited状态的容器
    sudo docker rm $(sudo docker ps -qf status=exited)
     
    方法四:
    #Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。
    sudo docker container prune
     
    #删除所有镜像
    sudo docker rmi $(docker images -q)
7. 实在没办法,只有把/var目录下所有日志文件清空
    ~]# for i in `find /var -name *.log*`;do >$i;done
    然后重启node节点,因为有些日志文件被占用,清空后空间仍然无法释放

Docker容器储存位置迁移攻略-百度开发者中心

在开始迁移之前,请确保您已经备份了所有重要的容器数据,并确认新的存储位置有足够的空间来容纳这些数据。同时,如果您使用的是私有镜像或有其他特殊配置,请确保这些信息已经妥善处理。

首先,需要暂停 Docker 服务以避免数据不一致。您可以使用以下命令来停止 Docker 服务:

  1. service docker stop

接下来,创建一个新的目录来存放迁移后的容器数据。例如,我们可以创建一个名为 /data/docker 的目录:

  1. mkdir -p /data/docker/

现在,使用 rsync 工具来迁移数据。rsync 是一个用于同步文件和目录的工具,可以高效地迁移大量数据。以下是使用 rsync 迁移数据的命令:

  1. rsync -av /var/lib/docker/ /data/docker/

这个命令会将 /var/lib/docker/ 目录下的所有文件和目录复制到新目录 /data/docker/ 下。-a 参数表示归档模式,保持文件属性等;-v 参数表示详细模式,显示复制过程中的信息。

数据迁移完成后,我们需要修改 Docker 的配置,让它从新的位置加载和存储数据。编辑 /etc/docker/daemon.json 配置文件(如果不存在则创建),添加或修改 data-root 字段为新的存储路径:

  1. {
  2. "data-root": "/data/docker"
  3. }

保存并关闭文件后,重新启动 Docker 服务,使新的配置生效:

  1. service docker start

最后,使用以下命令验证 Docker 数据存储设置是否已更新:

  1. du -hs /var/lib/docker # 旧路径,应该返回0或很小数值
  2. du -hs /data/docker # 新路径,应该返回之前迁移的数据大小

通过以上步骤,您已经成功将 Docker 容器的储存位置迁移到了新的位置。请记住,在生产环境中进行此类操作前,务必进行充分的测试和备份,以确保数据的完整性和服务的稳定性。

docker的overlay2中存的都是什么and如何清理/var/lib/docker/overlay2_docker overlay 是什么目录-CSDN博客

我们所有的服务都是使用docker部署的,经过检查,这次占满了磁盘的都是在/var/lib/docker/overlay2目录下的文件夹,这个路径一看就是docker的存储目录,但是为什么docker跑得好好的他的占用会变高呢?
在这里插入图片描述
图中可见,/var/lib/docker/overlay2目录的占用大的离谱
那我们进来看看这个目录下是什么占用了这么大的空间
在这里插入图片描述
上图可见,/var/lib/docker/overlay2目录下的文件夹名基本都是这种md5编码,并且其中有一个a875e开头的文件夹的占用达到了518G,相当恐怖
那/var/lib/docker/overlay2目录存 的到底是什么呢?为什么能有这么大的占用?我们又需要如何去进行清理呢?
我查阅了一些博客文章了解到,overlay2是docker使用的文件存储驱动,也就是说,在/var/lib/docker/overlay2目录下的文件都是docker使用的存储【废话】
overlay2是分层存储,每一层通过本层的md5作为文件夹名来命名,如果要存储的两个东西【比如两个镜像】的底层几层的内容是一样的,那他们的md5就也是一样的,通过md5核验,确认他们这几层是一样的之后,在overlay2中实际存储的时候,这几层就可以只存储一份,然后由这两个东西共用,来达到节省空间的目的。
在这里插入图片描述
所以我们在/var/lib/docker/overlay2目录下看到的这茫茫多的md5,就是一层一层的数据

那为什么我们客户服务器上的a875e开头的文件夹占用会达到518G呢?究竟是什么东西占用了这么多?
我们进这个文件夹里看一眼
在这里插入图片描述
可以看到,在这个a875e的文件夹中,有一个diff文件夹占用259G,一个merged文件夹占用259G,直觉告诉我这两个文件夹中存储的应该是基本一致的东西

所以是什么东西呢???

经过排查,我们发现是我们一个服务会将一些运行文件存储在本地文件路径中,但是,这个服务在启动的时候因为一些疏忽,没有将他要存储文件的路径挂载到宿主机中,导致这个服务一直在往容器内的某个路径写文件,这个服务在运行了一年多之后写入容器内本地的文件终于到了……259G,但虽然在容器内占用是259G,但是在宿主机上,变成了diff文件夹占用259G,merged文件夹占用259G,合共518G,磁盘空间就这么被吃掉了。

为了测试我们的推断,我们进入容器内删除了那些本地文件,然后再在宿主机上查看宿主机的磁盘占用,果然,我们在容器内删除的文件大小是259G,但是宿主机上空出了518G的空间,故我们可以确定,我们在a875e的文件夹中看到的diff文件夹和merged文件夹,其中实际占用巨量空间的东西就是我们在容器内存储的本地文件,换言之,/var/lib/docker/overlay2目录会存储我们起的容器中的文件【应该还包括我们的镜像本身,docker镜像也是分层存储在这里的,毕竟容器跑起来以后系统相关的一些文件是和镜像一样的】

所以回到标题
docker的overlay2中存的都是什么?
存的是我们的镜像文件和容器内的文件
如何清理/var/lib/docker/overlay2?

  • 删除不用的镜像
  • 检查是否有容器内的服务会往容器内的本地写文件
  • 检查各容器的磁盘占用,如果有发现磁盘占用过高的情况则对应处理【原则上如果容器内服务有写文件行为,则写文件的目录应当挂载到宿主机上,而不是直接往容器的本地写
  • 需要应急处理的话可以先进入容器内直接删除容器内可以删除的文件
posted @ 2024-06-04 15:39  CharyGao  阅读(73)  评论(0编辑  收藏  举报