团队的项目中,一部分使用3306做为Mysql端口,另外一部分,则是使用3307。html
而通常状况下,直接安装的Mysql只能服务一个端口。mysql
这样,遇到不一样的项目,要么改Mysql的服务,要么改项目的数据库端口。然而,这两种方法都不方便...sql
Docker能够完美解决这个问题。docker
使用Docker能够实现:在一台设备上,同时运行多个Mysql实例,而且这些实例之间不会互相干扰。数据库
下面咱们从理论、操做两方面来看。macos
不须要理解“虚拟化技术”,只要用过虚拟机,就能够理解Docker。ubuntu
先说什么是虚拟机:segmentfault
就是在现有的系统中,模拟一组“虚拟的”硬件,而后在这个硬件上,再安装一套操做系统。windows
虚拟机中的系统和宿主机的系统,是互相隔离的。bash
除了虚拟机的硬件是模拟出来的之外,其余方面,虚拟机和真实的系统没有区别。
虚拟机有本身的文件系统、本身的线程、本身的网卡、本身的IP、本身的端口......它什么都有。
好比,物理机中的3306端口,不会影响虚拟机的3306端口;
再好比,若是在虚拟机的80端口开启Http服务,这和宿主机的80端口没有什么关系...
可是,若是想让虚拟机为宿主机提供服务端口,怎么办呢?
不用懂概念,举个例子就明白了。
假设物理机的主机名是localhost,虚拟机的IP是192.168.1.100
正常状况下,若是咱们经过localhost域名,只能访问宿主机的端口,不能直接访问虚拟机的端口。
但若是把虚拟机的3306映射到物理机的3307,会出现什么呢?
当咱们再输入localhost:3307的时候,就等价于访问192.168.1.100:3306,
甚至咱们都不须要知道虚拟机的地址,直接经过映射,就能访问到虚拟机的端口了。
若是咱们把“虚拟系统”这个词换成“容器”
把虚拟机的“安装盘”换成“镜像”
那么,这样的“虚拟机”,就是Docker!
Docker不是虚拟机,但虚拟机的大多数特性,Docker都有。
因此咱们不必研究它俩有什么区别,而是经过研究它俩的共性,来迁移咱们已有的知识。
看了刚才虚拟机的介绍,咱们即便用脚丫子想,也能想明白:Docker也是有独立端口的。
有了上面的理论,想建立多个运行在不一样端口上的Mysql,就垂手可得了。
咱们使用Docker容器,能够建立无限个如出一辙的Mysql。
再使用端口映射,分别映射到宿主机的不一样端口上,达到“双开”的效果。
(须要注意的是,这些容器之间是独立的,更改容器1不会影响容器2)
不管你是Mac,仍是Linux,仍是Windows,均可以经过终端,快速的安装Docker。
(建议使用最简单的方式安装Docker,不用在安装时耽误太多时间,装好后能够不用登陆)
什么是“镜像”?
刚才说了,至关于安装系统的“光盘”。咱们能够经过这张光盘,在许多电脑上,安装许多如出一辙的系统。
而镜像呢?经过这个镜像,能够建立许多如出一辙的容器,也至关于安装了许多如出一辙的系统。
在终端中输入:
// 拉取mysql5.7镜像 docker pull mysql:5.7 // 或者拉取最新的mysql镜像 docker pull mysql
等待读条完成,这个Mysql的“安装盘”就下载到咱们的电脑上了。
刚才也说了,一个容器就至关于一个虚拟机系统。因此创建容器,就是在“装系统”,既然是装系统,就须要用到刚才的“安装盘”。
终端输入:
// 把各类属性替换成本身的! docker run -id --name=[容器名称] -p [主机端口]:[容器端口] -e MYSQL\_ROOT\_PASSWORD=[Mysql密码] [镜像名称] // 示例代码 docker run -id --name=mysql3307 -p 3307:3306 -e MYSQL\_ROOT\_PASSWORD=123456 mysql:5.7
值得注意的是,命令中的3307:3306就是“端口映射”,也就是把容器的3306映射到本机的3307,注意千万不要写反!!
许多测试环境都是使用root空密码登陆,因此咱们把容器中的Mysql也改为空密码。
因为容器是独立的环境,它有本身的终端,所以咱们须要从本机的终端,切换到容器的终端。
终端中输入,进入容器:
// 容器名改为本身的 docker exec -it [容器名] bash // 示例代码 docker exec -it mysql3307 bash
输完以后,能够发现终端的前缀发生了变化:
说明已经进入了容器的终端。
接下来进入Mysql环境:
// 老规矩,换成本身的 mysql -u[用户名] -p[密码] // 实例代码 mysql -uroot -p123456
咱们发现,终端的前缀又发生了变化:
此时,输入:
// 运行root用户 使用空密码登陆 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT;
看到下图,说明设置成功,此时你的数据库已经可使用root空密码访问localhost:3307了。
输入exit,退出容器,返回本机的终端:
刚才启动的容器,使用了3307端口。那么若是咱们还想再开一个3306端口,怎么操做呢?——重复一遍就能够了。
// 创建容器 docker run -id --name=mysql3306 -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 mysql:5.7 // 进入容器 docker exec -it mysql3306 bash // 进入mysql mysql -uroot -p123456 // 容许root从任意位置登陆 GRANT ALL PRIVILEGES ON \*.\* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT;
一通操做以后,咱们就得到了两个Mysql,除了端口,其余如出一辙。
之后就能够经过本身的需求,动态的启动不一样端口的Mysql了。
好比,示例代码中,可使用docker start mysql3306启动3306的Mysql,经过docker start mysql3307启动3307的Mysql。
不用的时候,就能够docker stop mysql3307把它关掉,很是灵活。
Docker是个好东西!