开篇导读
你是否遇到过这些场景?
- 每次重启容器,数据都"清空"了?
- 容器内的数据怎么备份、迁移?
- 多个容器如何共享数据?
- 卷挂载是 -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 更明确,适合统一实践标准;
- 卷是实现容器无状态、数据有状态的关键;