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 更明确,适合统一实践标准;
  • 卷是实现容器无状态、数据有状态的关键;
相关推荐
提笔了无痕15 小时前
git基本了解、常用基本命令与使用
git·后端
java1234_小锋16 小时前
Spring IoC的实现机制是什么?
java·后端·spring
喵个咪16 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:JWT 集成指南
后端·go
绝不收费—免费看不了了联系我16 小时前
Fastapi的单进程响应问题 和 解决方法
开发语言·后端·python·fastapi
喵个咪16 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
后端·go
Victor35617 小时前
Netty(11) Netty的心跳机制是什么?为什么需要它?
后端
Victor35617 小时前
Netty(12)Netty支持哪些协议和传输方式?
后端
无限大617 小时前
为什么电脑需要"内存"和"硬盘"?——存储金字塔的秘密
后端
gwd20018 小时前
如何快速设置 Docker 代理设置
运维·人工智能·docker·容器
ovensi18 小时前
Docker+NestJS+ELK:从零搭建全链路日志监控系统
后端·nestjs