上一篇介紹如何下載映像檔與啟動容器,算是 hello world 性質的範例。為了讓讀者有更深的感受,本文將透過 Docker 運行 MySQL 資料庫。
除了能看到使用 Docker 來運行軟體的方便性,過程中還會認識如 Docker Hub、環境變數等新東西。最後在 Docker Desktop 的 GUI 展示建立容器的做法。
此篇亦轉載到個人部落格。
在開始前,要先知道 Docker Hub 是什麼。它是一個可以發佈映像檔的地方,大家能夠從上面下載映像檔到本地。
在 Docker Hub 可搜尋到 MySQL,並於頁面中找到目前最新的 tag 為「8.2.0」。
mysql-docker-image-page.png
在此將它下載回來。
docker image pull mysql:8.2.0
接著透過指令,建立容器後立即運行。
docker container run --name TestMySQL -p 3306:3306 mysql:8.2.0
3306 是 MySQL 預設的 port 號。
筆者故意不加上 -d
選項,是為了讓容器在前景運行時能直接看見 log。接著會發現執行該指令後沒多久,容器卻自動停止了,且看到如下的 log。
Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
這告訴我們,建立容器時,有些映像檔會要求叫做「環境變數」(environment variable)的東西。
不知道讀者是否有在電腦上直接安裝資料庫的經驗?在過程中,安裝程式難免會要我們提供一些設定值。其中一項便是 root 使用者的密碼,該使用者將擁有整個資料庫系統的最大權限。
回到 Docker,就算是容器,照理說也是要設定 root 的密碼。這項設定值,必須在建立容器時,以環境變數的方式提供。
請刪除原容器,並將啟動容器的指令修改成如下。
docker container run --name TestMySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=000000 mysql:8.2.0
使用 -e
參數可提供環境變數,我們指定密碼為「000000」,再執行新指令。等待一段時間(可能會久一點),資料庫便啟動完成了。
根據 MySQL 的 Docker Hub 頁面,裡面列出了其他可用的環境變數,舉例幾個如下。
MYSQL_ROOT_PASSWORD
:設置系統 root 使用者的密碼。MYSQL_DATABASE
:初次啟動容器時,要建立的資料庫名稱。MYSQL_USER
:設置可存取 MYSQL_DATABASE
資料庫的使用者帳號,其擁有該資料庫的最大權限。MYSQL_PASSWORD
:設置上述使用者的密碼。MYSQL_ALLOW_EMPTY_PASSWORD
:允許 root 使用者不需要密碼,請給予「yes」值。延續前面的例子,假設我們希望啟動 MySQL後,裡面能有一個叫做「demo」的資料庫,而它的使用者帳密分別為 ironman 與 123456,則範例指令如下。
docker container run --name TestMySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=000000 -e MYSQL_DATABASE=demo -e MYSQL_USER=ironman -e MYSQL_PASSWORD=123456 mysql:8.2.0
MySQL 啟動完成後,讀者可使用如「Workbench」的 GUI 工具,來存取資料庫。
mysql-workbench-test-connection.png
在前面啟動 MySQL 的指令,提供了 -p 3306:3306
的參數,代表主機在 3306 port 收到的連線,要轉發到容器的 3306 port。那這個數字是如何得知的呢?
讓我們查看映像檔的資訊,指令寫法為 docker image inspect {映像檔 id | 映像檔名稱:標籤}
。範例寫法如下:
docker image inspect mysql:8.2.0
該指令會印出 JSON 格式的資料。請從當中找到「Config.ExposedPorts」這個物件。
[
{
"Id": "sha256:a3b6608898d600759effd58768b7213bb44a6d58ab3a53495dd88e6b2042a8a4",
"...": "...",
"Config": {
"...": "...",
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"...": "..."
},
"...": "..."
}
]
從映像檔的資訊中,能得知它的容器會監聽哪些 port。上述的 3306 是 MySQL 預設的 port;而 33060 則為安全性較高的 port。一個映像檔可提供多個 port,若不清楚它們的用途,請自行上網查詢確認一下。
本節我們將回到 Docker Desktop,將使用容器的過程,在 GUI 工具上操作一次,幫助讀者做對照。
在「Images」的頁面,找到「mysql」的映像檔,按下三角形箭頭符號,打開啟動容器前的設置。
docker-desktop-image-list-indicate-mysql.png
在視窗中,展開「Option Settings」選單,能看到一些設定值可以填寫。參考下圖,我們填入容器名稱、主機要監聽的 port,以及環境變數。至於「Volumes」會在下一篇文章介紹。
docker-desktop-run-mysql-container-optional-settings-1.png | docker-desktop-run-mysql-container-optional-settings-2.png |
最後按下「Run」按鈕即可運行,並在「Containers」畫面找到該容器。
docker-desktop-container-list-indicate-mysql.png
點擊容器,會來到它的資訊頁面。包含 log 都能在此觀看。
docker-desktop-container-log-mysql.png
容器本身會儲存軟體自己產生的資料。例如後端程式會產生許多 log 檔案,它們也是放在容器中,使得佔用空間越來越大。另一方面,當容器刪除了,那些資料也會一起消失。我們不希望遇到哪天要重新建立容器時(例如軟體版本更新),發現忘記備份資料,或搬移十分麻煩的情形。
下一篇會介紹「掛載」,讓本地主機的資料夾,可以直通容器內,便於容器中檔案的管理與持久化。
今日文章到此結束!
最後推廣一下自己的部落格,我是「新手工程師的程式教室」的作者,請多指教