Docker 学习| Docker 容器数据存储(数据卷 Volume)
前言
Docker 容器的文件系统是分层联合文件系统,容器层是可写层。 容器删除的时候,容器读写层里面的数据会全部丢失。为了实现数据持久化,需要使用数据卷,把数据保存到容器外部宿主机上。
容器层特点回顾: 镜像层全部只读;只有最上层容器读写层可修改;容器销毁,读写层数据跟着销毁。
一、为什么需要数据卷
- 容器删除,容器内部数据全部丢失,业务数据不能存在容器内部。
- 多个容器之间需要共享数据文件。
- 需要把宿主机的配置、日志、业务文件直接给到容器内部使用。
Docker 提供三种数据挂载方式:
- volume(数据卷):Docker 管理,
-v 卷名:/容器内路径 - bind mount(绑定挂载):直接映射宿主机指定目录,
-v /宿主机目录:/容器内路径 - tmpfs mount(内存挂载):数据存在宿主机内存,容器销毁数据消失。
二、Volume 数据卷(Docker 托管)
volume 是 Docker 专门管理的存储,数据存放在宿主机/var/lib/docker/volumes/目录,不需要我们手动写宿主机路径。
1. 常用命令
# 创建数据卷
docker volume create my‑vol
# 查看所有数据卷
docker volume ls
# 查看卷详细信息(挂载路径)
docker volume inspect my‑vol
# 删除未使用的数据卷
docker volume prune
# 删除指定数据卷
docker volume rm my‑vol
2. 容器挂载 volume 两种写法
方式 1:自动创建卷,没有就自动生成
docker run -d -v my‑vol:/usr/share/nginx/html nginx
如果
my‑vol不存在,docker run 会自动创建这个卷。
方式 2:先手动 create,再给容器使用
docker volume create my‑vol
docker run -d -v my‑vol:/usr/share/nginx/html nginx
✅ Volume 特点
- 由 Docker 统一管理,不用关心宿主机真实路径。
- 适合容器业务数据持久化(数据库数据、网站静态文件)。
- 支持多个容器同时挂载同一个卷,实现容器间数据共享。
- 删除容器,volume 数据不会自动删除,需要手动
docker volume rm。
⚠️注意:删除容器不会删除 volume,避免误丢业务数据;长期不用要手动清理。
三、Bind Mount 绑定挂载(直接映射宿主机目录)
直接把宿主机指定目录 / 文件映射到容器内部。 格式:-v 宿主机绝对路径:/容器内路径
# 把宿主机 /opt/nginx/html 映射到容器网页目录
docker run -d -v /opt/nginx/html:/usr/share/nginx/html nginx
✅ Bind Mount 特点
- 宿主机目录必须写绝对路径,写相对路径会被识别成 volume。
- 宿主机目录不存在,Docker 会自动创建宿主机文件夹。
- 适合场景:配置文件挂载、开发环境代码热更新,本地代码直接映射进容器。
- 完全受宿主机权限、目录结构控制,Docker 不管理这个目录。
⚠️风险:bind mount 直接操作宿主机真实目录,如果容器有漏洞,有可能读写、破坏宿主机系统文件。
四、tmpfs 内存挂载(临时内存存储)
数据只保存在宿主机内存中,不会写入磁盘。容器停止 / 销毁,数据立刻全部消失。
docker run -d --tmpfs /tmp nginx
适用场景:存放临时敏感数据、会话缓存,不需要落盘持久化。
五、读写权限控制 ro /rw
挂载的时候可以指定访问权限:
rw:读写(默认)容器可读可写挂载目录ro:read‑only,容器只读,只能宿主机修改,容器内不能写文件
示例:
# 数据卷,容器只读
docker run -d -v my‑vol:/html:ro nginx
# bind mount 只读挂载配置文件
docker run -d -v /opt/nginx/conf:/etc/nginx/conf.d:ro nginx
ro 常用场景:把配置文件给到容器,防止容器内部篡改配置。
六、三种挂载方式对比简表
表格
| 挂载类型 | 写法示例 | 存储位置 | 管理者 | 典型场景 |
|---|---|---|---|---|
| volume | ‑v volname:/container/path | /var/lib/docker/volumes | Docker 管理 | 数据库持久化、业务数据、多容器共享 |
| bind mount | ‑v /host/path:/container/path | 宿主机用户指定目录 | 用户自己管理 | 开发代码挂载、外部配置文件 |
| tmpfs | ‑‑tmpfs /container/path | 宿主机内存 | 内存临时存储 | 敏感临时数据,不持久化 |
七、数据卷容器(容器间数据共享)
可以创建一个专门的数据卷容器,其他容器通过--volumes‑from复用它的 volume,实现多个容器共享同一套数据。
# 创建数据卷容器,只提供卷,不需要运行业务
docker run --name data_container -v my‑vol:/data busybox
# 其他容器直接继承这个容器所有挂载
docker run -d --volumes‑from data_container nginx
docker run -d --volumes‑from data_container httpd
数据卷容器本身可以停止,只要 volume 还在,其他容器依旧可以读写数据。
八、数据备份与恢复
备份 volume 数据
启动临时容器,把 volume 里面的数据拷贝到宿主机
docker run --rm -v my‑vol:/source -v $(pwd):/backup busybox tar cvf /backup/vol_backup.tar /source
在当前目录生成 vol_backup.tar 备份包。
恢复数据到 volume
docker run --rm -v my‑vol:/target -v $(pwd):/backup busybox tar xvf /backup/vol_backup.tar -C /target
小结
- 容器读写层随容器删除而丢失,业务数据一定要用挂载持久化。
- volume 由 docker 管理,优先用于生产持久化业务数据;bind mount 适合开发、挂载外部配置。
- ro 参数实现只读挂载,保护配置不被容器篡改。
- volume 不会随容器删除自动删除,使用
docker volume prune清理闲置卷。 --volumes‑from实现多容器数据共享,可以做数据卷容器;支持 tar 备份恢复 volume。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Wzh5452830/article/details/165622076




