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 更明确,适合统一实践标准;
  • 卷是实现容器无状态、数据有状态的关键;
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端