在現代應用程式開發中,資料庫是不可或缺的核心組件。MySQL 以其高效、可靠與開源的特性,成為了全球最受歡迎的關聯式資料庫之一。然而,傳統的安裝與環境設定過程往往繁瑣且容易產生衝突。Docker 的出現徹底改變了這一局面,它提供了一個輕量級、隔離且一致的環境,讓開發者能夠在數分鐘內快速部署一個乾淨的MySQL Server執行個體,並輕鬆實現資料的持久化、備份與遷移。
本文將作為一份詳盡的指南,帶您從零開始,一步步學習如何使用dockermysql安裝、設定並管理。我們將涵蓋從基礎的映像檔拉取、容器啟動,到進階的資料持久化、遠端連線設定、使用 Docker Compose 進行多容器編排,以及最終的資料庫備份策略。無論您是 Docker 新手還是希望深化應用的開發者,都能從中獲益。
基礎安裝與啟動
部署 MySQL 的第一步是從 Docker Hub 上獲取官方的docker image,並將其運行成為一個docker container。
步驟 1:搜尋並拉取 MySQL 映像檔
首先,您可以使用 docker search 命令來尋找官方提供的 MySQL 映像檔。
docker search mysql
在搜尋結果中,請認明 OFFICIAL 標示為 [OK] 的項目,這代表由官方維護,品質與安全性更有保障。
接著,使用 docker pull 命令拉取映像檔。強烈建議指定具體的版本號(例如 mysql:8 或 mysql:8.0.33),也就是指定一個tag,而不是使用 latest 標籤。這可以確保您在不同環境中部署的版本一致,避免因版本自動更新導致的非預期問題。
# 拉取 MySQL 8 的最新子版本
docker pull mysql:8
下載完成後,可透過 docker images 命令查看本機已有的映像檔列表。
docker images mysql
步驟 2:運行 MySQL 容器
獲取映像檔後,使用 docker run 命令來啟動一個 MySQL 容器。一個基本的啟動command如下:
docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YourStrongPassword123 -d mysql:8
這個指令包含了幾個重要的參數,以下是詳細說明:
參數 | 全名 | 說明 |
---|---|---|
–name | 為容器指定一個易於識別的名稱,例如 mysql-container。 | |
-p | –publish | 將主機的端口映射到容器的端口。格式為 主機端口:容器端口。3306:3306 表示將主機的 3306 端口流量轉發到容器的 3306 端口。 |
-e | –env | 設定環境變數。MYSQL_ROOT_PASSWORD 是啟動 MySQL 容器時必須設定的變數,用於初始化 root 使用者的password。 |
-d | –detach | 背景執行模式。容器會在背景啟動並持續運行,讓您可以繼續使用終端機。 |
執行後,可使用 docker ps 來確認容器是否正在運行,執行時,您會看到如container id image command等欄位資訊,或使用docker logs查看啟動日誌。
資料持久化與自訂組態
Docker 容器本身是無狀態的,這意味著如果容器被刪除,內部儲存的所有資料(包括您的資料庫檔案)將會遺失。為了解決這個問題,我們必須使用 Docker 的 資料卷 (Volume) 功能,將容器內的資料目錄掛載到主機上。
使用資料卷 (Volume)
我們可以透過 -v 或 –volume 參數將容器內的資料目錄與主機上of the對應目錄進行綁定。對於 MySQL,主要有兩個重要的目錄需要掛載:
- 資料目錄 (/var/lib/mysql):儲存所有資料庫的實際檔案。
- 組態目錄 (/etc/mysql/conf.d):存放自訂的 .cnf 組態檔,可用於修改字元集、時區等設定。
以下是一個整合了資料卷掛載的 docker run 指令範例:
docker run --name mysql-pro \
-p 3306:3306 \
-v /my/custom/mysql/data:/var/lib/mysql \
-v /my/custom/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=YourStrongPassword123 \
-d mysql:8
說明:
- -v /my/custom/mysql/data:/var/lib/mysql:將主機上的 /my/custom/mysql/data 目錄(請替換為您自己的路徑)掛載到容器的資料目錄。即使容器被刪除,資料依然安全地保存在主機上。
- -v /my/custom/mysql/conf:/etc/mysql/conf.d:將主機上的 /my/custom/mysql/conf 目錄掛載到容器的組態目錄。您可以在此目錄下建立 my.cnf 檔案來覆寫in the容器內的預設組態。
進入容器與遠端連線設定
容器成功運行後,我們需要進入容器內部設定遠端連線權限,以便資料庫管理工具(如 MySQL Workbench, DBeaver)可以存取。
步驟 1:進入容器
使用 docker exec 命令進入正在運行的容器的互動式終端,通常是一個bashshell。
docker exec -it mysql-pro bash
步驟 2:登入 MySQL 並建立新使用者
進入容器後,使用 root 帳號(擁有完整的root權限)和您設定的密碼登入 MySQL。
mysql -u root -p
為了安全起見,不建議直接使用 root 帳號進行遠端連線。最佳實踐是建立一個專用的使用者,並授予其必要的權限。
-- 建立一個名為 'remote_user' 的使用者,密碼為 'AnotherStrongPassword',允許從任何 IP ('%'),也就是任何主機名,進行連線。
-- 也可以建立資料表,例如 CREATE TABLE users (id INT, name NVARCHAR(50));
CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'AnotherStrongPassword';
-- 授予該使用者對所有database的所有權限。
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 重新載入權限設定,使其立即生效。
FLUSH PRIVILEGES;
-- 退出 MySQL
EXIT;
現在,您就可以使用任何資料庫客戶端,透過主機的 IP 位址、映射的端口 (3306) 以及剛剛建立的 remote_user 帳號密碼來連線了。在連線後,您可以執行show databases;來檢視目前所有的資料庫。
使用 Docker Compose 進行多容器管理
當您的應用程式不只有一個資料庫,還包含後端服務、前端介面時,手動管理多個 docker run 指令會變得非常複雜。Docker Compose 正是為了解決這個問題而生。它允許您使用一個 YAML 檔案來定義和管理整個應用程式的服務堆疊,包括the mysql服務。
在您的專案根目錄下建立一個名為 docker-compose.yml 的檔案:
version: '3.8'
services:
mysql:
image: mysql:8
container_name: mysql_service
restart: always
environment:
MYSQL_ROOT_PASSWORD: YourStrongPassword123
MYSQL_DATABASE: my_app_db
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
app:
# 假設您有一個後端應用程式
# build: .
image: your-app-image
restart: always
ports:
- "8080:8080"
depends_on:
- mysql
environment:
DB_HOST: mysql # 服務名稱 'mysql' 會自動成為網路中的主機名稱,指向MySQL server
DB_USER: root
DB_PASS: YourStrongPassword123
DB_NAME: my_app_db
volumes:
mysql_data:
使用 Docker Compose,只需簡單的指令即可啟動或停止整個應用程式with the對應的網路設定:
# 在背景啟動所有服務
docker-compose up -d
# 停止並移除所有服務、網路和資料卷
docker-compose down
資料庫備份
基於我們已經將資料目錄掛載到主機上,進行備份變得非常簡單。我們可以利用 docker exec 在運行的MySQL servercontainer內執行 mysqldump 工具,並將備份檔案直接輸出到掛載的資料卷中。
docker exec mysql_service sh -c 'mysqldump -u root -p"MYSQL_ROOT_PASSWORD" my_app_db > /var/lib/mysql/backup_(date +%Y%m%d).sql'
這個指令會在 mysql_service 容器內執行 mysqldump,將 my_app_db 資料庫備份成一個帶有日期的 .sql 檔案,並儲存在 /var/lib/mysql 目錄下,也就是您掛載到主機的資料目錄。
常見問題 (FAQ)
Q1: 為什麼我無法從外部連線到 MySQL 容器?
A1: 請檢查以下幾點:
- 端口映射:確認 docker run 或 docker-compose.yml 中已使用 -p 或 ports 正確映射了 3306 端口。
- 防火牆:檢查您的主機或雲端服務商的防火牆規則,是否允許外部流量訪問您映射的主機端口。
- MySQL 使用者權限:確認您用來連線的使用者帳號的主機部分是 ‘%’ (任何主機) 或您指定的來源 IP,而不是 ‘localhost’。
Q2: 刪除容器 (docker rm) 後,我的資料會消失嗎?
A2: 這取決於您是否使用了資料卷。如果您在啟動容器時,使用 -v 將容器的 /var/lib/mysql 目錄掛載到主機上,那麼資料會被保留在主機上,即使刪除容器也不會遺失。若沒有掛載,資料將隨容器的刪除而永久消失。在刪除容器前,您可能需要先執行docker stop [容器名稱]來停止它。注意,docker rm是刪除容器,若要刪除映像檔則是使用docker rmi指令。
Q3: How to修改已建立容器的 root 密碼?
A3: 您可以先 docker exec -it [容器名稱] bash 進入容器,然後登入 MySQL (mysql -u root -p,輸入舊密碼),最後執行 SQL 指令 ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘YourNewStrongPassword’; 來修改密碼。此處的localhost identified by是SQL語法的一部分。
Q4: latest 標籤代表什麼版本?在生產環境中建議使用嗎?
A4: latest 標籤通常指向該mysql community server映像檔的最新穩定版本。在開發和測試時使用很方便,但強烈不建議在生產環境中使用。因為 latest 指向的版本會隨著官方發布新版而改變,這可能導致您在重新部署時拉取到一個未經充分測試的新版本,引發非預期的錯誤。生產環境應始終鎖定具體的版本號(如 mysql:8.0.33)。
總結
透過 Docker 來管理 MySQL,我們不僅簡化了安裝與設定的複雜性,更獲得了環境一致性、快速部署與易於管理等巨大優勢。本文從基礎的容器操作,到進階的資料持久化、網路設定、多容器編排與備份策略,提供了一套完整的實踐流程to use Docker管理MySQL。掌握這些技巧,you can顯著提升您的開發效率與應用程式的穩定性,讓您更專注於業務邏輯的實現,而非繁雜的環境問題。