使用 docker 部署 MySQL 会导致数据丢失吗

7 篇文章 0 订阅
1 篇文章 0 订阅

2023年2月28日,今天下午电话面试 java 岗位,经过一些提问后,面试官问了一个问题,“那么你最近在关注什么方面的技术点呢?”,可能是我之前的回答不太理想,且说辞都是“不好意思,可能最近没有太经常使用这方面的东西。”(其实就是忘了)。

我说“最近在读关于SpringCloud 分布式微服务的书。” 本以为他会接着问一些SpringCloud相关的技术点。结果...

面试官,“嗯嗯,那么docker用过吗?”
我一整个没反应过来。然后简单讲了一下docker的概念。

问题

问了一个我没面对过的问题。
使用 docker 部署 mysql,如果服务器宕机重启,会有什么结果。
在这里插入图片描述
面试官尝试引导我。
会不会影响mysql的存储。
“我觉得不会啊。”全凭直觉说的,甚至没有测试过这种情况。
他直接就问了,使用docker部署mysql服务,如果服务器重启后,mysql的数据还在吗?
我说在啊,然后一顿扯皮。
实际上对 docker 的一些概念还是有点模糊,所以导致临场发挥啥也说不明白。

docker 理解为 一台虚拟机
镜像 image 理解为 一个安装包
容器 container 理解为 通过镜像安装好的应用

docker 部署 MySQL

  1. 下载 MySQL安装包(pull image,拉取镜像)
  2. 安装 MySQL安装包(run image,运行镜像)
  3. 启动 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 技术栈的学习不能面面俱到,但对技术的追求还是要以此为目标持续下去。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值