Docker 数据持久化:如何保存容器中的数据
方式是否持久是否推荐适用场景容器内部存储❌❌临时数据数据卷(Volumes)✅✅✅✅生产环境、数据库绑定挂载(Bind Mounts)✅✅开发环境、配置共享数据持久化不是可选项,而是使用 Docker 的基本功。只有掌握了它,你才能真正安全地运行数据库、文件服务等有状态应用。
概述
你有没有遇到过这种情况:
- 启动一个 MySQL 容器,存了数据
- 停止并删除容器
- 重新启动一个新容器,发现所有数据都没了
这不是 Bug,而是 Docker 的默认行为:
容器是“临时”的,里面的文件系统会随着容器的删除而消失
那怎么才能让数据“留下来”?
答案就是:Docker 数据持久化
为什么容器数据会丢失
Docker 容器使用的是联合文件系统(UnionFS),它的文件系统是“分层”的:
- 每次对容器的修改,都写在最上层的“可写层”
- 当容器被删除时,这一层也会被清除
所以:容器 ≠ 数据存储,它更像是一个“运行环境”。
Docker 数据持久化的三种方式
| 方式 | 适用场景 | 是否推荐 |
|---|---|---|
| 1. 数据卷(Volumes) | 数据库、配置文件 | ✅ 推荐 |
| 2. 绑定挂载(Bind Mounts) | 开发环境、共享本地文件 | ✅ |
| 3. 临时文件系统(tmpfs) | 敏感数据、内存存储 | ⚠️ 特定场景 |
我们重点介绍前两种
方式一、数据卷(Volumes)——推荐方式
数据卷是 Docker 管理的、专门用于持久化数据的机制,完全独立于容器生命周期
1. 创建数据卷
docker volume create mysql-data
2. 启动容器并挂载数据卷
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
关键参数:
-v mysql-data:/var/lib/mysql
表示:把名为mysql-data的数据卷,挂载到容器内的/var/lib/mysql目录
3. 验证数据持久化
# 删除容器
docker rm -f mysql
# 重新启动一个新容器,使用同一个数据卷
docker run -d \
--name mysql-new \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
你会发现,之前的数据依然存在
4. 管理数据卷
| 命令 | 说明 |
|---|---|
docker volume ls |
查看所有数据卷 |
docker volume inspect mysql-data |
查看数据卷详情 |
docker volume rm mysql-data |
删除数据卷(慎用!) |
docker volume prune |
清理未使用的数据卷 |
方式二、绑定挂载(Bind Mounts)——开发利器
绑定挂载是将宿主机的目录或文件直接挂载到容器中
场景:开发 Node.js 应用
你想在本地修改代码,容器内自动生效。
docker run -d \
--name myapp \
-p 3000:3000 \
-v /path/to/your/app:/app \
-v /app/node_modules \
my-node-app:1.0
/path/to/your/app:/app:本地代码同步到容器/app/node_modules:声明一个匿名卷,避免覆盖容器内的 node_modules
优点:
- 实时同步代码,无需重建镜像
- 适合本地开发
缺点:
- 依赖宿主机路径,可移植性差
- 权限问题可能较复杂
Docker Compose 中的数据持久化
在 docker-compose.yml 中配置更简单:
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- mysql-data:/var/lib/mysql # 使用命名卷
app:
build: .
ports:
- "3000:3000"
volumes:
- ./src:/app/src # 绑定挂载,用于开发
- node_modules:/app/node_modules # 避免覆盖依赖
volumes:
mysql-data:
node_modules:
运行:
docker compose up
所有数据卷自动创建和管理!
最佳实践
| 实践 | 说明 |
|---|---|
| 生产环境用数据卷 | 安全、可移植、易于备份 |
| 开发环境用绑定挂载 | 实时同步代码 |
| 不要在容器内存储重要数据 | 除非挂载了持久化存储 |
| 定期备份数据卷 | 使用 docker run --rm -v mysql-data:/data busybox tar c /data |
| 避免使用相对路径挂载 | 使用绝对路径或命名卷 |
常见问题
- 数据卷存储在宿主机哪里?
- Linux:
/var/lib/docker/volumes/ - Docker Desktop(Mac/Windows):在虚拟机内部,不直接暴露
👉 不要手动修改!使用 docker volume 命令管理。
- 如何迁移数据卷?
(1) 将数据卷内容打包:
(2) 在新机器上解包并恢复docker run --rm -v mysql-data:/data -v $(pwd):/backup busybox tar c /data > backup.tar
总结
| 方式 | 是否持久 | 是否推荐 | 适用场景 |
|---|---|---|---|
| 容器内部存储 | ❌ | ❌ | 临时数据 |
| 数据卷(Volumes) | ✅ | ✅✅✅ | 生产环境、数据库 |
| 绑定挂载(Bind Mounts) | ✅ | ✅ | 开发环境、配置共享 |
数据持久化不是可选项,而是使用 Docker 的基本功。
只有掌握了它,你才能真正安全地运行数据库、文件服务等有状态应用
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)