首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL官方Docker镜像的数据存储问题

【编者的话】本文主要介绍在使用MySQL镜像时遇到的一个实际问题,以及整个问题的解决过程。同时,该标题并不恰当,并非是MySQL官方镜像的数据存储方式有问题,而是想表达这样一种思想,由于其特殊的存储方式,不符合我们的使用场景,引起了我们在实际的类生产环境中遇到的问题。

问题起因:

MySQL官方镜像的Dockerfile中,有这么一条设置,即用了VOLUME这个关键字,同时后面设置了一个路径,/var/lib/mysql,这个路径是用来存储数据库的各种表的数据的。

那么,这一条设置会起到什么作用呢??

Docker官方文档对VOLUME这个关键词做了解释,这个路径下的数据或者修改,再重新commit一个新的镜像时,该路径下的所有变化都会被discard,即所有的修改都会被抛弃,不会被保存到新镜像中。(详见官方文档)

那我们如果想把一些基础数据在docker run的时候,不用重新导入基础数据就能直接使用呢??(docker run很快,但是导入数据需要时间,两个表大概需要二十分钟,太影响效率!)

有两种方法:

1、映射方法。在主机上创建不同的目录(每个人建一个自己的目录,拷贝一份基础数据,这样互不影响,各写各的),在docker run的时候使用-v参数将宿主机上的目录映射到容器里的/var/lib/mysql。

2、拷贝方法。既然/var/lib/mysql这个目录被VOLUME关键词给限制了,我们就先把数据拷贝到容器里的其他目录,比如根目录,然后修改docker run的启动文件(姑且称为启动文件,各种软件的docker镜像都会有一个启动脚本,在docker run的时候执行,做一些初始配置、拉起服务的进程),增加这样一个逻辑:将我们拷贝到镜像根目录中的基础数据拷贝或者移动到/var/lib/mysql目录下,比如cp -r /mysql-basic-data /var/lib/mysql,这样,我们的目的就达到了。

我们采用的第二种解决方法。

一些实际操作的问题:

1、如何从宿主机拷贝数据到容器中?

有个命令叫docker cp xxx 容器id:xxx

当然也能从容器中拷贝到宿主机上:

docker cp 容器id:xxx xxx

还有一种场景会用到——很多容器里不能使用vi或者vim编辑文件的,那么你可以先拷贝到宿主机上,编辑修改保存,再拷贝回去。

2、区分Dockerfile和docker run的启动脚本

Dockerfile是在docker build的时候执行命的,而启动脚本是在docker run的时候执行的,注意区分其执行场景和时机!!

3、MySQL 5.6版本官方镜像大小300+M,我们的数据大概300M,但是新的镜像竟然达到了900+M大小,为什么??

具体要看docker存储原理!!

这里简单介绍一下,Docker使用的是联合文件系统(AUFS,网上介绍很多),这个文件系统大概的原理是这样的(Docker镜像的存储原理),关键一点是它是分层的,层层迭加,底层都是只读层,最上层可以修改,每次修改它都会把你的修改重新从底层拷贝一份到最上层,即使你只有一份数据,AUFS也会把它搞成两份数据,空间就会成倍增加。

同事给我举了一个例子,即使你在容器里执行一条chown命令,镜像的大小增加200M都是可能的!!

4、MySQL官方镜像是区分大小写的

这个大小写包括数据库表的命名,比如你的数据库中有个dms.quertz_trigger,而你要连接的却是大写的dms.QUERTZ_TRIGGER(上层通过Driver,ORM比如Hibernate、Mybatis等),此时会报错“xxx is not exsit”。(此时你不要惊讶,也不要气馁,更不要抱怨“数据库中明明是有这个表的嘛”,只需要耐心看下面的解决方法)

解决:修改镜像中的/etc/mysql/my.cnf文件,在末尾加一行lower_case_table_names=1。(还有一个参数lower_case_file_system如果用到需要注意一下)

docker commit 容器id xxx:xxtag(将修改提交保存为一个镜像),用新镜像,搞定!

5、关于MySQL字段值的大小写敏感问题

字段值的大小写由Mysql的collate来控制。可以理解为,跟具体的字符集有关,比如 utf8字符集:

utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的collate;

utf8_general_cs,表示区分大小写;

utf8_bin表示二进制比较,同样也区分大小写。

图片来自第七城市“MySQL in Docker with Java Hibernate”:http://www.th7.cn/Program/java/201509/573373.shtml

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180515G1XCR100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券