You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker创建千余无法清理本地卷,如何排查解决?

问题背景

我们有一台运行Docker测试环境的Ubuntu服务器,磁盘空间耗尽后排查发现/var/lib/docker占用826GB,其中/var/lib/docker/volumes目录就占了600GB。Docker创建了1300多个本地卷,常规清理命令无法有效解决:

当前服务器Docker资源状态

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        12        9.271GB   447.8MB (4%)
Containers      12        10        405.9MB   62.84MB (15%)
Local Volumes   1307      8         634.8GB   630.8GB (99%)
Build Cache     3586      0         19.05GB   19.05GB

清理操作及结果

  • 执行docker volume prune仅清理了少量卷
  • 执行docker system prune -a -f仅清理了21GB构建缓存,未清理任何卷
  • 查询某无主卷的关联容器,无结果返回:
$ docker ps -a --filter volume=ff17641242297f3f9f3a63b2c328168f93c514e6e41cc3ed19bfbcb192acb5c7
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

正常服务器对比状态

另一台部署相同测试环境的服务器状态正常,仅存在9个本地卷:

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          13        13        10.07GB   447.8MB (4%)
Containers      14        10        312.2MB   111.7MB (35%)
Local Volumes   9         9         5.212GB   0B (0%)
Build Cache     0         0         0B        0B

可能原因

  1. 测试流程的卷清理逻辑缺失:测试脚本或CI/CD流水线每次运行时创建新卷,但未在测试结束后自动清理。比如使用docker run -v创建匿名卷却未加--rm参数,或者命名卷未绑定容器生命周期。
  2. Docker状态同步异常:容器被强制删除(比如直接删除/var/lib/docker/containers目录)后,卷的关联记录未更新,导致prune命令误判卷仍在使用。
  3. Docker守护进程运行异常:Docker daemon长时间运行,内部状态出现偏差,无法正确识别无主卷。
  4. 外部进程占用卷资源:宿主机上的备份工具、监控脚本等进程正在访问卷的文件目录,导致Docker无法清理。

解决方法

1. 手动识别并清理无主卷

先筛选出所有未关联容器的卷,再批量删除:

# 列出所有无主卷
docker volume ls -qf dangling=true

# 批量删除无主卷
docker volume rm $(docker volume ls -qf dangling=true)

如果批量删除报错,可逐个验证后删除:

# 遍历所有卷,检查是否关联容器并清理无主卷
for vol in $(docker volume ls -q); do
  if [ -z "$(docker ps -a --filter volume=$vol --format '{{.ID}}')" ]; then
    echo "删除无主卷: $vol"
    docker volume rm $vol
  fi
done

2. 修复Docker daemon状态异常

重启Docker服务,让其重新同步卷与容器的关联关系:

sudo systemctl restart docker

重启后再次执行docker volume prune -f,验证是否能正常清理。

3. 排查并修复测试流程

检查测试脚本、CI/CD流水线中的Docker命令:

  • 临时使用的卷,添加--rm参数让卷随容器一起删除;
  • 命名卷需绑定测试任务生命周期,任务结束后显式执行docker volume rm清理。

4. 检查外部进程占用

用lsof命令确认是否有进程在访问卷目录:

# 替换为目标卷的实际路径
sudo lsof /var/lib/docker/volumes/<VOLUME_ID>/_data

若发现占用进程,先停止进程再清理卷。

5. 极端情况:手动清理卷目录(谨慎操作)

如果上述方法均无效,且确认卷无任何价值,可手动清理:

# 停止所有容器
sudo docker stop $(docker ps -q)
# 停止Docker服务
sudo systemctl stop docker
# 删除无主卷目录(提前确认目录对应无主卷)
sudo rm -rf /var/lib/docker/volumes/*/_data
# 启动Docker服务
sudo systemctl start docker

注意:此操作风险极高,务必确认待删除卷无重要数据,且已完成必要备份。

内容的提问来源于stack exchange,提问作者not2savvy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:32