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

Docker未使用卷溯源:识别创建容器、挂载点及重启复用性

解决方案:Docker卷溯源与管理

一、识别未使用卷的关联容器与挂载点(含停止容器)

原生Docker命令结合简单脚本即可实现,无需第三方工具:

  1. 批量遍历所有卷,关联所有容器(包括停止状态):
#!/bin/bash
# 遍历所有Docker卷
for vol in $(docker volume ls -q); do
    echo "=== 卷: $vol ==="
    # 查询关联的所有容器(含停止)
    containers=$(docker ps -a --filter volume="$vol" --format "{{.ID}} {{.Names}} {{.Status}}")
    if [ -n "$containers" ]; then
        echo "关联容器:"
        echo "$containers"
        # 获取每个容器的挂载点
        for cid in $(echo "$containers" | awk '{print $1}'); do
            mount_point=$(docker inspect "$cid" | jq -r '.[] | .Mounts[] | select(.Name == "'$vol'") | .Destination')
            echo "容器 $cid 的挂载点: $mount_point"
        done
    else
        echo "无关联容器(悬空卷)"
    fi
    echo
done

该脚本会输出每个卷的关联容器(ID、名称、运行状态)及对应的容器内挂载点,需提前安装jq用于JSON解析。

  1. 快速筛选大容量悬空卷:
# 列出所有悬空卷并显示大小,按容量排序
docker volume ls -qf dangling=true | xargs -I {} sh -c 'du -sh /var/lib/docker/volumes/{}/_data | awk "{print \$2, \$1}"' | sort -h

二、判断容器重启是否会复用该卷

核心判断逻辑是看容器的启动配置中是否持久化挂载了该卷:

  • 执行docker inspect <容器ID/名称>,查看HostConfig.Mounts字段,若卷的Name出现在其中,且容器不是以--rm模式启动的,重启容器时会自动复用该卷。
  • 如果卷由一次性容器(如docker run --rm创建的子容器)生成,且父容器重启会重新创建子容器,这类卷属于临时卷,可安全清理。

批量判断脚本:

#!/bin/bash
vol="$1"
# 遍历关联的所有容器
for cid in $(docker ps -a --filter volume="$vol" --format "{{.ID}}"); do
    # 检查容器是否配置了该卷的持久挂载
    has_mount=$(docker inspect "$cid" | jq -e '.[] | .HostConfig.Mounts[] | select(.Name == "'$vol'")')
    if [ $? -eq 0 ]; then
        restart_policy=$(docker inspect "$cid" | jq -r '.[] | .HostConfig.RestartPolicy.Name')
        echo "容器 $cid 配置了该卷挂载,重启策略: $restart_policy"
        echo "重启容器时会复用该卷"
    else
        echo "容器 $cid 未持久化挂载该卷,重启不会复用"
    fi
done

三、处理子容器生成的自动卷

对于有权限访问/var/run/docker.sock的容器(如linuxserver/code-server、datadog/agent)生成的子容器和卷,可通过以下方式溯源与管理:

  1. 跟踪父容器与子容器的关联:
    查看子容器的CreatedBy字段,通常会包含父容器的启动标识或命令:

    docker inspect <子容器ID> | jq -r '.[] | .CreatedBy'
    

    部分容器会通过标签关联父容器,比如datadog agent的子容器带有com.datadoghq.agent相关标签,可批量筛选:

    docker ps -a --filter "label=com.datadoghq.agent" --format "{{.Names}} {{.Labels}}"
    
  2. 自动清理临时子容器卷:
    若确认子容器是父容器启动时临时创建的,且重启父容器会重新生成,可通过名称前缀或标签批量清理:

    # 删除所有名称含adoring_hellman的容器及其关联卷
    docker ps -a --filter "name=adoring_hellman" -q | xargs docker rm -v
    

四、Docker数据存储位置(自行编写脚本的基础)

Docker卷的元数据和实际数据默认存储在/var/lib/docker/volumes/:

  • 每个卷对应一个以卷ID/名称命名的目录
  • 卷的元数据存储在/var/lib/docker/volumes/<卷名>/config.json,包含创建时间、驱动类型等信息
  • 卷的实际数据在/var/lib/docker/volumes/<卷名>/_data目录

不建议直接修改或读取本地文件,更可靠的方式是使用Docker本地API(访问地址:unix:///var/run/docker.sock),示例调用:

# 获取所有卷的详细信息
curl --unix-socket /var/run/docker.sock http://localhost/v1.41/volumes
# 获取所有容器的信息(含停止状态)
curl --unix-socket /var/run/docker.sock http://localhost/v1.41/containers/json?all=true

通过API可安全、稳定地获取卷与容器的关联数据,适合编写自动化管理脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:01:03