
🍃 予枫 :个人主页
📚 个人专栏 : 《Java 从入门到起飞》《读研码农的干货日常》
💻 Debug 这个世界,Return 更好的自己!
引言
做Docker开发的同学,大概率踩过这样的坑:辛辛苦苦部署的MySQL容器,随手rm删除后,里面的数据库、表数据直接清零,几天的工作量付诸东流😭。其实核心问题就是没做好数据持久化,而Volume正是Docker官方推荐的最优解决方案。本文从Volume与Bind Mount的核心区别入手,结合MySQL容器实战,手把手教你实现"删容器不删数据",新手也能轻松上手,建议点赞收藏,避免踩坑!
文章目录
- 引言
- [一、VOLUME VS BIND MOUNT:核心区别拆解](#一、VOLUME VS BIND MOUNT:核心区别拆解)
-
- [1.1 核心定义(通俗好懂)](#1.1 核心定义(通俗好懂))
- [1.2 关键区别(表格对比,一目了然)](#1.2 关键区别(表格对比,一目了然))
- [1.3 一句话总结](#1.3 一句话总结)
- 二、实战:MYSQL容器数据持久化(删除容器不丢数)
-
- [2.1 前置准备](#2.1 前置准备)
- [2.2 步骤1:创建自定义Volume(推荐)](#2.2 步骤1:创建自定义Volume(推荐))
- [2.3 步骤2:启动MySQL容器,挂载Volume](#2.3 步骤2:启动MySQL容器,挂载Volume)
- [2.4 步骤3:验证MySQL容器正常运行](#2.4 步骤3:验证MySQL容器正常运行)
- [2.5 步骤4:向MySQL插入测试数据](#2.5 步骤4:向MySQL插入测试数据)
- [2.6 步骤5:删除容器,验证数据是否保留](#2.6 步骤5:删除容器,验证数据是否保留)
- [2.7 实战总结(重点记)](#2.7 实战总结(重点记))
- 三、结尾总结
一、VOLUME VS BIND MOUNT:核心区别拆解
容器本身是临时的,一旦删除,容器内的所有数据都会随之消失------这就是数据持久化要解决的核心问题。Docker中实现数据持久化主要有两种方式:Volume(数据卷)和Bind Mount(挂载主机目录),很多新手容易混淆两者,今天一次性讲透它们的区别、适用场景,再也不搞混!
1.1 核心定义(通俗好懂)
- Volume(数据卷):Docker专门为容器设计的"数据存储目录",由Docker引擎统一管理,独立于容器生命周期,就算容器删除,Volume依然存在,数据不会丢失。
- Bind Mount(挂载主机目录):直接将主机的某个本地目录,挂载到容器内的指定路径,相当于容器和主机共享这个目录,数据存储在主机本地。
1.2 关键区别(表格对比,一目了然)
| 对比维度 | Volume(数据卷) | Bind Mount(挂载主机目录) |
|---|---|---|
| 管理主体 | Docker引擎统一管理 | 用户手动管理主机目录 |
| 路径位置 | 由Docker分配(默认/var/lib/docker/volumes/) | 自定义主机任意路径(如/home/docker/data) |
| 容器删除影响 | Volume保留,数据不丢失 | 主机目录保留,数据不丢失(但路径易混乱) |
| 跨容器共享 | 支持,多个容器可挂载同一个Volume | 支持,但需手动管理主机目录权限 |
| 适用场景 | 长期存储、跨容器共享数据(如数据库) | 临时调试、主机与容器快速共享文件(如代码) |
💡 小提示:新手优先用Volume!无需关心具体存储路径,Docker自动管理,减少权限报错、路径混乱等问题,是官方推荐的持久化方案。
1.3 一句话总结
Volume是"Docker管的存储",省心、安全、适配容器;Bind Mount是"自己管的存储",灵活、直接,但需手动维护------做数据持久化,优先选Volume准没错!
二、实战:MYSQL容器数据持久化(删除容器不丢数)
光懂理论不够,实战才是重点!本节我们全程实操,用Volume实现MySQL容器的数据持久化,完成后就算删除容器,重新启动新容器,之前的数据库、表数据依然存在,全程复制命令即可上手。
2.1 前置准备
- 已安装Docker(未安装的同学,可参考我之前的Docker入门教程,一键部署);
- 联网环境(需要拉取MySQL镜像);
- 终端工具(Windows用PowerShell,Linux/Mac用终端即可)。
2.2 步骤1:创建自定义Volume(推荐)
虽然Docker可以自动创建Volume,但手动创建能更清晰地管理数据卷,命令如下(复制直接执行):
bash
# 创建名为mysql-data的Volume(名字可自定义,如my-mysql-volume)
docker volume create mysql-data
# 查看创建的Volume信息(验证是否创建成功)
docker volume inspect mysql-data
✅ 执行结果说明:inspect命令会输出Volume的存储路径、驱动等信息,无需记住路径,Docker会自动管理。
2.3 步骤2:启动MySQL容器,挂载Volume
启动MySQL容器时,通过-v参数将我们创建的mysql-data Volume,挂载到容器内MySQL的数据存储目录/var/lib/mysql(这个路径是MySQL默认的数据存储路径,固定不变)。
完整命令如下(重点注意密码和挂载参数):
bash
# 启动MySQL容器,挂载Volume,设置root密码(替换为自己的密码)
docker run -d \
--name mysql-db \ # 容器名字,自定义
-p 3306:3306 \ # 端口映射,主机3306端口映射到容器3306
-v mysql-data:/var/lib/mysql \ # 挂载Volume到容器数据目录
-e MYSQL_ROOT_PASSWORD=123456 \ # MySQL root密码,自定义
mysql:latest # MySQL镜像(latest为最新版,也可指定版本如8.0)
⚠️ 注意事项:
- 密码建议设置复杂一点,避免弱密码报错;
- 如果主机3306端口已被占用,可修改为3307:3306(主机端口自定义);
-v 数据卷名:容器内路径,这是Volume挂载的固定格式,不要写反。
2.4 步骤3:验证MySQL容器正常运行
启动容器后,先验证容器是否正常运行,避免后续操作踩坑:
bash
# 查看容器运行状态
docker ps
# 若容器未运行,查看日志排查问题
docker logs mysql-db
✅ 正常情况:docker ps能看到mysql-db容器,状态为Up(运行中)。
2.5 步骤4:向MySQL插入测试数据
我们通过Navicat、DBeaver等工具连接MySQL,插入测试数据(也可通过终端连接,命令如下),用于后续验证数据是否保留。
终端连接MySQL命令:
bash
# 进入MySQL容器内部
docker exec -it mysql-db /bin/bash
# 登录MySQL(输入之前设置的密码123456)
mysql -u root -p
# 执行SQL,创建测试数据库和表,插入数据
create database test_db;
use test_db;
create table user(id int primary key auto_increment, name varchar(20));
insert into user(name) values('予枫'),('Docker学习');
select * from user;
✅ 验证:执行select后,能看到插入的2条数据,说明数据插入成功,且已存储到Volume中。
2.6 步骤5:删除容器,验证数据是否保留
这是最关键的一步!我们删除当前运行的mysql-db容器,然后重新启动一个新的MySQL容器,挂载同一个Volume,查看之前插入的测试数据是否还在。
bash
# 1. 删除当前MySQL容器(彻底删除,不可恢复)
docker rm -f mysql-db
# 2. 重新启动一个新的MySQL容器,挂载同一个mysql-data Volume
docker run -d \
--name mysql-db-new \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:latest
# 3. 重新连接MySQL,查看测试数据
docker exec -it mysql-db-new /bin/bash
mysql -u root -p
use test_db;
select * from user;
🎉 最终效果:能看到之前插入的
予枫、Docker学习两条数据,说明数据完全保留,就算删除容器,Volume中的数据也不会丢失!
2.7 实战总结(重点记)
- 核心命令:
docker volume create 数据卷名创建Volume; - 挂载关键:
-v 数据卷名:容器内数据路径,MySQL固定路径/var/lib/mysql; - 核心逻辑:Volume独立于容器生命周期,只要不手动删除Volume,数据就会一直保留。
💡 小技巧:如果想清理无用的Volume,可执行
docker volume prune,会删除未被任何容器挂载的Volume(谨慎执行!)。
三、结尾总结
本文从Docker数据持久化的痛点出发,拆解了Volume与Bind Mount的核心区别,明确了"优先用Volume"的原则,再通过MySQL容器实战,手把手教大家实现"删容器不删数据"的效果,全程无复杂操作,新手也能轻松上手。
其实Docker数据持久化并不难,关键是分清两种挂载方式的适用场景,掌握Volume的基本用法,就能避免数据丢失的坑。后续我还会更新Volume的高级用法(如跨容器共享数据、Volume备份与恢复),关注我,一起进阶Docker!
💬 评论区互动:你之前踩过容器数据丢失的坑吗?或者有其他Docker持久化技巧,欢迎在评论区留言交流,一起避坑进阶!
喜欢本文的话,点赞+收藏+关注,后续持续输出Docker干货教程~