有时候我们在部署一些集群类,或者较大型的服务套件,会创建很多卷来保存不同的容器数据,但是当我们测试结束或者不想用了,
如果要彻底删除磁盘上的数据,那么就不仅仅是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*"
这个命令的步骤是:
- 使用
docker volume prune
命令来删除未被使用的卷。- 使用
--filter "label!=keep"
选项来排除具有 "keep" 标签的卷,以防止误删。- 使用
--filter "name=sentry*"
选项来过滤出以 "sentry" 开头的卷。这样可以更简单地删除所有不再使用的卷,包括以 "sentry" 开头的卷。
📢 条条大路通罗马,如果还有其他办法,欢迎留言 😁
{\__/}
(̷ ̷´̷ ̷^̷ ̷`̷)̷◞~❤
| ⫘ |