建立运行在不一样端口上的MySQL实例(经过Docker端口映射)

需求分析

团队的项目中,一部分使用3306做为Mysql端口,另外一部分,则是使用3307html

而通常状况下,直接安装的Mysql只能服务一个端口。mysql

这样,遇到不一样的项目,要么改Mysql的服务,要么改项目的数据库端口。然而,这两种方法都不方便...sql

image.png

Docker能够完美解决这个问题。docker

使用Docker能够实现:在一台设备上,同时运行多个Mysql实例,而且这些实例之间不会互相干扰。数据库

image.png

下面咱们从理论、操做两方面来看。macos

什么是Docker?

不须要理解“虚拟化技术”,只要用过虚拟机,就能够理解Docker。ubuntu

虚拟机

先说什么是虚拟机:segmentfault

就是在现有的系统中,模拟一组“虚拟的”硬件,而后在这个硬件上,再安装一套操做系统。windows

虚拟机中的系统和宿主机的系统,是互相隔离的。bash

图片.png

除了虚拟机的硬件是模拟出来的之外,其余方面,虚拟机和真实的系统没有区别

虚拟机有本身的文件系统、本身的线程、本身的网卡、本身的IP、本身的端口......它什么都有。

好比,物理机中的3306端口,不会影响虚拟机的3306端口;
再好比,若是在虚拟机的80端口开启Http服务,这和宿主机的80端口没有什么关系...

可是,若是想让虚拟机宿主机提供服务端口,怎么办呢?

  • 端口映射。

端口映射

不用懂概念,举个例子就明白了。

假设物理机的主机名是localhost,虚拟机的IP是192.168.1.100

正常状况下,若是咱们经过localhost域名,只能访问宿主机的端口,不能直接访问虚拟机的端口。

image.png

但若是把虚拟机的3306映射到物理机的3307,会出现什么呢?

当咱们再输入localhost:3307的时候,就等价于访问192.168.1.100:3306

image.png

甚至咱们都不须要知道虚拟机的地址,直接经过映射,就能访问到虚拟机的端口了。

Docker

若是咱们把“虚拟系统”这个词换成“容器
把虚拟机的“安装盘”换成“镜像
那么,这样的“虚拟机”,就是Docker

image.png

Docker不是虚拟机,但虚拟机的大多数特性,Docker都有。

因此咱们不必研究它俩有什么区别,而是经过研究它俩的共性,来迁移咱们已有的知识。

看了刚才虚拟机的介绍,咱们即便用脚丫子想,也能想明白:Docker也是有独立端口的

image.png

实现Mysql“双开”

有了上面的理论,想建立多个运行在不一样端口上的Mysql,就垂手可得了。

image.png

咱们使用Docker容器,能够建立无限个如出一辙的Mysql。

再使用端口映射,分别映射到宿主机的不一样端口上,达到“双开”的效果。

(须要注意的是,这些容器之间是独立的,更改容器1不会影响容器2)

操做

安装Docker

不管你是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,注意千万不要写反!!

修改Mysql登陆密码

许多测试环境都是使用root空密码登陆,因此咱们把容器中的Mysql也改为空密码。

因为容器是独立的环境,它有本身的终端,所以咱们须要从本机的终端,切换到容器的终端。

终端中输入,进入容器:

// 容器名改为本身的
docker exec -it [容器名] bash

// 示例代码
docker exec -it mysql3307 bash

输完以后,能够发现终端的前缀发生了变化:
image.png

说明已经进入了容器的终端。

接下来进入Mysql环境:

// 老规矩,换成本身的
mysql -u[用户名] -p[密码]
// 实例代码
mysql -uroot -p123456

咱们发现,终端的前缀又发生了变化:
image.png

此时,输入:

// 运行root用户 使用空密码登陆
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT;

看到下图,说明设置成功,此时你的数据库已经可使用root空密码访问localhost:3307了。
image.png

输入exit,退出容器,返回本机的终端:
image.png

开启第二个容器

刚才启动的容器,使用了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是个好东西!

本文做者:河北工业大学梦云智开发团队 刘宇轩

相关文章
相关标签/搜索