github编辑

8.1 数据卷

8.1.1 为什么需要数据卷

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

spinner

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


8.1.2 数据卷的特性

特性
说明

持久化

容器删除后数据仍然保留

共享

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

即时生效

对数据卷的修改立即可见

不影响镜像

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

性能更好

绕过 UnionFS,直接读写


8.1.3 数据卷 vs 容器存储层

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

spinner

数据卷 (推荐)

spinner

8.1.4 数据卷基本操作

创建数据卷

列出所有数据卷

查看数据卷详情

关键字段

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

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


8.1.5 挂载数据卷

方式一:--mount (推荐)

参数说明

参数
说明

source

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

target

容器内挂载路径

readonly

可选,只读挂载

方式二:-v (简写)

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

两种方式对比

特性
--mount
-v

语法

键值对,更清晰

冒号分隔,更简洁

自动创建卷

source 不存在会自动创建

自动创建

推荐程度

✅ 推荐 (更明确)

常用 (更简洁)

提示:很多人误以为 --mount 遇到目标不存在时总是报错。实际上,那仅适用于绑定挂载 (Bind Mount)。对于数据卷 (Volume),只要 source 指定的卷名称不存在,Docker 都会默默将其创建出来。

只读挂载


8.1.6 使用场景示例

场景一:数据库持久化

场景二:多容器共享数据

场景三:配置文件持久化


8.1.7 数据卷管理

删除数据卷

清理未使用的数据卷

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


8.1.8 数据卷备份与恢复

备份数据卷

原理

  1. 创建临时容器

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

  3. 挂载当前目录到 /backup

  4. 使用 tar 打包

恢复数据卷

备份脚本示例


8.1.9 数据卷 vs 绑定挂载

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

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

管理方式

Docker 管理

用户管理

存储位置

/var/lib/docker/volumes/

任意宿主机路径

可移植性

更好

依赖宿主机路径

适用场景

生产数据持久化

开发时同步代码

备份

需要工具

直接访问文件

详见绑定挂载章节。


8.1.10 常见问题

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. 在目标机器恢复


最后更新于