iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

救救我啊我救我!CRUD 工程師的惡補日記系列 第 33

【Docker】使用環境變數建立容器(以 MySQL 為例)

  • 分享至 

  • xImage
  •  

上一篇介紹如何下載映像檔與啟動容器,算是 hello world 性質的範例。為了讓讀者有更深的感受,本文將透過 Docker 運行 MySQL 資料庫。

除了能看到使用 Docker 來運行軟體的方便性,過程中還會認識如 Docker Hub、環境變數等新東西。最後在 Docker Desktop 的 GUI 展示建立容器的做法。

此篇亦轉載到個人部落格


一、從 Docker Hub 取用映像檔

在開始前,要先知道 Docker Hub 是什麼。它是一個可以發佈映像檔的地方,大家能夠從上面下載映像檔到本地。

在 Docker Hub 可搜尋到 MySQL,並於頁面中找到目前最新的 tag 為「8.2.0」。
mysql-docker-image-page.png
https://ithelp.ithome.com.tw/upload/images/20231128/20131107MRJwbh80Xg.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
https://ithelp.ithome.com.tw/upload/images/20231129/20131107mVQrFqRGcL.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 使用容器

本節我們將回到 Docker Desktop,將使用容器的過程,在 GUI 工具上操作一次,幫助讀者做對照。

在「Images」的頁面,找到「mysql」的映像檔,按下三角形箭頭符號,打開啟動容器前的設置。
docker-desktop-image-list-indicate-mysql.png
https://ithelp.ithome.com.tw/upload/images/20231129/20131107hDPKkLjmb9.png

在視窗中,展開「Option Settings」選單,能看到一些設定值可以填寫。參考下圖,我們填入容器名稱、主機要監聽的 port,以及環境變數。至於「Volumes」會在下一篇文章介紹。

https://ithelp.ithome.com.tw/upload/images/20231129/20131107UXGf8s6UoO.png https://ithelp.ithome.com.tw/upload/images/20231129/201311072qSbEPlsak.png
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
https://ithelp.ithome.com.tw/upload/images/20231129/20131107xZay8dNXC2.png

點擊容器,會來到它的資訊頁面。包含 log 都能在此觀看。
docker-desktop-container-log-mysql.png
https://ithelp.ithome.com.tw/upload/images/20231129/20131107jxLdVZIUAs.png

容器本身會儲存軟體自己產生的資料。例如後端程式會產生許多 log 檔案,它們也是放在容器中,使得佔用空間越來越大。另一方面,當容器刪除了,那些資料也會一起消失。我們不希望遇到哪天要重新建立容器時(例如軟體版本更新),發現忘記備份資料,或搬移十分麻煩的情形。

下一篇會介紹「掛載」,讓本地主機的資料夾,可以直通容器內,便於容器中檔案的管理與持久化。


今日文章到此結束!
最後推廣一下自己的部落格,我是「新手工程師的程式教室」的作者,請多指教/images/emoticon/emoticon41.gif


上一篇
【Docker】映像檔與容器的操作
下一篇
【Docker】透過綁定掛載讓主機連通容器
系列文
救救我啊我救我!CRUD 工程師的惡補日記50
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言