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 更明确,适合统一实践标准;
  • 卷是实现容器无状态、数据有状态的关键;
相关推荐
guo_wen_qiang2 小时前
mac中docker desktop服务端开启远程访问
运维·服务器·macos·docker
jyOverQ3 小时前
RabbitMQ 消息积压怎么办?Prefetch、消费者并发与扩容
分布式·后端·rabbitmq
Sayai3 小时前
Elasticsearch 9 安装验证实战:start-local 一键部署 + Docker 手动安装踩坑指南
大数据·elasticsearch·docker
名字还没想好☜9 小时前
Docker 容器安全加固实战:非 root、只读根文件系统、drop capabilities 与最小攻击面
运维·安全·docker·容器·kubernetes
码--到成功10 小时前
Docker、Kubernetes安装系列 二
docker·容器·kubernetes
东风破_10 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
M--Y11 小时前
Docker镜像与仓库管理详解
docker·容器
mohesashou11 小时前
k8s的service
云原生·容器·kubernetes
starzy199011 小时前
虚拟化解决方案全景:软件虚拟化、硬件虚拟化与 Docker 的位置
运维·docker·容器
行百里er12 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源