動手玩Windows 10 Docker(2) - 如何使用Docker Image?

Windows 10 Docker 是2016年度更新後很大的一個進步但(好像)被很多人忽略沒有話題性

這個系列是我的學習筆記也順便推廣這好用的東西

上一篇我們知道怎樣去抓取適合的Docker Image

但組件不啟動起來就沒有作用, 所以現在我們就看看如何用這些Image做點東西

鍵入docker images我們見到有4個image可以使用, 例如hello-world這個, 究竟它是做甚麼的?

要運行這個image, 我們要鍵入 

docker run hello-world

我們會見到這個結果, 那...其實這個Hello-world真的就是一個測試用的小東西

他告訴我們甚麼呢? 就是你的docker正在正常運作嚕 XD

還在第3點提到一個東西叫container, docker run指令會把image啟動成一個container

要查看運作重的container, 可以鍵入

docker ps -a

噢, 在第一筆資料就見到我們的hello-world在3分鐘前建立了, 而且狀態是Exited, 已完成的狀態.

這個真的不太有趣, 現在我們來看看怎樣建起一個Mysql資料庫服務

要起動mysql, 要考慮的東西比hello-world多, 如果你在Windows或Linux有安裝過mysql, 

會知道例如mysql是一個資料庫, 要讓人連線, 要設定root的密碼等等

這些東西要怎樣設定呢? 通常一個docker image都會有一篇說明文件

例如你在google找docker pull mysql你會找到docker hub上的這一頁

https://hub.docker.com/_/mysql/

那當然之前的hello-world也會有類似的介紹頁面: https://hub.docker.com/_/hello-world/

這些頁面的格式通常會介紹如何使用這個Image, 會有一些範例指令

例如他說要運行這個Mysql Image可以這樣啟動

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

同樣的我們以docker run來開始

--name 是要設定啟動後的container名稱

-e 是開始設定環境變數 (environment variables), 例如最基本是要設定一個root password

-d 是指把這個container運行在背景中 (你可以在docker run --help找到相關資訊)

mysql:tag就是要運行的image版本了

OK! 我們來試試照著做, 我們有Mysql 5.7.9和8.0.0, 我們先試試把玩5.7.9版本, container名稱就叫mysql579好認易記

docker run --name mysql579 -e MYSQL_ROOT_PASSWORD=Nosecret -d mysql:5.7.9

不消2秒, 就這樣完了, 只給了一組亂碼...Mysql真的在運作嗎?

有啊...一個叫mysql579的container真的在運作中了, 看看它跟之前的docker run指令有甚麼分別

首先它的狀態(STATUS)是 Up about a minute, 正在運行中, 並沒有像Hello-world一樣完成就完成了

另外他有一個tcp連接埠3306, 也就是預設的一個mysql連接埠

超容易的不是嗎?! 這樣我們就有一台Mysql了, 想想以往安裝mysql的步驟, 這實在輕鬆太多了.

來試試用MySQL workbench連接看看....怎麼..不行啊...

明明所有東西都正確, 為什麼連接不到? 看看我的Windows 10有沒有3306這個連接埠..

沒有...所以理所當然地MySQL Workbench 不能連接到東西很正常, 甚麼出方出問題?

原來我們起動了的這個mysql579的確有啟用3306埠了, 但只是在這個container的"機器"上

我們可以想像有一台VM, 安裝了Mysql 5.7.9, 這台機器有開啟3306埠...

所以如果我們用workbench連接127.0.0.1 (localhost 本機), 是不能連接到這台mysql579的

要把這個3306埠轉接到我Windows 10上, 我們要改變一下docker run指令去做這個port mapping.

加上-p 指令是要把container的某個port發佈到host主機上,

例如 -p 3306:3306 就是要把container 上的3306埠發佈在host的3306埠上

這次我們用8.0.0版本來測試

docker run --name mysql800 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Nosecret -d mysql:8.0.0

看到分別嗎? 連接埠部份 mysql800 有顯示它的3306有轉接到host的3306埠上

現在我們再用MySQL Workbench連接看看

可以了! 現在我們有一個真正可以用的Mysql資料庫服務了, 看看這個服務的基本資料, 

版本是8.0.0沒錯, 而且是運行在一台64 bits Linux上

要建Database, Table也可以, 就如一台平常的MySQL Database

我們可以把container的服務發佈到host上, 也可以不發佈

不發佈的container port可以在container之間內部連接, 例如一個mysql, php, apache的架構裡

mysql的3306根本不需要開放給人在外部連接之用, 所以就可以用mysql579的方式建立起來.

那如果你要控制mysql579, 可以借助它的mysql command line

要進入mysql579的mysql指令系統, 可以用一個新指令 docker exec

docker exec -it mysql579 mysql -uroot -p

這個指令的意思是想執行(execute) mysql579這個container裡的mysql指令, -it是互動模式的意思

在其他的Mysql 指令模式一樣, 你可以用mysql的所有指令來控制這台資料庫

還是很容易吧, 我們已經感受到docker帶來的方便了, 下一篇我們來看看幾個container之間如何互動

怎樣把幾個container組合成一個更複雜的微系統和處理網絡部份