1、命令总览
命令 | 作用 | 出现频率 | 备注 |
---|---|---|---|
★ docker volume create | 新建卷 | 高 | -d 指定驱动,-o 指定驱动选项 |
★ docker volume ls | 列出卷 | 高 | --filter dangling=true 查孤儿卷 |
★ docker volume inspect | 查看卷详情 | 高 | 输出 JSON,可加 --format |
★ docker volume rm | 删除卷 | 高 | 只能删已停止容器的卷 |
docker volume prune | 批量清理孤儿卷 | 中 | 危险操作,会二次确认 |
docker volume cp | 宿主机⇄卷 拷文件 | 低 | 需 24.0+ 的 CLI,等同于 docker cp |
docker volume update | 修改卷标签/驱动参数 | 低 | 仅少数驱动支持 |
docker volume use | 在 docker run 里使用卷 |
高 | 其实是 --mount 或 -v 的语法糖 |
卷与 bind mount 区别:卷由 Docker 管理,迁移/备份更方便;bind mount 直接映射宿主机路径,性能稍高但可移植性差。
2、docker volume create
用于在本地或远程驱动上“先创建、后使用”一个持久化卷;创建完即可通过 docker run -v
/ --mount
把卷挂载到容器中。
docker volume create [OPTIONS] [VOLUME_NAME]
选项 作用 示例 -d, --driver 指定卷驱动(默认 local) -d nfs
--label 加标签,便于过滤 --label env=prod
-o, --opt 驱动级参数 -o type=tmpfs -o device=tmpfs
docker volume create
├─ --driver , -d ⭕ 插件名(local|nfs|ceph|rbd|ebs|oss...)
├─ --name 卷名,省略时自动生成 ID
├─ --label ⭕ key=value 元数据,可多次出现
└─ --opt , -o ⭕ 驱动级键值对,出现次数不限
├─ 当 driver = local
│ ├─ type = none | bind | tmpfs | nfs | btrfs | ext4 | xfs ...
│ ├─ device = <路径|设备|远程地址>
│ ├─ o = <挂载选项字符串,逗号分隔>
│ │ ├─ 通用 : rw/ro, relatime, sync, uid=..., gid=..., size=...
│ │ ├─ nfs : addr=..., vers=3|4, proto=tcp|udp, timeo=600 ...
│ │ └─ tmpfs : size=100m, mode=1770, nr_inodes=1m ...
│ └─ 其他 local-only 键
│ ├─ size = 100m # 某些驱动支持配额
│ └─ keyfile = /path/key # 加密卷
└─ 当 driver ≠ local
├─ 各云厂商/分布式存储自有键
│ ├─ ebs : size, iops, type(gp2|io1), encrypted, kms-key-id ...
│ ├─ ceph/rbd : pool, image, user, secret ...
│ ├─ alicloud/oss : bucket, accesskeyid, accesskeysecret, region ...
│ └─ glusterfs : volid, servers, gid, uid, direct-mount-mode ...
└─ 任意自定义键(由第三方驱动文档定义)
# 创建名为 myvol 的本地卷
docker volume create myvol
# 验证
docker volume ls
docker volume inspect myvol
# 使用 vieux/sshfs 驱动,把远端目录挂成卷
docker volume create \
--driver vieux/sshfs \
--opt sshcmd=user@192.168.1.10:/data \
--opt password=secret \
sshfs-vol
# 一次性加多个标签
docker volume create \
--label project=blog \
--label env=staging \
blog-uploads
# 按标签过滤
docker volume ls --filter label=project=blog
# 创建 100 MB 的 tmpfs 卷(内存盘)
docker volume create \
--driver local \
--opt type=tmpfs \
--opt device=tmpfs \
--opt o=size=100m \
memvol
# 创建 ext4 格式的 loop 设备卷
docker volume create \
--driver local \
--opt type=none \
--opt o=bind \
--opt device=/dev/loop0 \
loopdisk
# 直接创建匿名卷(Docker 自动生成一串 ID 作为名字)
docker volume create
# 典型用法:docker run -v /data ... 会自动产生匿名卷
3、docker volume ls
# 简单列出所有卷
docker volume ls
# 只显示没有被任何容器引用的“孤儿卷”
docker volume ls --filter dangling=true
# 根据 label 过滤
docker volume ls --filter label=env=prod
# 按创建时间倒序
docker volume ls --format "table {{.Name}}\t{{.Driver}}\t{{.CreatedAt}}"
4、docker volume inspect
# 查看卷完整 JSON
docker volume inspect html
# 只取 Mountpoint 字段(宿主机目录)
docker volume inspect html \
--format '{{.Mountpoint}}'
# 同时查看多个卷
docker volume inspect html prod-data
5、docker volume rm
# 删除单个卷
docker volume rm html
# 强制删除多个卷(即使被引用也会报错)
docker volume rm prod-data logs
# 利用 xargs 批量删除孤儿卷
docker volume ls -q -f dangling=true | xargs docker volume rm
6、docker volume prune
# 交互式清理所有孤儿卷
docker volume prune
# 非交互(脚本里用)
docker volume prune -f
7、docker volume cp (CLI ≥ 24.0)
# 把宿主机文件拷进卷
echo "hello" > /tmp/index.html
docker volume cp /tmp/index.html html:/index.html
# 把卷里的目录拷回宿主机
docker volume cp html:/var/log/nginx ./logs
8、docker volume update
# 仅某些驱动支持,给卷追加标签
docker volume update prod-data --label-replace env=staging
9、在容器中使用卷(run / compose)
# 方式1:-v 简写(宿主机路径可省略,则自动用卷)
docker run -d \
--name web \
-v html:/usr/share/nginx/html \
nginx:alpine
# 方式2:--mount 更明确(推荐)
docker run -d \
--name db \
--mount type=volume,src=mysql-data,dst=/var/lib/mysql,volume-driver=local \
mysql:8
# 只读挂载
docker run -d \
--name app \
--mount type=volume,src=config,dst=/etc/app,readonly \
myapp:latest
# docker-compose.yml 示例
version: "3.9"
services:
api:
image: myapi
volumes:
- type: volume
source: uploads
target: /app/uploads
volume:
nocopy: true # 禁止初始化复制
volumes:
uploads:
driver: local
10、备份 & 恢复卷数据(经典方案)
# 备份:启动一个临时容器把卷打包
docker run --rm \
-v html:/data \
-v $(pwd):/backup \
alpine tar czf /backup/html-backup.tar.gz -C /data .
# 恢复:反向操作
docker run --rm \
-v html:/data \
-v $(pwd):/backup \
alpine sh -c "cd /data && tar xzf /backup/html-backup.tar.gz"