• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
嗑瓜子儿溜茶水儿
帮助1

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 技术栈的学习不能面面俱到,但对技术的追求还是要以此为目标持续下去。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkackg
系列文章
更多 icon
同类精品
更多 icon
继续加载