windows7系统安装并连接Docker容器中的Mysql数据库

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

windows7系统安装并连接Docker容器中的Mysql数据库

没营养的闲言:
一次偶然的机会,让我看到了win10利用docker容器跑mysql虚拟服务的文章,我不太熟悉MYSQL,也不太了解docker。但是最近又恰好开始重新搬出桌面数据库来完成工作,十年前的Access知识基本还给M$软了,Dao引擎和ADO像藏在沙发最底角的3D眼镜片一样模糊而又有些亲切。用access搞完了那几个用excel焦头烂额的数据关系后,突然发现,普通办公应用场景里,哪怕那些学计算机应用的yangman,也很少谈“数据库”,似乎扁平化的管理架构也催生出了扁平化的知识结构树?excel成为了强大的、催生数据形势主义的生化武器。

言归正传

我现在手上的电脑是2014年“高配”笔记本,加了4G后成为8G的win7,据说去年年初的时候还可以跑魔兽世界团队本,今年好像只能上去推野怪了。我想在这个本上装一个Mysql,甚至还想架一个简单的web服务器。我的想法被无情的拒绝了:“XD,我还要跑魔兽经典服呢”,好吧,我怎样不再现有win7环境上增加负担的情况下(其实就是不装那些10年也用不了一次的db、web服务后端0!),搞一数据库,也在想要不用的时候能干干净净的抹掉它一切存在的痕迹?所以就有了这篇win7 连接到“win7+docker+sql”。

一、docker默认安装

这个网上无数的大神指南,我不赘述,只讲我做为一个老菜安装过程中的几件害羞事
1、win7只能安装Docker TollBox,Docker toolbox官方安装指南在这里:https://docs.docker.com/toolbox/overview/
2、安装过程中我建议你不要选里面的Oracle VM VirtualBox,而是自己下载最新片的virtualBox。地址在这里:https://www.virtualbox.org/
3、安装包中的boot2docker.iso也比较老,也建议你去下载一个最新的。地址在这:https://github.com/boot2docker/boot2docker/releases
下载的boot2docker.iso请你拷贝至你计算机的上的这个目标里:C:\Users\你的登录账号.docker\machine\cache。因为当你第一次运行“Docker Quickstart Terminal”时,其后端的start.sh脚本要用这个iso创建一个名为"default"的virtualBox虚拟机。因为win7系统并不支持容器,所以需要在win7上面跑一个linux虚拟机,然后在这相虚拟机上跑docker。
4、安装完后,虚拟机上会建立SSH服务,你可以打开Docker toolbox安装中一并安装的git bash,并用ssh指令连接新建的虚拟机。
指令:ssh docker@<ip.addr> ,其中ip.addr是安装完成后,虚拟机的ip地址。如果不知道IP地址,可以在win7命令行中输入如下指令查看:

 docker-machine env default

git bash窗口的功能有限,所以我下载了PuTTY做为ssh远程登录工具。地址在这:https://www.chiark.greenend.org.uk/~sgtatham/putty/

