mysql使用多端口映射_在不同端口上,运行多个的MySQL实例(通过Docker端口映射)...

需求分析

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

而一般情况下,直接安装的Mysql只能服务一个端口。

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

b8b9bc29782cc121b0a2b32b6722d13e.png

Docker可以完美解决这个问题。

使用Docker可以实现:在一台设备上,同时运行多个Mysql实例,并且这些实例之间不会互相干扰。

beef9d0c32f7943709bf411af39a3006.png

下面我们从理论、操作两方面来看。

什么是Docker?

不需要理解“虚拟化技术”,只要用过虚拟机,就可以理解Docker。

虚拟机

先说什么是虚拟机:

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

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

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

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

比如,物理机中的3306端口,不会影响虚拟机的3306端口;

再比如,如果在虚拟机的80端口开启Http服务,这和宿主机的80端口没有什么关系...

但是,如果想让虚拟机为宿主机提供服务端口,怎么办呢?

端口映射。

端口映射

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

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

正常情况下,如果我们通过localhost域名,只能访问宿主机的端口,不能直接访问虚拟机的端口。

638b9138ed011df25fdc4d67cf3449c9.png

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

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

bf37d53977c481b409ccd1b7648a5b6b.png

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

Docker

如果我们把“虚拟系统”这个词换成“容器”

把虚拟机的“安装盘”换成“镜像”

那么,这样的“虚拟机”,就是Docker!

e08b996da1eb01f8b73b72abf1f084b2.png

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

所以我们没必要研究它俩有什么区别,而是通过研究它俩的共性,来迁移我们已有的知识。

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

e2d24b59e8fb36ee31d3b89ac74a75f9.png

实现Mysql“双开”

有了上面的理论,想创建多个运行在不同端口上的Mysql,就轻而易举了。

a6824fb8a22ba80311916f00f2f5745f.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

输完之后,可以发现终端的前缀发生了变化:

ecc7757a42c1016c7ee80d339da84432.png

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

接下来进入Mysql环境:

// 老规矩,换成自己的

mysql -u[用户名] -p[密码]

// 实例代码

mysql -uroot -p123456

我们发现,终端的前缀又发生了变化:

e6cec08d701bdcfc9c4b6fda8aaf06ab.png

此时,输入:

// 运行root用户 使用空密码登录

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT;

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

e89ef6a9c496303f56420fef523a2120.png

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

5d0241398b37a33d46dcac290543c1fd.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是个好东西!

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值