Docker 数据卷管理速查表 — 持久化数据与存储
容器本质上是临时的——停止后数据会丢失。数据卷和绑定挂载让你持久化数据、在容器间共享文件,并独立于容器生命周期管理存储。
快速参考
| 场景 | 命令 |
| 列出所有数据卷 | docker volume ls |
| 创建数据卷 | docker volume create my-data |
| 查看数据卷详情 | docker volume inspect my-data |
| 删除数据卷 | docker volume rm my-data |
| 清理未使用的卷 | docker volume prune |
| 挂载数据卷运行容器 | docker run -v my-data:/app/data nginx |
| 绑定宿主机目录 | docker run -v $(pwd):/app nginx |
| 只读挂载 | docker run -v my-data:/app/data:ro nginx |
数据卷 vs 绑定挂载
| 特性 | 数据卷 (Volume) | 绑定挂载 (Bind Mount) |
| Docker 管理 | ✅ 是 | ❌ 否 |
| 存储位置 | /var/lib/docker/volumes/ | 宿主机任意路径 |
| 备份恢复 | 简单(docker CLI) | 手动 |
| 跨主机移植 | ✅ 是 | ❌ 依赖路径 |
| 开发热重载 | ❌ | ✅ 宿主编辑即时同步 |
| 推荐用途 | 生产数据、数据库 | 开发配置、配置文件 |
核心命令详解
### 管理数据卷
``bash
# 创建命名数据卷
docker volume create postgres-data
# 列出数据卷 docker volume ls
# 查看详情 docker volume inspect postgres-data
# 删除数据卷(容器不能正在使用) docker volume rm postgres-data
# 清理所有未使用的数据卷
docker volume prune
`
### 在容器中使用数据卷
`bash
# 命名数据卷——Docker 管理存储位置
docker run -d --name db -v postgres-data:/var/lib/postgresql/data postgres:16
# 匿名数据卷——Docker 自动生成随机名称 docker run -d -v /var/lib/postgresql/data postgres:16
# 只读数据卷(容器不能写入) docker run -d -v config-data:/etc/nginx/conf.d:ro nginx
# 多数据卷
docker run -d \
-v app-data:/app/data \
-v config-data:/etc/nginx/conf.d:ro \
nginx
`
### 绑定挂载
`bash
# 挂载当前目录到容器的 /app
docker run -v $(pwd):/app node:20 npm run dev
# 只读绑定 docker run -v $(pwd):/app:ro node:20 npm test
# 指定绝对路径
docker run -v /home/user/project:/app node:20 npm start
`
### 备份与恢复
`bash
# 备份数据卷到 tar 文件
docker run --rm \
-v my-volume:/source \
-v $(pwd):/backup \
alpine tar czf /backup/my-volume-backup.tar.gz -C /source .
# 从 tar 文件恢复数据卷 docker run --rm \ -v my-volume:/target \ -v $(pwd):/backup \ alpine tar xzf /backup/my-volume-backup.tar.gz -C /target ``
数据卷(23)
| 命令 | 难度 | ||
|---|---|---|---|
docker volume create创建一个新的卷 | 基础 | docker volume create my-volume | |
docker volume ls列出所有卷 | 基础 | docker volume ls | |
docker volume inspect查看卷的详细信息 | 基础 | docker volume inspect my-volume | |
docker volume rm删除一个或多个卷 | 基础 | docker volume rm my-volume | |
docker volume prune删除所有未使用的卷 | 高级 | docker volume prune | |
docker run -v使用卷挂载运行容器 | 中级 | docker run -v my-volume:/data nginx | |
docker run --mount使用高级挂载选项运行容器 | 高级 | docker run --mount type=volume,source=my-volume,target=/data nginx | |
docker volume --help显示 docker volume 帮助信息 | 基础 | docker volume --help | |
docker volume create --driver使用指定驱动创建卷 | 中级 | docker volume create --driver local my-volume | |
docker volume create --label创建卷并添加标签 | 中级 | docker volume create --label env=prod --label app=db my-volume | |
docker volume create -o type=btrfs创建卷并指定文件系统类型 | 高级 | docker volume create -o type=btrfs -o device=/dev/sdb my-volume | |
docker volume ls -q仅显示卷名称 | 基础 | docker volume ls -q | |
docker volume ls --filter按条件过滤列出卷 | 中级 | docker volume ls --filter label=env=prod | |
docker volume inspect --format自定义查看卷信息格式 | 高级 | docker volume inspect --format '{{.Name}} {{.Driver}} {{.Mountpoint}}' my-volume | |
docker volume prune -f静默删除所有未使用的卷 | 基础 | docker volume prune -f | |
docker volume prune --filter按条件删除未使用的卷 | 高级 | docker volume prune --filter "label!=keep" --filter "until=24h" | |
docker run -v (bind mount)使用主机目录绑定挂载运行容器 | 中级 | docker run -v /host/path:/container/path nginx | |
docker run -v $(pwd):/app将当前目录挂载到容器中(开发热重载) | 基础 | docker run -v $(pwd):/app -w /app node:20 node server.js | |
docker run --mount type=bind使用 --mount 语法进行绑定挂载 | 中级 | docker run --mount type=bind,source=/host/path,target=/container/path nginx | |
docker run --mount type=tmpfs使用 tmpfs 挂载运行容器(内存中) | 高级 | docker run --mount type=tmpfs,target=/cache,tmpfs-size=100m nginx | |
docker run --mount type=volume,readonly使用只读卷挂载运行容器 | 中级 | docker run --mount type=volume,source=my-volume,target=/data,readonly nginx | |
docker run --mount type=volume,volume-driver使用第三方卷驱动运行容器 | 高级 | docker run --mount type=volume,source=my-volume,target=/data,volume-driver=vieus/sshfs nginx | |
docker run --mount type=volume,volume-opt使用卷驱动选项运行容器 | 高级 | docker run --mount type=volume,source=myshare,target=/data,volume-driver=nfs,volume-opt=addr=10.0.0.1,volume-opt=nfsvers=4 nginx |