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 更明确,适合统一实践标准;
  • 卷是实现容器无状态、数据有状态的关键;
相关推荐
有梦想的攻城狮24 分钟前
spring中的@RabbitListener注解详解
java·后端·spring·rabbitlistener
Java水解28 分钟前
MySQL DQL全面解析:从入门到精通
后端·mysql
Aurora_NeAr29 分钟前
Apache Spark详解
大数据·后端·spark
程序员岳焱29 分钟前
Java 程序员成长记(二):菜鸟入职之 MyBatis XML「陷阱」
java·后端·程序员
hello早上好29 分钟前
BeanFactory 实现
后端·spring·架构
我命由我1234531 分钟前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
面朝大海,春不暖,花不开31 分钟前
Spring Boot消息系统开发指南
java·spring boot·后端
程序员岳焱33 分钟前
Java 程序员成长记(三):菜鸟入职之@Transactional「罢工」
java·后端·编程语言
hshpy33 分钟前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
Robin45843 分钟前
AI 应用使用 SSE 是什么?
后端