docker 批量删除挂载卷的办法

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

如果要彻底删除磁盘上的数据,那么就不仅仅是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" 开头的卷。

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

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

### 如何在 Docker 中正确停止和处理正在使用的 Volumes #### 停止并移除容器及其关联 当需要停止并清理使用中的时,应按照如下方法执行: 对于单个容器的操作可以分为三步指令来完成。首先通过 `docker container stop` 来安全地中止运行中的容器实例;接着利用 `docker container rm` 移除已经停止的容器;最后一步则是运用 `docker volume rm` 明确指定要删除的目标名称[^1]。 ```bash docker container stop devtest docker container rm devtest docker volume rm myvol2 ``` 需要注意的是,在实际环境中应当确认没有其他仍在依赖此的服务存在之前才执行上述命令序列,以免造成数据丢失或其他不可预期的情况发生。 #### 清理未被任何容器使用的本地 为了清除那些不再有任何活动容器引用的孤立资源,可采用更为简便的方式——调用 `docker volume prune` 命令一次性批量清理这些无用的数据集[^4]: ```bash docker volume prune ``` 这条命令会询问用户是否继续操作,并仅影响当前主机上处于闲置状态下的所有文件夹。 #### 处理由 Docker Compose 创建的服务及 如果涉及到了基于 Docker Compose 定义的应用栈,则建议遵循官方推荐的最佳实践来进行管理。例如,可以通过简单的组合命令实现整个项目范围内的一键销毁功能,包括但不限于所定义的所有服务以及它们各自对应的持久化存储单元: ```bash docker-compose down -v ``` 这里 `-v` 参数的作用就是确保除了常规的服务终止外还会同步卸载掉与之配套设置好的各个命名对象[^3]。 #### 使用 --mount 标志创建新服务时挂载 针对 Swarm Mode 或者更现代的服务部署场景下,应该始终优先考虑借助于 `--mount` 这一更加灵活且语义清晰的新方式去声明所需绑定进来的外部介质位置关系,而不是沿用旧版 API 提供的传统选项如 `-v` 或者 `--volume`[^2]. ```bash docker service create \ --name redis-service \ --mount type=volume,source=mydata,target=/var/lib/redis,readonly \ redis:alpine ``` 以上代码片段展示了如何向名为 `redis-service` 的 Redis 实例附加一个只读模式访问控制属性设定过的自定义 `mydata`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值