建立運行在不一樣端口上的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是個好東西!

本文做者:河北工業大學夢雲智開發團隊 劉宇軒

相關文章
相關標籤/搜索