``
5、我建议你先用下面的指令`

 docker pull hello-world
 docker run hello-world

做一下docker系统的测试,如果成功那就继续。如果不成功,那就问度娘吧。当然,默认安装一般而言是容错能力最强的。
6、现在用ducker pull mysql:latest 下载mysql最新官方镜像:

ducker pull mysql:latest

然后用下面的指令运行这个docker镜像:

docker run -it --name firstSql -e MYSQL_ROOT_PASSWORKD=12345 -d -p 3306:3306 mysql:latest

7、如果你下载镜像总是被中断或者慢得让你怀疑出生地的时候,那就按照如下方法,增加docker镜像库的国内mirror。 先ssh进入default虚拟机,然后:

    cd /etc/docker
    sudo vi daemon.json
 将下面的mirror列表加入文件
 {
 	"registry-mirrors":["https://mhz4oygu.mirror.aliyuncs.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"]
 }

然后:sudo shutdwon -r now。 重新启动的VM,再次运行docker pull 时就会快很多了。 在这里,我建议你去阿里云免费注册“容器镜像服务”,地址:https://cr.console.aliyun.com/,你不要告诉我你没有注册,如果你曾经在淘宝上剁过手,你就可以用淘宝帐号登录阿里云,并且按照提示建立自已的容器镜象。而这个镜像对目前的你来说,最重要的就是”镜像加速器”,把你自己的镜像加速器地址放在daemon.json的第一行。我没有给阿里MM做广告的意思啊,纯粹就是不想再走找新平台新注册新学习新垃圾邮件的老路。

二、win7在NAT模式下,访问docker中的Mysql

其实这是我写这篇文章的目的,也是因为这个自找的麻烦,折腾了两天时间。前面说过,这台机器才6岁,很年轻,咳咳…,由于start.sh建立的default虚拟机有两种与实体主机联拉的网络模式,一种NAT,一种是桥接。virtualBox实际有四种网络连接方法,比vmware多了一种。但是对于一台桌面笔记本,NAT和桥接基本就够了。桥接要开启DHCP服务,这样虚拟机就有自己独立的IP地址,能做到实体主机与虚拟机的双向通信。实际上,我要不的是一台虚拟机,我只是想要一个Mysql服务器。而且docker的mysql镜像也是以最小化的模式,仅仅包含了运行mysql所必须的linux系统内核和支撑棋块。docker中的的容器,对于我来讲就一个独立的软件,尽管这个软件实际上有自己完全意义上的独立操作系统。所以我打开“Oracle VM VirtualBox”,在网络设置中,删除了用于桥接的第二个虚拟网卡,只保留了NAT网络连接。
由于NAT的限制,虚拟机可以共享实体主机的网络,而实体主机不能访问虚拟机,因为虚拟机没有IP地址,也就是只能单向的由虚拟机向实体主机访问。实体主机为了访问虚拟机,必须使用端口映射。
现在我们在Oracle VM VirtualBox软件中打开default虚拟机的网络设置,并在网卡1(NAT模式网卡)中,点开“高级”选项,在端口转发中,增加一个转发映射端口。
比如,我的NAT转发端口有两个:

名称协议主机IP主机端口子系统IP子系统端口
msqltcp127.0.0.193063306
sshtcp127.0.0.1963422

注意msql的子系统端口,我映射的是3306端口,而这是mysql远程服务的默认端口。这个mysql服务程序实际处于default虚拟机的docker容器里。我要穿过default虚拟机访问docker容器里的mysql守护进程。访问链路是:实体主机->default虚拟主机->docker容器->mysql守护程序。而docker容器其实相当于一个虚拟机镜像,只不过这个虚拟机对外的表现就是一个mysql服务的支撑进程。
实现实体主机通过NAT模式访问虚拟机中的docker容器里的mysql,其最关键的点在于:一NAT要将实体主机本地端口映射至虚拟机的指定端口,而虚拟机的这个指定端口也被docker容器映射到了容器内mysql守护进程的服务端口。二是,虚拟机中用docker run启动mysql:latest镜像时,要显示指定-p参数,比如我上述启动镜像的指令:

docker run -it --name firstSql -e MYSQL_ROOT_PASSWORKD=12345 -d -p 3306:3306 mysql:latest	 

其中的-p 3306:3306,就是指将虚拟机的本地3306端口映射到docker容器里的3306端口。如果你不显示指定-p参数,则docker容器里的mysql只能被default虚拟机访问,因为default虚拟机与docker容器之间是桥接的方式(猜的哦,吼吼吼)。在defualt虚拟机里有一个docker0网卡,在docker容器有eth0网卡,两个网卡同在一个网段,default是172.17.0.1,docker容器是172.17.0.2。而由于实体虚拟机default之间采用NAT联拉方式,在default虚拟机中有一个个eth0网卡,其设置为“inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0”,但是在本地实体主机上并没有与该网段对应的网卡和IP地址,所以实体主机只能通过端口映射,访问虚拟主机。
那么,我们看一下实体主机与mysql进程之间的链路:实体主机中的mysql客户端如Navicat->主机127.0.0.1:9306->default虚拟主机10.0.2.15:3306->docker容器172.17.0.2:3036->mysql:3036,这个链路是否正确,还请docker高手验证。
现在,我们在实体主机中打开Navicat,主机127.0.0.1,端口9306,用户docker 密码tcuser。测试连接,然后你应该看不见让我崩溃连接错误窗口。

三、几个小说明

1、“Docker Quickstart Terminal”建立的default虚拟机位置在“C:\Users[你的登录账号]\.docker\machine\machines“,我这台机器C盘是SSD,所以,我们会把虚拟机搬到机械硬盘上去。这也是我一开始建议单独安装最新版Oracle VM VirtualBox的原因,因为,我们可以自己建立vm,这样就可以控制更多的VM设置。尤其是其虚拟磁盘的存储位置,以及向我这样自找麻烦的只使用NAT。
2、docker容器里的mysql,你可以就把它想成一个default虚拟机中的守护进程,无视docker容器背后的另外一个虚拟操作系统。
3、在我前面设置NAT端口转发的时候,我特意将细节列了出来,是因为网上的一些指导中,主机IP是空的,这样就会造成一个问题,当你启动default虚拟机的时候,你的实体主机的windows防火墙就会跳出来。而我加上127.0.0.1的本地localhost地址后,防火墙的默认规则不会报警。
4、docker中的数据库被诉在虚拟磁盘里了,而我们更希望数据库放在我们实体机的本地硬盘上,这就要用把docker里的数据路径映射到本地硬盘的一个独立目录里。
首先,要打开“Oracle VM VirtualBox”,在共享目录中增长连接至实体机的共享目录,比如把H:\vm映射至default虚拟机的/work目录中,然后在其中建立子目录放置mysql数据库数据。比如/work/mysql。此后,启动default虚拟机,ssh登录,用以下命令启动mysql:latest镜像。

 docker run -it --name baseSql -p 3306:3306 -v /Work/mysql:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123321 -d mysql:latest --character-set-server=utf8 --collation-server=utf8_unicode_ci

后面的字符集参数是为了保用UNICODE编码和索引的,这个是参考CSDN作者johnnyMore《Windows7环境下使用MySQL docker容器踩坑记》,这里感谢他让我出坑,呵呵。
同样的,当我用这个指令启动镜像时,也遇到了“File ./ib_logfile101: ‘aio write’ returned OS error 122”(参考johnnyMore的上述文章)。由于win7不支持aio(异步io的一种实现),而mysql:latest集成时是默认启用的,我们要在win7中禁用。我们可以采用johnnyMore的方法,运行 docker exec -it baseSql bash,进入docker容器内部,然后在/etc/mysql/conf.d中加入my-config.cnf文件,内容为:

[mysqld]
innodb_use_native_aio=0

由于mysql:latest中没有vi或nano这样的编辑软件,所以,可以用echo追加建立:

sudo echo "[mysqld]" > my-config.cnf
sudo echo "innodb_use_native_aio=0" >> my-config.cnf

然后:docker commit baseSql mymysql:v1.0
这样就有了一个属于自己的禁用aio的mysql:v1.0的镜像。
5、docker官方对 commit命令的运用是要慎重,至于为什么请看官方文档,主要原因是减少最终镜像中的不必要的文件。所以我自己做了一个Dockerfile文件(注意文件名必须是"Dockerfile"),在defualt虚拟机的一个单独目录中,用sudo vi Dockerfile建立,内容如下:

FROM mysql:latest
RUN buildDeps=`apt-get update` \
		     && apt-get install -y busybox \
			 && echo "[mysqld]" > /etc/mysql/conf.d/my-config.cnf \
			 && echo "innodb_use_native_aio=0" >> /etc/mysql/conf.d/my-config.cnf \
			 && rm -rf /var/lib/apt/lists/*

这里我加入了busybox套件进行,主要是其不占空间,且可以查看容器内部的IP(为了这个IP我折腾了很久啊,都是泪:0:),如果你不要这个busybox,则你可以在命令中去除。
在这个目录中运行:
docker build -t mysql:zh1.0 .
注意,指令的最后有一个".",代表的是当前Context目录。-t后面的名字和版本号可以自己指定。花费一段时间后,你的新镜像就行成了,用这个mysql:zh1.0新镜像运行前述挂载/work/mysql的docker run命令,你的可运行、可进入管理、可实体机连接、可随时删除的win7+doccer+mysql数据库就可以见人啦:-)
6、重建镜像为解决aio的问题,其实有一个替代方案,那就是把容器中的/etc/mysql/conf.d目录映射到实体机的本地硬盘目录,这样在mysql启动时,会默认加载该目录下所有的配置文件。这个就大家自己试验啦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值