github编辑

数据卷

为什么需要数据卷

容器的存储层有一个关键问题:容器删除后,数据就没了

spinner

数据卷(Volume)解决了这个问题,它的生命周期独立于容器。


数据卷的特性

特性
说明

持久化

容器删除后数据仍然保留

共享

多个容器可以挂载同一个数据卷

即时生效

对数据卷的修改立即可见

不影响镜像

数据卷中的数据不会打包进镜像

性能更好

绕过 UnionFS,直接读写


数据卷 vs 容器存储层

容器存储层(不推荐存储重要数据)

spinner

数据卷(推荐)

spinner

数据卷基本操作

创建数据卷

列出所有数据卷

查看数据卷详情

关键字段

  • Mountpoint:数据卷在宿主机上的实际存储位置

  • Driver:存储驱动(默认 local,也可以用第三方驱动)


挂载数据卷

方式一:--mount(推荐)

参数说明

参数
说明

source

数据卷名称(不存在会自动创建)

target

容器内挂载路径

readonly

可选,只读挂载

方式二:-v(简写)

格式-v 数据卷名:容器路径[:选项]

两种方式对比

特性
--mount
-v

语法

键值对,更清晰

冒号分隔,更简洁

自动创建卷

source 不存在会报错

自动创建

推荐程度

✅ 推荐(更明确)

常用(更简洁)

只读挂载


使用场景示例

场景一:数据库持久化

场景二:多容器共享数据

场景三:配置文件持久化


数据卷管理

删除数据卷

清理未使用的数据卷

⚠️ 注意:数据卷不会自动垃圾回收。长期运行的系统应定期清理无用数据卷。


数据卷备份与恢复

备份数据卷

原理

  1. 创建临时容器

  2. 挂载要备份的数据卷到 /source

  3. 挂载当前目录到 /backup

  4. 使用 tar 打包

恢复数据卷

备份脚本示例


数据卷 vs 绑定挂载

Docker 有两种主要的数据持久化方式:

特性
数据卷 (Volume)
绑定挂载 (Bind Mount)

管理方式

Docker 管理

用户管理

存储位置

/var/lib/docker/volumes/

任意宿主机路径

可移植性

更好

依赖宿主机路径

适用场景

生产数据持久化

开发时同步代码

备份

需要工具

直接访问文件

详见 绑定挂载 章节。


常见问题

Q: 如何知道容器使用了哪些数据卷?

Q: 数据卷的数据在哪里?

⚠️ 注意:不建议直接修改 Mountpoint 中的文件,应通过容器操作。

Q: 如何在不同机器间迁移数据卷?

  1. 在源机器备份:docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/data.tar.gz -C /data .

  2. 传输 tar.gz 文件

  3. 在目标机器恢复


本章小结

操作
命令

创建数据卷

docker volume create name

列出数据卷

docker volume ls

查看详情

docker volume inspect name

删除数据卷

docker volume rm name

清理未用

docker volume prune

挂载数据卷

-v name:/path--mount source=name,target=/path

延伸阅读

最后更新于