Docker数据卷与挂载目录区别详解
容器是临时的,删容器数据就没了,所以持久化必须靠挂载。Docker 提供三种存数据的方式:数据卷(volume)、绑定挂载(bind mount)和 tmpfs。新手最容易混淆 volume 和 bind mount,选错会导致权限乱、迁移难、数据丢失。本文讲清两者区别、适用场景和命令写法。
一、数据卷 volume(推荐)
由 Docker 自己管理,存放在 Docker 的目录下(Linux 一般在 /var/lib/docker/volumes/),完全脱离宿主机目录结构。
创建并运行:
# 创建命名卷
docker volume create mydata
# 挂载到容器
docker run -d -v mydata:/var/lib/mysql mysql:8.0
也可以直接在 run 时让 Docker 自动建卷:
docker run -d -v mysql_data:/var/lib/mysql mysql:8.0
查看卷、删除卷:
docker volume ls
docker volume inspect mydata
docker volume rm mydata
二、绑定挂载 bind mount
直接把宿主机上的某个真实目录或文件挂进容器,路径由你指定:
docker run -d -v /home/www/html:/usr/share/nginx/html nginx
也可以用新版 --mount 写法,更清晰:
docker run -d \
--mount type=bind,source=/home/www/html,target=/usr/share/nginx/html \
nginx
三、核心区别对比
- 归属:volume 归 Docker 管理;bind mount 是宿主机真实目录。
- 跨平台:volume 与宿主机路径解耦,Windows、Mac、Linux 都能用;bind mount 强依赖宿主机目录。
- 性能:volume 由 Docker 优化,大数据量、数据库推荐用卷;bind mount 在共享代码目录时很方便。
- 迁移备份:volume 可用 docker volume 命令和内置备份工具操作;bind mount 直接用宿主机工具拷目录。
- 容器间共享:多个容器挂同一个 volume 很容易;bind mount 也行但受目录权限限制。
四、怎么选
- 数据库、持久化业务数据:用 volume,稳定可移植。
- 开发时代码热更新、配置文件外挂:用 bind mount,改宿主机文件容器立刻生效。
- 只存临时内存数据:用 tmpfs,重启即消。
五、常见坑
- bind mount 路径写错,容器启动报 No such file or directory,先确认宿主机目录存在。
- 宿主机目录属主是普通用户,容器内进程以 root 写文件导致权限拒绝。
- 用
-v时前面路径不存在,Docker 在 Linux 会自动当成卷创建,造成预期外行为,绑定挂载前先 mkdir。 - 删容器时没加
-v,volume 不会随容器删除,长期堆积占磁盘,定期docker volume prune清理。 - Windows/Mac 挂载宿主机目录性能差,数据库不要用 bind mount。
- 混淆大小写路径,
source和target写反导致挂载点不对。
总结
持久化业务数据选 volume,交给 Docker 管理、跨平台好迁移;开发调试外挂代码和配置选 bind mount,直接映射宿主机目录。记牢:数据库用卷、代码用挂载,删容器前想清楚卷要不要一起删。
遇到问题加QQ23979811 协助处理