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

三、核心区别对比

  1. 归属:volume 归 Docker 管理;bind mount 是宿主机真实目录。
  2. 跨平台:volume 与宿主机路径解耦,Windows、Mac、Linux 都能用;bind mount 强依赖宿主机目录。
  3. 性能:volume 由 Docker 优化,大数据量、数据库推荐用卷;bind mount 在共享代码目录时很方便。
  4. 迁移备份:volume 可用 docker volume 命令和内置备份工具操作;bind mount 直接用宿主机工具拷目录。
  5. 容器间共享:多个容器挂同一个 volume 很容易;bind mount 也行但受目录权限限制。

四、怎么选

  • 数据库、持久化业务数据:用 volume,稳定可移植。
  • 开发时代码热更新、配置文件外挂:用 bind mount,改宿主机文件容器立刻生效。
  • 只存临时内存数据:用 tmpfs,重启即消。

五、常见坑

  1. bind mount 路径写错,容器启动报 No such file or directory,先确认宿主机目录存在。
  2. 宿主机目录属主是普通用户,容器内进程以 root 写文件导致权限拒绝。
  3. 用 -v 时前面路径不存在,Docker 在 Linux 会自动当成卷创建,造成预期外行为,绑定挂载前先 mkdir。
  4. 删容器时没加 -v,volume 不会随容器删除,长期堆积占磁盘,定期 docker volume prune 清理。
  5. Windows/Mac 挂载宿主机目录性能差,数据库不要用 bind mount。
  6. 混淆大小写路径,source 和 target 写反导致挂载点不对。

总结

持久化业务数据选 volume,交给 Docker 管理、跨平台好迁移;开发调试外挂代码和配置选 bind mount,直接映射宿主机目录。记牢:数据库用卷、代码用挂载,删容器前想清楚卷要不要一起删。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-11-15 07:31 
'); })();