基础 简介:容器默认数据临时存储,删除容器数据即丢失,数据持久化是 Docker 生产部署的核心必备能力。本文聚焦 Docker 三大挂载方式,深度解析 Bind Mount、Volume、tmpfs 核心原理、优劣差异,全覆盖数据卷增删改查、备份迁移实操,落地 MySQL、Redis、MongoDB 数据库持久化案例,详解多容器数据共享方案,全程干货无废话,适配开发、部署、面试核心场景。
一、容器数据丢失问题根源(核心原理)
Docker 容器的文件系统采用分层读写机制,这是数据丢失的根本原因:
- 镜像为只读分层,所有基础文件、程序代码均固化在只读层,无法修改;
- 容器启动时,Docker 会在镜像只读层之上,叠加一层可读写容器层,容器运行中所有新增、修改、删除的文件数据,全部存储在该读写层;
- 核心致命规则:容器被删除(docker rm)时,顶层读写层会被彻底销毁,所有业务数据、日志、缓存数据永久丢失;仅停止容器(docker stop),数据会临时保留,重启后可恢复。
因此,默认容器完全不具备数据持久化能力,所有生产业务、数据库、缓存服务,必须通过挂载实现数据落地。
二、Docker 三种挂载方式深度对比(生产选型必看)
Docker 官方提供三种数据挂载方案,适配不同业务场景,三者底层实现、权限、隔离性、适用场景差异极大,生产环境优先选择 Volume 数据卷。
2.1 绑定挂载 Bind Mount
原理 :直接将宿主机指定目录 / 文件,精准挂载到容器内部指定路径,实现容器与宿主机目录双向绑定、实时同步。
核心特点:
- 依赖宿主机真实目录路径,路径固定、耦合性极强;
- 双向读写:容器修改文件,宿主机实时生效,反之亦然;
- 无隔离性,宿主机目录权限、文件变更会直接影响容器;
- 跨系统兼容性差,Windows、Mac、Linux 路径格式不统一,迁移成本高。
适用场景 :本地开发调试、代码热更新、临时文件同步。 生产缺点 :耦合严重、可移植性差、安全风险高,禁止生产使用。
2.2 数据卷 Volume(生产首选)
原理 :Docker 内核托管的独立存储目录,由 Docker 统一管理生命周期,存储在宿主机 Docker 专属目录(/var/lib/docker/volumes/),完全独立于容器与宿主机业务目录。
核心特点:
- 完全解耦:独立于容器,容器删除、重建、迁移,数据卷数据永久保留;
- 高隔离性:仅 Docker 进程可管理访问,不受宿主机目录权限干扰;
- 跨容器共享:支持多个容器挂载同一个数据卷,实现数据共享;
- 可移植性强:支持备份、迁移、恢复,跨环境适配无压力;
- 性能最优:Docker 内核优化 IO 读写,远超绑定挂载。
适用场景:所有生产业务、数据库持久化、缓存数据存储、日志持久化。
2.3 临时文件系统 tmpfs
原理 :挂载宿主机内存空间作为容器存储,所有数据仅存于内存,不落地磁盘。
核心特点:
- 速度极快,无磁盘 IO 损耗;
- 数据完全临时,容器停止、重启、宿主机重启,数据全部清空;
- 仅 Linux 环境支持,Windows/Mac 不兼容。
适用场景:临时敏感数据存储、高读写临时缓存、无需持久化的临时运算数据。
2.4 三种挂载方式终极选型总结
- 开发调试、代码热更 → Bind Mount
- 生产持久化、数据库、正式业务 → Volume(唯一首选)
- 临时缓存、敏感临时数据 → tmpfs
三、Docker 数据卷核心实操:创建、查看、挂载、删除、备份迁移
所有操作基于 Docker 原生命令,无第三方依赖,全程生产可用。
3.1 数据卷基础操作
1. 创建自定义数据卷
bash
# 创建指定名称数据卷
docker volume create mysql_data
2. 查看所有数据卷
bash
# 列出全部数据卷
docker volume ls
# 查看数据卷详细信息(存储路径、挂载状态、创建时间)
docker volume inspect mysql_data
3. 挂载数据卷启动容器
# 格式:-v 数据卷名:容器内挂载路径
docker run -d --name mysql-test -v mysql_data:/var/lib/mysql mysql:8.0
4. 删除无用数据卷
bash
# 删除指定未使用数据卷
docker volume rm mysql_data
# 批量清理所有未挂载的闲置数据卷(生产常用清理命令)
docker volume prune
3.2 数据卷备份与迁移(生产核心)
数据卷可跨容器、跨机器迁移,实现数据无缝迁移、灾备恢复。
1. 数据卷备份(打包为压缩文件)
bash
# 将mysql_data数据卷数据打包备份到宿主机当前目录
docker run --rm -v mysql_data:/source -v $(pwd):/backup alpine tar -zcvf /backup/mysql_backup.tar.gz -C /source .
2. 数据卷恢复
bash
# 解压备份文件至新数据卷
docker run --rm -v new_mysql_data:/target -v $(pwd):/backup alpine tar -zxvf /backup/mysql_backup.tar.gz -C /target
四、主流数据库容器持久化实战(MySQL/Redis/MongoDB)
基于 Volume 数据卷实现三大常用数据库持久化,容器删除重建后,数据完全不丢失,生产直接复用。
4.1 MySQL 持久化部署
bash
# 1. 创建数据卷
docker volume create mysql_volume
# 2. 挂载数据卷启动MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-v mysql_volume:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
mysql:8.0
验证逻辑:创建数据库、插入测试数据后,删除容器重新启动,数据完全保留。
4.2 Redis 持久化部署
bash
# 创建数据卷+启动Redis,持久化rdb/aof文件
docker volume create redis_volume
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_volume:/data \
--restart always \
redis:latest redis-server --appendonly yes
开启 AOF 持久化,结合数据卷落地,彻底解决 Redis 容器数据丢失问题。
4.3 MongoDB 持久化部署
bash
docker volume create mongo_volume
docker run -d \
--name mongodb \
-p 27017:27017 \
-v mongo_volume:/data/db \
--restart always \
mongo:latest
MongoDB 核心数据存储路径 /data/db 挂载数据卷,实现集合、文档数据永久持久化。
五、数据卷共享方案:多容器共用一份数据
Docker 支持多容器挂载同一个数据卷,实现容器间数据共享、文件同步,适用于多服务协同场景(日志收集、静态资源共享、配置文件同步)。
5.1 多容器数据共享实操
- 提前创建公共共享数据卷
bash
docker volume create public_share_data
- 多个容器依次挂载该数据卷
bash
# 容器1挂载共享卷
docker run -d --name web1 -v public_share_data:/app/share nginx
# 容器2挂载同一个共享卷
docker run -d --name web2 -v public_share_data:/app/share nginx
5.2 共享机制与注意事项
- 两个容器读写
/app/share路径为同一份数据,实时双向同步; - Docker 数据卷自带简单读写锁,避免基础文件冲突;
- 高并发写入场景,需业务层做锁控制,防止数据覆盖;
- 删除数据卷前,必须停止所有挂载容器,否则数据丢失。
5.3 适用业务场景
- 多服务统一日志存储、日志收集分析;
- 静态资源、配置文件统一共享;
- 微服务本地数据临时同步(简单场景)。