Docker 三种挂载:volume / bind mount / tmpfs 原理+区别+选型(入库完整版)
一、总览
三种挂载用来解决:容器读写层upper删容器即丢数据,把数据落地宿主机、持久化。
- volume(数据卷,docker管理):Docker统一管理目录,默认路径
/var/lib/docker/volumes/xxx/_data - bind mount(绑定挂载):自定义宿主机任意目录/文件 → 容器内路径
- tmpfs(内存挂载):数据放宿主机内存,断电/删容器全部丢失
二、1. volume(-v 卷名:容器路径)
1.命令示例
# 创建名为nginxvol的数据卷,挂载/usr/share/nginx/html
docker run -v nginxvol:/usr/share/nginx/html nginx
- 宿主机真实目录:
/var/lib/docker/volumes/nginxvol/_data - 由dockerd全权管理,用户尽量不要直接改底层目录
特点
- 自动创建目录,不用手动提前建宿主机文件夹;
- 不受宿主机目录权限、路径约束;
- 容器删除,volume保留,新容器可复用挂载;
- 支持
docker volume ls/rm/create生命周期管理; - 适合:业务持久化数据(mysql数据、应用日志)。
三、2. bind mount(-v 宿主机绝对路径:容器路径)
# 宿主机/opt/nginx/html映射容器/usr/share/nginx/html
docker run -v /opt/nginx/html:/usr/share/nginx/html nginx
特点
- 宿主机目录必须提前存在,不存在直接报错;
- 用户全权管控宿主机目录,可随意修改文件;
- 路径自由,任意目录/单个文件都能挂载;
- 容器删除,宿主机数据原样保留;
- 典型场景:本地开发代码热部署、配置文件挂载。
关键坑
宿主机空目录挂载容器非空目录:容器目录原有内容会被宿主机空目录覆盖。
四、3.tmpfs挂载(—tmpfs,内存盘)
docker run --tmpfs /tmp nginx
特点
- 数据只存在宿主机内存,不落地磁盘;
- 容器销毁、服务器重启数据全部清空;
- 无持久化,读写速度极高;
- 适用:临时缓存、会话临时文件、不需要落地的临时数据。
五、读写权限配置
:ro 只读挂载,容器内部无法修改挂载目录:
# 只读,容器不能改html文件
docker run -v nginxvol:/usr/share/nginx/html:ro nginx
六、三者横向对比表
| 类型 | 存储位置 | 生命周期 | 适用场景 |
|---|---|---|---|
| volume | /var/lib/docker/volumes | 独立于容器,删容器卷保留 | mysql、redis持久化 |
| bind mount | 用户自定义宿主机路径 | 完全由宿主机管理 | 配置挂载、本地开发 |
| tmpfs | 宿主机内存 | 容器停止数据丢失 | 临时缓存、临时文件 |
七、生产选型口诀
- 正式业务持久化 → volume
- 本地调试、挂载配置文件 → bind mount
- 临时高速缓存、不能落盘数据 → tmpfs
关联文档
- Docker 联合文件系统 — UnionFS 文件系统
- ../kubernetes/core/K8s 核心概念#💾 存储 — K8s 存储