團隊的項目中,一部分使用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是個好東西!