docker 批量删除挂载卷的办法

本文讲述了如何在部署大型服务后,如sentry组件,彻底删除Docker卷及其数据,包括筛选、格式化输出、使用grep、awk以及docker_volume_prune命令进行清理。
摘要由CSDN通过智能技术生成

有时候我们在部署一些集群类,或者较大型的服务套件,会创建很多卷来保存不同的容器数据,但是当我们测试结束或者不想用了,

如果要彻底删除磁盘上的数据,那么就不仅仅是docker rm docker_name 这样简单了,

同时也要清楚掉它们的挂载卷才能达到删除干净,他们的路径通常保存在

/var/lib/docker/volumes 下面

📣1.通过筛选匹配字符、格式方法 

例如下面是我们之前在开发机部署的一套sentry组件。后来不用了,那么我们就借此机会演示下

#首先是先查看本机上都有哪些卷吧

docker volume ls
DRIVER    VOLUME NAME
local     5d562dd1a6b0349369d8b06a84cf37107e3dfeac81dc8869c82e01afd81be97f
local     06d7432581d188fbc6b68da582a78c7283a86b6a8b0f0e9ed5d16ecd636563de
local     086815c1f2b2e9f06773f56b4c9bb0cb3f94d3121998464182ecb3f3b081d81a
local     a44021f04ad3bac66a6a4868aae7bb85780f4b72b411b31eeb704fd27b86a0b7
local     aebb061bc00eed627cfc41ac17054550af2de04d4982ab9b20711682773b37dc
local     c1dd243eaf77cfa86ee6f95eafbf766880c823032c02829ec606349c93e459cf
local     d9cfb1a7bfecf6955cd3766b2141c0203a643a853adcca735bc3428196e7c1e1
local     e8cb1a850b95e7027abeb87e64f70fdda9b1ca193ac4cb7fea280e530b1733e0
local     f2dd8a02005a98e15b4f148535f5890ed2e92a4d685715256bf0359dc6e2ee7f
local     f5ba0463c01b14328c9fd786035b76a457fca608b6357e2225e40775a4752127
local     fb76f607fab7a3b16f904bb8c0bc8cfa2493d4db4b97fd10a96aaa6a7e764850
local     logstash-volume
local     portainer_data
local     sentry-clickhouse
local     sentry-data
local     sentry-kafka
local     sentry-postgres
local     sentry-redis
local     sentry-self-hosted_sentry-clickhouse-log
local     sentry-self-hosted_sentry-kafka-log
local     sentry-self-hosted_sentry-nginx-cache
local     sentry-self-hosted_sentry-secrets
local     sentry-self-hosted_sentry-smtp
local     sentry-self-hosted_sentry-smtp-log
local     sentry-self-hosted_sentry-zookeeper-log
local     sentry-symbolicator
local     sentry-zookeeper

通过查看 我们可以观察到在之前部署sentry时,它已经非常规则的创建了sentry+服务名称 这样的卷。

那么我们在清理时就可以利用到docker 命令中的 --format '{{.Driver}} {{.Name}}'

使用 --format 选项来格式化输出,以便只显示卷的驱动程序和名称。

例如

docker volume ls --format '{{.Driver}}空格{{.Name}}'   
#}}(这里可以用空格或者其他分隔符或者不写但是会导致设备和卷名称连接到一起){{
local 5d562dd1a6b0349369d8b06a84cf37107e3dfeac81dc8869c82e01afd81be97f
local 06d7432581d188fbc6b68da582a78c7283a86b6a8b0f0e9ed5d16ecd636563de
local 086815c1f2b2e9f06773f56b4c9bb0cb3f94d3121998464182ecb3f3b081d81a
local a44021f04ad3bac66a6a4868aae7bb85780f4b72b411b31eeb704fd27b86a0b7
local aebb061bc00eed627cfc41ac17054550af2de04d4982ab9b20711682773b37dc
local c1dd243eaf77cfa86ee6f95eafbf766880c823032c02829ec606349c93e459cf
local d9cfb1a7bfecf6955cd3766b2141c0203a643a853adcca735bc3428196e7c1e1
local e8cb1a850b95e7027abeb87e64f70fdda9b1ca193ac4cb7fea280e530b1733e0
local f2dd8a02005a98e15b4f148535f5890ed2e92a4d685715256bf0359dc6e2ee7f
local f5ba0463c01b14328c9fd786035b76a457fca608b6357e2225e40775a4752127
local fb76f607fab7a3b16f904bb8c0bc8cfa2493d4db4b97fd10a96aaa6a7e764850
local logstash-volume
local portainer_data

一般本机的话,那么我们就不需要显示 {{.Driver}} 字段,所以只需要--format '{{.Name}}'

