Docker 存储卷详解:数据持久化的正确打开方式

开篇导读

你是否遇到过这些场景?

  • 每次重启容器,数据都"清空"了?
  • 容器内的数据怎么备份、迁移?
  • 多个容器如何共享数据?
  • 卷挂载是 -v 还是 --mount,有什么区别?

本讲将带你全面掌握 Docker 中的三种数据持久化方式:绑定挂载、命名卷、数据卷容器,以及实战操作和适用场景,避免掉进"数据消失"的坑。


一、为什么需要持久化?

容器是短暂的,镜像也是无状态的。但实际开发中,我们需要持久化数据库、上传文件、日志等数据。

默认情况下,Docker 容器中的数据存储在 UnionFS 层中,容器一旦销毁,数据也随之丢失。

所以:数据必须存放在容器外部,才能实现容器无状态,数据有状态。


二、Docker 的三种持久化方式

1️⃣ Bind Mount(绑定挂载)

将主机上的某个目录或文件,挂载到容器内路径。

bash 复制代码
docker run -v /host/data:/container/data nginx

特点:

  • 主机文件系统 → 容器内部映射
  • 适合开发环境(代码热更新)
  • 安全性 & 可控性较弱

✅ 实战应用:

bash 复制代码
docker run -d \
  -v $(pwd)/html:/usr/share/nginx/html \
  nginx

此命令可将本地 HTML 文件实时映射到 Nginx 容器,热更新生效。


2️⃣ Named Volume(命名卷)

由 Docker 管理的数据卷,通过 docker volume 命令管理。

bash 复制代码
docker volume create mydata
docker run -v mydata:/data nginx

特点:

  • 位置由 Docker 管理(如 /var/lib/docker/volumes)
  • 可重复使用和共享
  • 适合生产环境
  • 更安全、更标准

✅ 查看命名卷内容:

bash 复制代码
docker volume inspect mydata

3️⃣ Volume Container(数据卷容器)【已不常用】

通过一个中间容器专门保存数据,再被其他容器挂载使用。

bash 复制代码
docker create -v /data --name datacontainer busybox
docker run --volumes-from datacontainer nginx

特点:

  • 老版本 Docker 中的数据共享方式
  • 被 named volume 所取代

三、--mount VS -v 的区别

Docker 支持两种挂载语法:

✅ -v(早期语法)

bash 复制代码
docker run -v /host:/container nginx

✔ 简洁但语义不清晰,不支持所有类型。


✅ --mount(推荐语法)

bash 复制代码
docker run \
  --mount type=bind,source=/host,target=/container \
  nginx

✔ 明确指定挂载类型(bind/volume/tmpfs),语义清晰,可扩展性强。


四、多容器数据共享实战

使用命名卷实现容器数据共享:

bash 复制代码
docker volume create shared
docker run -d --name app1 -v shared:/data busybox
docker run -it --name app2 -v shared:/data busybox

现在 app1 和 app2 可共享 /data 下内容,实现数据协同。


五、容器存储卷的安全建议

  • 不建议将系统关键目录(如 /etc)直接绑定挂载
  • 使用命名卷,避免权限问题
  • 避免将敏感信息硬编码到容器中,应借助挂载或 secret 管理
  • 在 Kubernetes 中,使用 PVC(持久化卷声明)代替 Docker 卷

六、三种卷模式对比

类型 管理方 使用方式 持久化 推荐使用场景
Bind Mount 用户自管 映射主机目录 本地开发、调试
Named Volume Docker 管理 自动创建卷 生产环境、通用
Data Volume 容器 Docker+用户 多容器共享(旧) 已被淘汰,了解即可

七、本讲总结

  • Docker 提供三种挂载机制,适用于不同场景;
  • 推荐在生产中使用命名卷,安全、可控;
  • --mount 更明确,适合统一实践标准;
  • 卷是实现容器无状态、数据有状态的关键;
相关推荐
哈喽姥爷30 分钟前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
舒一笑2 小时前
为什么where=Version就是乐观锁了?
后端·mysql·程序员
Davie_Liu2 小时前
【Docker Buildx】docker buildx本地构建多架构镜像,拉取镜像时的网络延迟问题(已解决)
网络·docker·buildx
GoGeekBaird2 小时前
关于垂类AI应用落地行业的方法论思考
后端·github·agent
小宁爱Python2 小时前
Django 基础入门:命令、结构与核心配置全解析
后端·python·django
_Walli_2 小时前
k8s集群搭建(三)-------- Dashboard UI
云原生·容器·kubernetes
你的人类朋友3 小时前
认识一下Bcrypt哈希算法
后端·安全·程序员
tangweiguo030519873 小时前
基于 Django 与 Bootstrap 构建的现代化设备管理平台
后端·django·bootstrap
IT果果日记3 小时前
详解DataX开发达梦数据库插件
大数据·数据库·后端
dazhong20124 小时前
Spring Boot 项目新增 Module 完整指南
java·spring boot·后端