Docker 数据持久化
理解容器文件系统的特点与问题
掌握三种数据存储方式的原理与用法
能根据场景选择合适的持久化方案
核心讲解
容器的文件系统是临时的,容器删除了,里面的数据就没了。需要持久化的数据(数据库数据、配置、上传文件等)必须存到宿主机上。
容器自己的文件系统
核心讲解
Docker 用联合文件系统(UnionFS),镜像是只读的多层,容器启动后在上面加一层可写层。
特点:容器内所有修改都在可写层,不影响镜像
问题:容器删除,可写层一起删除,数据永久丢失
适用:临时文件、缓存、不需要保存的数据
性能:分层结构,写入性能有损耗
Docker Volume(数据卷)
核心讲解
Docker 官方推荐的持久化方式,由 Docker 管理的一块宿主机磁盘区域,挂载到容器里。
特点:Docker 统一管理,和容器生命周期解耦,容器删除卷还在
优势:性能好、移植方便、支持卷驱动、可以多个容器共享
适用:生产环境数据库数据、应用数据持久化
操作:
创建卷:
docker volume create 卷名挂载:
-v 卷名:容器内路径查看卷:
docker volume ls删除卷:
docker volume rm 卷名
Bind Mount(绑定挂载)
核心讲解
直接把宿主机上的具体目录 / 文件,挂载到容器里。
特点:直接映射宿主文件,容器里改了宿主立刻变,宿主改了容器也立刻变
优势:非常灵活,想挂哪里挂哪里,开发环境方便
劣势:路径依赖宿主系统,移植性差,权限容易出问题
适用:开发环境、配置文件挂载、大量数据交换
操作:
-v 宿主机绝对路径:容器内路径
三种方式对比
表格
对比维度 | 容器内文件系统 | Docker Volume | Bind Mount |
|---|---|---|---|
持久化 | ❌ 删容器就没 | ✅ 独立保存 | ✅ 独立保存 |
管理方式 | 容器管理 | Docker 管理 | 用户自己管理 |
移植性 | - | 好,不依赖宿主路径 | 差,绑定宿主路径 |
性能 | 一般 | 好 | 接近原生 |
权限问题 | 无 | 少 | 多,容易出现权限不匹配 |
适用场景 | 临时数据、缓存 | 生产环境数据持久化 | 开发环境、配置文件 |
操作示例
# ===== 1. Volume 方式 =====
# 创建数据卷
docker volume create nginx-data
# 查看卷
docker volume ls
# 挂载卷到容器
docker run -d --name nginx-v \
-v nginx-data:/usr/share/nginx/html \
nginx
# 容器删除,卷还在
docker rm -f nginx-v
docker volume ls # nginx-data还在
# ===== 2. Bind Mount 方式 =====
# 宿主目录挂载到容器
mkdir /opt/nginx-html
echo "hello bind mount" > /opt/nginx-html/index.html
docker run -d --name nginx-b \
-v /opt/nginx-html:/usr/share/nginx/html \
-p 8080:80 \
nginx
# 验证:访问页面显示hello bind mount
# 修改宿主文件,容器里立刻生效
echo "update" >> /opt/nginx-html/index.html
# ===== 3. 查看挂载信息 =====
docker inspect nginx-b
# Mounts字段可以看到挂载详情
常见误区
容器删了数据还在就不用备份:卷在宿主机上,但也会坏,重要数据还是要备份
-v 后面写相对路径:Bind Mount 必须是绝对路径,相对路径会被当成卷名
Volume 可以直接看文件:卷存在 Docker 管理的目录里,不要直接去编辑,通过容器操作
数据库容器不持久化:数据库一定要挂载卷,不然容器删了数据全没了
课后练习
用 Volume 方式启动一个 mysql 容器,持久化数据
用 Bind Mount 方式,把本地的配置文件挂载到 nginx 容器
删除容器,验证数据卷还存在
对比三种方式,分别说明一个适合的场景

