目录
Docker Volume 教程:创建、列出、检查和删除 Volume
docker volume 用于管理 Volume。Volume 的概念和用法见 Volume 与数据持久化。
子命令
| 命令 | 说明 | 常用参数 |
|---|---|---|
docker volume create [名称] | 创建 Volume(不指定名称会生成随机名称) | --label 键=值、-d 驱动程序、-o 选项 |
docker volume ls | 列出 Volume | -f 筛选条件、-q 只列出名称、--format |
docker volume inspect 名称 | 显示详细信息 | -f 模板 |
docker volume rm 名称... | 删除 Volume(正在使用的 Volume 无法删除) | -f |
docker volume prune | 删除未使用的匿名 Volume | -a 包含具名 Volume、-f 不确认、--filter |
docker volume ls -f 的筛选条件:dangling=true(没有被任何容器使用)、name=部分名称、label=键=值、driver=local。
创建、写入和读取
$ docker volume create mydata
mydata
$ docker volume ls
DRIVER VOLUME NAME
local 2bc47e5efc92fb9cbc751a0d25853c6c800d4e4806c256fb7d68fa9dff112fcd
local 6729482c30a3f652c14f542c6f341c811f087fc9626efcfdf00a49a5ae721e2c
local 78297657b68403b39f39940496ce3faf49e6257a11d5103d043077a36261236a
local a23af26d1da49e018edecb6e29f9be3875fb02e8c50510a40fbb5cf49da94f81
local mydata
$ docker volume inspect mydata
[
{
"CreatedAt": "2026-10-13T05:28:56Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mydata/_data",
"Name": "mydata",
"Options": null,
"Scope": "local"
}
]
$ docker run --rm -v mydata:/data alpine:3.23 sh -c "echo saved > /data/a.txt"
$ docker run --rm -v mydata:/data alpine:3.23 cat /data/a.txt
saved
ls中除了mydata,还有几个长串名称的匿名 Volume,它们是先前的容器留下的(例如postgres镜像的VOLUME声明会自动创建 Volume)。inspect中的Mountpoint是数据在 Docker 主机上的实际位置。- 两个不同的容器先后挂载
mydata,第二个容器读到了第一个容器写入的文件:数据保存在 Volume 中,与容器无关。
查找并清理悬空 Volume
$ docker run --rm -v /tmpdata alpine:3.23 true
$ docker volume ls -f dangling=true
DRIVER VOLUME NAME
local 2bc47e5efc92fb9cbc751a0d25853c6c800d4e4806c256fb7d68fa9dff112fcd
local 6729482c30a3f652c14f542c6f341c811f087fc9626efcfdf00a49a5ae721e2c
local 78297657b68403b39f39940496ce3faf49e6257a11d5103d043077a36261236a
local a23af26d1da49e018edecb6e29f9be3875fb02e8c50510a40fbb5cf49da94f81
local mydata
$ docker volume prune -f
Deleted Volumes:
a23af26d1da49e018edecb6e29f9be3875fb02e8c50510a40fbb5cf49da94f81
6729482c30a3f652c14f542c6f341c811f087fc9626efcfdf00a49a5ae721e2c
78297657b68403b39f39940496ce3faf49e6257a11d5103d043077a36261236a
2bc47e5efc92fb9cbc751a0d25853c6c800d4e4806c256fb7d68fa9dff112fcd
Total reclaimed space: 348.9MB
-v /tmpdata只指定容器内的路径,没有指定名称,因此会创建匿名 Volume;删除容器时,--rm会一并删除它。dangling=true会列出所有当前没有容器使用的 Volume,包括具名的mydata。prune -f只删除了 4 个匿名 Volume,回收了 348.9 MB;具名的mydata得以保留。
标签
$ docker volume create --label env=dev tagged
tagged
$ docker volume ls -f label=env=dev
DRIVER VOLUME NAME
local tagged
$ docker volume rm mydata tagged
mydata
tagged
为 Volume 添加标签,便于按项目或环境筛选和清理,例如 docker volume prune --filter label=env=dev。
相关章节
动手练习
练习:创建一个带有 project=demo 标签的 Volume,然后用一条命令删除所有带此标签且未被使用的 Volume(包括具名 Volume)。
答案
docker volume create --label project=demo demo_data
docker volume prune -a -f --filter label=project=demo
-a 会将具名 Volume 也纳入删除范围,--filter 则限定只删除带有此标签的 Volume。
常见问题
一定要先运行 docker volume create 吗?
不用。docker run -v 名称:/路径 使用不存在的 Volume 时会自动创建。先创建的好处是可以添加标签或驱动程序选项。
docker volume prune 会删除我的数据库吗?
Docker 23 之后,docker volume prune 只删除**没有被任何容器使用的匿名 Volume**,不会删除具名 Volume。只有 docker volume prune -a 才会删除未使用的具名 Volume,实测见 [清理硬盘空间](/zh/docker/cleanup/)。
如何备份 Volume?
使用一个临时容器,同时挂载 Volume 和主机文件夹,再用 tar 打包,示例见 [Volume 与数据持久化](/zh/docker/volumes/)。
更新于 2026年10月14日