乐趣区

关于云原生:Docker把存储占满了怎么办教你两个秘籍通过prune或迁移overlay2

前言

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

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

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

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

1、命令查看磁盘应用状况。

du -hs /var/lib/docker/ 

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 

主动清理命令

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、删除所有悬空镜像,不删除未应用镜像: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)

办法 2:迁徙 /var/lib/docker 目录

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

1 进行 docker 服务。

systemctl stop docker

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

mkdir -p /home/docker/lib

3 迁徙 /var/lib/docker 目录上面的文件到 /home/docker/lib:

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

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

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

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd  --graph=/home/docker/lib/docker

6 从新加载 docker

systemctl daemon-reload

 

systemctl restart docker

 

systemctl enable docker

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

docker info

命令查看 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/

...

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

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

rm -rf /var/lib/docker/*

参考文档

https://blog.csdn.net/qq_3767…

https://blog.csdn.net/cmrsaut…

https://blog.csdn.net/weixin_…


博主集体博客网站:奇想派

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

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

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

退出移动版