云中~头像
关注
Docker 存储深度解析|volume、bind mount、tmpfs 使用场景 + 对比封面图

Docker 存储深度解析|volume、bind mount、tmpfs 使用场景 + 对比

Docker 学习| Docker 容器数据存储(数据卷 Volume)

前言

Docker 容器的文件系统是分层联合文件系统,容器层是可写层。 容器删除的时候,容器读写层里面的数据会全部丢失。为了实现数据持久化,需要使用数据卷,把数据保存到容器外部宿主机上。

容器层特点回顾: 镜像层全部只读;只有最上层容器读写层可修改;容器销毁,读写层数据跟着销毁。

一、为什么需要数据卷

  1. 容器删除,容器内部数据全部丢失,业务数据不能存在容器内部。
  2. 多个容器之间需要共享数据文件。
  3. 需要把宿主机的配置、日志、业务文件直接给到容器内部使用。

Docker 提供三种数据挂载方式:

  1. volume(数据卷):Docker 管理,-v 卷名:/容器内路径
  2. bind mount(绑定挂载):直接映射宿主机指定目录,-v /宿主机目录:/容器内路径
  3. 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 特点

  1. 宿主机目录必须写绝对路径,写相对路径会被识别成 volume。
  2. 宿主机目录不存在,Docker 会自动创建宿主机文件夹。
  3. 适合场景:配置文件挂载、开发环境代码热更新,本地代码直接映射进容器。
  4. 完全受宿主机权限、目录结构控制,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/volumesDocker 管理数据库持久化、业务数据、多容器共享
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

小结

  1. 容器读写层随容器删除而丢失,业务数据一定要用挂载持久化
  2. volume 由 docker 管理,优先用于生产持久化业务数据;bind mount 适合开发、挂载外部配置。
  3. ro 参数实现只读挂载,保护配置不被容器篡改。
  4. volume 不会随容器删除自动删除,使用docker volume prune清理闲置卷。
  5. --volumes‑from实现多容器数据共享,可以做数据卷容器;支持 tar 备份恢复 volume。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/Wzh5452830/article/details/165622076

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--