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: myapivolumes:- type: volumesource: uploadstarget: /app/uploadsvolume: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"