【Docker基础篇】Docker数据持久化避坑:Volume核心用法,MySQL实战落地教程


🍃 予枫个人主页
📚 个人专栏 : 《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)

⚠️ 注意事项:

  1. 密码建议设置复杂一点,避免弱密码报错;
  2. 如果主机3306端口已被占用,可修改为3307:3306(主机端口自定义);
  3. -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 实战总结(重点记)

  1. 核心命令:docker volume create 数据卷名 创建Volume;
  2. 挂载关键:-v 数据卷名:容器内数据路径,MySQL固定路径/var/lib/mysql
  3. 核心逻辑:Volume独立于容器生命周期,只要不手动删除Volume,数据就会一直保留。

💡 小技巧:如果想清理无用的Volume,可执行docker volume prune,会删除未被任何容器挂载的Volume(谨慎执行!)。

三、结尾总结

本文从Docker数据持久化的痛点出发,拆解了Volume与Bind Mount的核心区别,明确了"优先用Volume"的原则,再通过MySQL容器实战,手把手教大家实现"删容器不删数据"的效果,全程无复杂操作,新手也能轻松上手。

其实Docker数据持久化并不难,关键是分清两种挂载方式的适用场景,掌握Volume的基本用法,就能避免数据丢失的坑。后续我还会更新Volume的高级用法(如跨容器共享数据、Volume备份与恢复),关注我,一起进阶Docker!


💬 评论区互动:你之前踩过容器数据丢失的坑吗?或者有其他Docker持久化技巧,欢迎在评论区留言交流,一起避坑进阶!

喜欢本文的话,点赞+收藏+关注,后续持续输出Docker干货教程~

相关推荐
Mr.小海3 小时前
Docker+K8s 集成部署实战
docker·容器·kubernetes
我爱娃哈哈3 小时前
SpringBoot + Docker + Jenkins:一键构建、测试、部署流水线,DevOps 从入门到上手
spring boot·docker·jenkins
未既3 小时前
防火墙端口以及docker访问规则链配置允许特定ip访问
java·tcp/ip·docker
火山引擎开发者社区12 小时前
Seedance 2.0上线火山方舟体验中心,API即将开放
docker·vim·emacs
freephp12 小时前
睡前讲一段docker编译镜像的故事
docker
运维行者_20 小时前
深入解析 Docker 监控:核心指标完整清单
运维·服务器·网络·数据库·docker·容器·eureka
礼拜天没时间.20 小时前
容器网络配置——从互联到自定义桥接
运维·网络·docker·容器·centos
中草药z21 小时前
【Linux】拆解 Linux 容器化核心:Namespace 隔离 + cgroups 资源控制,附 LXC 容器生命周期实战
运维·docker·容器·虚拟化·namespace·lxc·cgroups
猫头虎21 小时前
【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版
docker·npm·开源·aigc·ai编程·远程工作·openclaw