docker volume ls --format '{{.Name}}'
5d562dd1a6b0349369d8b06a84cf37107e3dfeac81dc8869c82e01afd81be97f
06d7432581d188fbc6b68da582a78c7283a86b6a8b0f0e9ed5d16ecd636563de
086815c1f2b2e9f06773f56b4c9bb0cb3f94d3121998464182ecb3f3b081d81a
a44021f04ad3bac66a6a4868aae7bb85780f4b72b411b31eeb704fd27b86a0b7
aebb061bc00eed627cfc41ac17054550af2de04d4982ab9b20711682773b37dc
c1dd243eaf77cfa86ee6f95eafbf766880c823032c02829ec606349c93e459cf
d9cfb1a7bfecf6955cd3766b2141c0203a643a853adcca735bc3428196e7c1e1
e8cb1a850b95e7027abeb87e64f70fdda9b1ca193ac4cb7fea280e530b1733e0
f2dd8a02005a98e15b4f148535f5890ed2e92a4d685715256bf0359dc6e2ee7f
f5ba0463c01b14328c9fd786035b76a457fca608b6357e2225e40775a4752127
fb76f607fab7a3b16f904bb8c0bc8cfa2493d4db4b97fd10a96aaa6a7e764850
logstash-volume
portainer_data

到这里,其实已经实现了代替grep以及awk取$2也就是卷名字的办法了,

那么如上述所说,我们想要获取到sentry相关的卷名称,

也不需要用grep sentry这样的办法,可以使用 --filter name=sentry 选项来过滤包含 "sentry" 的卷

 

   docker volume ls --filter name=sentry --format '{{.Name}}'
sentry-clickhouse
sentry-data
sentry-kafka
sentry-postgres
sentry-redis
sentry-self-hosted_sentry-clickhouse-log
sentry-self-hosted_sentry-kafka-log
sentry-self-hosted_sentry-nginx-cache
sentry-self-hosted_sentry-secrets
sentry-self-hosted_sentry-smtp
sentry-self-hosted_sentry-smtp-log
sentry-self-hosted_sentry-zookeeper-log
sentry-symbolicator
sentry-zookeeper
#这样就获取到了所有包含了sentry的卷了,剩下的只需要通过管道符|来完成删除动作即可了。
docker volume ls --filter name=sentry --format '{{.Name}}' | xargs -r docker volume rm
#使用 xargs -r docker volume rm 来删除这些卷。 
-r 选项是为了防止在没有输入的情况下运行删除命令。
docker volume ls --filter name=sentry --format '{{.Name}}'|xargs -r docker volume rm
sentry-clickhouse
sentry-data
sentry-kafka
sentry-postgres
sentry-redis
sentry-self-hosted_sentry-clickhouse-log
sentry-self-hosted_sentry-kafka-log
sentry-self-hosted_sentry-nginx-cache
sentry-self-hosted_sentry-secrets
sentry-self-hosted_sentry-smtp
sentry-self-hosted_sentry-smtp-log
sentry-self-hosted_sentry-zookeeper-log
sentry-symbolicator
sentry-zookeeper

最终再看下我们本机的卷还有哪些。

docker volume ls
DRIVER    VOLUME NAME
local     5d562dd1a6b0349369d8b06a84cf37107e3dfeac81dc8869c82e01afd81be97f
local     06d7432581d188fbc6b68da582a78c7283a86b6a8b0f0e9ed5d16ecd636563de
local     086815c1f2b2e9f06773f56b4c9bb0cb3f94d3121998464182ecb3f3b081d81a
local     a44021f04ad3bac66a6a4868aae7bb85780f4b72b411b31eeb704fd27b86a0b7
local     aebb061bc00eed627cfc41ac17054550af2de04d4982ab9b20711682773b37dc
local     c1dd243eaf77cfa86ee6f95eafbf766880c823032c02829ec606349c93e459cf
local     d9cfb1a7bfecf6955cd3766b2141c0203a643a853adcca735bc3428196e7c1e1
local     e8cb1a850b95e7027abeb87e64f70fdda9b1ca193ac4cb7fea280e530b1733e0
local     f2dd8a02005a98e15b4f148535f5890ed2e92a4d685715256bf0359dc6e2ee7f
local     f5ba0463c01b14328c9fd786035b76a457fca608b6357e2225e40775a4752127
local     fb76f607fab7a3b16f904bb8c0bc8cfa2493d4db4b97fd10a96aaa6a7e764850
local     logstash-volume
local     portainer_data

📣2.当然使用三剑客也是可以的

docker volume ls|grep logstash |awk '{print $2}'

📣3.或者是通过筛选不在运行状态下,沉睡的卷去删除也是可以的。

docker volume prune --filter "label!=keep" --filter "name=sentry*"

这个命令的步骤是:

  1. 使用 docker volume prune 命令来删除未被使用的卷。
  2. 使用 --filter "label!=keep" 选项来排除具有 "keep" 标签的卷,以防止误删。
  3. 使用 --filter "name=sentry*" 选项来过滤出以 "sentry" 开头的卷。

这样可以更简单地删除所有不再使用的卷,包括以 "sentry" 开头的卷。

📢 条条大路通罗马,如果还有其他办法,欢迎留言 😁

{\__/}
(̷ ̷´̷ ̷^̷ ̷`̷)̷◞~❤
|  ⫘ |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值