• Docker把存储占满了?怎么办,教你两个秘籍,通过prune或迁移overlay2


    docker

    前言

    大家好,我是奇想派,一名努力分享,誓要成为编程达人的程序员。

    很多开发朋友,在使用docker的时候,经常下载镜像,镜像打标签,然后不清理无用的镜像,久而久之,docker就会把宿主机的磁盘空间占满,这个时候要怎么办?教你两个秘籍,通过docker自带的prune命令或者迁移docker下的overlay2文件夹。

    不懂怎么操作?那就跟着奇想派进行实操吧!

    方法1:清理docker空间,通过prune

    1、命令查看磁盘使用情况。

    du -hs /var/lib/docker/ 
    
    • 1

    2、清理docker磁盘

    #类似于Linux上的df命令,用于查看Docker的磁盘使用情况:
    docker system df
    
    #可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。 
    docker system prune
    
    #清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…
    #所以使用之前一定要想清楚.。我没用过,因为会清理 没有开启的  Docker 镜像。
    docker system prune -a
    
    #docker system df -v 命令可以进一步查看空间占用细节,以确定是哪个镜像、容器或本地卷占用过高空间
    docker system df -v 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    自动清理命令

    docker system prune 可对空间进行自动清理。
    该命令所清理的对象如下:
    已停止的容器
    未被任何容器使用的卷
    未被任何容器所关联的网络
    所有悬空的镜像
    对于上面提到的一些镜像或容器的状态,需要我们心里有点数:
    已使用的镜像:指所有已被容器(包括stop的)关联的镜像,也就是docker ps -a所看到的所有容器对应的image。
    未引用镜像:没有被分配或使用在容器中的镜像
    悬空镜像(dangling image):未配置任何Tag(也就是无法被引用)的镜像。通常是由于镜像编译过程中未指定-t参数配置Tag导致的。
    docker system prune后可以加额外的参数,如:
    docker system prune -a : 一并清除所有未被使用的镜像和悬空镜像。
    docker system prune -f : 用以强制删除,不提示信息。
    另外除了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:删除无用的网络
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    手动清除

    对于悬空镜像和未使用镜像可以使用手动进行个别删除:
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法2:迁移 /var/lib/docker 目录

    /var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录。

    1 停止docker服务。

    systemctl stop docker
    
    • 1

    2 创建新的docker目录,执行命令df -h,找一个大的磁盘。 我在 /home目录下面建了 /home/docker/lib目录,执行的命令是:

    mkdir -p /home/docker/lib
    
    • 1

    3 迁移/var/lib/docker目录下面的文件到 /home/docker/lib:

    rsync -avz /var/lib/docker /home/docker/lib/
    
    • 1

    4 配置 /etc/systemd/system/docker.service.d/devicemapper.conf。查看 devicemapper.conf 是否存在。如果不存在,就新建。

    sudo mkdir -p /etc/systemd/system/docker.service.d/
    
    sudo vi /etc/systemd/system/docker.service.d/devicemapper.conf
    
    • 1
    • 2
    • 3

    5 然后在 devicemapper.conf 写入:(同步的时候把父文件夹一并同步过来,实际上的目录应在 /home/docker/lib/docker )

    [Service]
    
    ExecStart=
    
    ExecStart=/usr/bin/dockerd  --graph=/home/docker/lib/docker
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6 重新加载 docker

    systemctl daemon-reload
    
     
    
    systemctl restart docker
    
     
    
    systemctl enable docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7 为了确认一切顺利,运行

    docker info
    
    • 1

    命令检查Docker 的根目录.它将被更改为 /home/docker/lib/docker

    ...
    
    Docker Root Dir: /home/docker/lib/docker
    
    Debug Mode (client): false
    
    Debug Mode (server): false
    
    Registry: https://index.docker.io/v1/
    
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    8 启动成功后,再确认之前的镜像还在:

    linlf@dacent:~$ docker images
    
    REPOSITORY      TAG         IMAGE ID       CREATED       SIZE
    
    AAA/AAA        v2          7331b8651bcc     27 hours ago     3.85GB
    
    BBB/BBB        v1          da4a80dd8424     28 hours ago     3.47GB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9 确定容器没问题后删除/var/lib/docker/目录中的文件。

    rm -rf /var/lib/docker/*
    
    • 1

    参考文档

    https://blog.csdn.net/qq_37674858/article/details/79976751

    https://blog.csdn.net/cmrsautomation/article/details/52857791

    https://blog.csdn.net/weixin_32820767/article/details/81196250


    博主个人博客网站:奇想派

    本文原创作者:奇想派、一名努力分享的程序员。

    文章首发平台:微信公众号【编程达人

    qrcode_for_gh_ef30b7fd9e6f_344

    原创不易!各位小伙伴觉得文章不错的话,不妨关注公众号,进行点赞(在看)、转发三连走起!谢谢大家!

  • 相关阅读:
    iptables知识手册
    关于Adobe Acrobat Reader升级后界面布局变化-新旧布局的选择切换
    从数据的属性看数据资产
    苹果电脑Mac系统运行速度又卡又慢是怎么回事?
    JS中将数组转化成数字的方法和创建数组的方式
    【Android】【实践】
    C#练习题-构造函数
    说电气工程和自动化是道路的尽头是不负责任的
    Echarts 雷达图的详细配置过程
    php YII2空数组插入报错问题处理 Array to string conversion
  • 原文地址:https://blog.csdn.net/qq_24298751/article/details/126077608