4、docker数据卷管理命令 | docker volume

发布于:2025-08-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

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"


网站公告

今日签到

点亮在社区的每一天
去签到