使用 docker 部署 MySQL 会导致数据丢失吗
2023年2月28日,今天下午电话面试 java 岗位,经过一些提问后,面试官问了一个问题,“那么你最近在关注什么方面的技术点呢?”,可能是我之前的回答不太理想,且说辞都是“不好意思,可能最近没有太经常使用这方面的东西。”(其实就是忘了)。
我说“最近在读关于SpringCloud 分布式微服务的书。” 本以为他会接着问一些SpringCloud相关的技术点。结果...面试官,“嗯嗯,那么docker用过吗?”
我一整个没反应过来。然后简单讲了一下docker的概念。
问题
问了一个我没面对过的问题。
使用 docker 部署 mysql,如果服务器宕机重启,会有什么结果。
面试官尝试引导我。
会不会影响mysql的存储。
“我觉得不会啊。”全凭直觉说的,甚至没有测试过这种情况。
他直接就问了,使用docker部署mysql服务,如果服务器重启后,mysql的数据还在吗?
我说在啊,然后一顿扯皮。
实际上对 docker 的一些概念还是有点模糊,所以导致临场发挥啥也说不明白。
docker 理解为 一台虚拟机
镜像 image 理解为 一个安装包
容器 container 理解为 通过镜像安装好的应用
docker 部署 MySQL
- 下载 MySQL安装包(pull image,拉取镜像)
- 安装 MySQL安装包(run image,运行镜像)
- 启动 MySQL服务(start container,启动容器)
正文
回来以后查了一下这个问题。确实存在这种数据消失的情况。
但实际上并不是 docker 服务器重启之后 MySQL 数据丢失,而是 MySQL 部署在 docker 的容器中,如果此容器被 docker rm 掉。然后重新 run 一个 MySQL 容器,此时 原有的 MySQL 容器中的数据确实丢失了。
丢弃 docker 这个概念,本质上就是安装一个 MySQL 卸载了,然后又安装一个 MySQL ,那么第一个 MySQL 中的数据肯定没有了。
思路理清了,验证一下。
验证docker、MySQL容器重启后,数据不会丢失
首先 在启动的 MySQL容器中创建一个数据库并添加表和数据
上图,为启动着的 MySQL 容器,现在用 navicat 链接这个 MySQL服务,创建一个数据库,创建表,创建数据。
上图,cloud是之前启动的 MySQL 容器,并且保存了数据
现在模拟 docker 服务重启
重启完毕检查容器状态
docker 服务重启,导致内部的容器也被停止此时,启动容器,然后通过 navicat 链接数据库,查看刚才建的库表以及数据是否丢失。
打开链接
打开数据库
发现表和数据都在
总结,docker 宕机的情况下 将容器重启,MySQL的数据不会丢失。
删除 MySQL容器,重新 run MySQL镜像,数据会丢失的解决方案
参考此链接
使用 外部数据卷 Bind mount a volume
执行 docker run --help使用 -v 来绑定一个 docker 外部数据卷
上图,运行mysql 5.7的镜像,docker run 使用docker 服务 执行 run 命令-d 后台运行-p 接口映射-v 将/usr/local/mysql5.7 事先创建好的文件夹 映射为 容器内的路径 /var/lib/mysql-e 是配置环境变量,设置一下密码--name 给容器命名mysql:5.7 run 这个 mysql 版本是 5.7---------------------------------------------------然后, 尝试链接这个新建的MySQL服务
新的链接,继续执行前面的脚本
create database testdatabase;use testdatabase;create table test_table(id int primary key,`name` varchar(5));insert into test_table values(1,'aa'),(2, 'bb');
数据表创建完毕,停容器,删容器,再重新执行一遍,运行容器的命令。
尝试链接数据库看数据是否已经被持久化。
发现,之前添加的库表都在。查看一下我们启动 MySQL容器时外挂的文件夹内容是否有变化
发现已经生成了很多文件,可以观察到 刚创建的数据库 testdatabase
总结
docker 部署 MySQL服务,只有 MySQL 容器被删除的情况下,数据会丢失。可以通过 docker 外挂宿主机的文件夹,来存储 MySQL 的数据。并且当重新运行一个 MySQL 镜像时,也要外挂同一个文件夹,确保容器能读取到先前删除的容器内的数据。
面试并不总是一帆风顺的,有的面试确实是技术碾压,有的面试确实可以为自己查缺补漏,虽然 java 技术栈的学习不能面面俱到,但对技术的追求还是要以此为目标持续下去。
来源地址:https://blog.csdn.net/weixin_44062052/article/details/129270530
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341