在現代化應用開發架構中,容器化技術已成為實現環境一致性與快速部署的關鍵。將 MySQL 這類關聯式資料庫部署於 Docker 容器內,不僅能簡化傳統安裝與設定的繁瑣流程,更能確保開發、測試與生產環境的統一性。本篇文章旨在提供一套標準化的操作程序,從啟動一個配置好的 MySQL 容器開始,逐步引導讀者進入容器的互動式終端,並透過原生命令列工具執行資料定義與操作。此流程不僅展示了 Docker 在狀態管理應用上的實用性,特別是如何透過數據卷實現資料持久化,也突顯了容器化資料庫在敏捷開發與維運實踐中的核心價值,為開發者建立一套可重複、可隔離的管理模式。
在 Docker 中操作 MySQL:啟動容器、連接客戶端與數據庫管理
本節將引導您完成啟動 MySQL 容器、連接到 MySQL 客戶端(CLI)、選擇要操作的數據庫、創建數據表以及插入數據的完整流程。
啟動 MySQL 容器並驗證運行狀態
在完成環境配置和映像檔下載後,我們將啟動 MySQL 容器。
執行
docker run命令: 我們之前已經定義了啟動命令,包含數據持久化、用戶名密碼設置等。再次執行該命令(或在此處使用一個簡化版本,僅設置密碼和映像檔):sudo docker run -v /mysql/data:/var/lib/mysql --name mysqldb -d \ -e MYSQL_ROOT_PASSWORD='' \ -e MYSQL_DATABASE='mysqldb' \ -e MYSQL_USER='mysql' \ -e MYSQL_PASSWORD='mysql' \ -e MYSQL_ALLOW_EMPTY_PASSWORD='yes' \ mysql:latest執行此命令後,Docker 會創建並啟動一個名為
mysqldb的 MySQL 容器,並使其在後台運行。列出運行中的容器: 為了確認容器是否成功啟動並正在運行,可以使用
docker ps命令。sudo docker ps您應該能在列表中看到名為
mysqldb的容器,其狀態為Up,並且映射了相應的端口(如果之前有配置)。
連接至 MySQL CLI Shell
在容器啟動後,我們需要進入容器內部,以便執行 MySQL 的命令行客戶端(CLI)命令。
啟動交互式終端: 使用
docker exec -it命令,指定容器名稱(mysqldb)或容器 ID,並附加bash命令來啟動一個交互式 Shell。sudo docker exec -it mysqldb bash執行此命令後,您的終端提示符將變為容器內的 Shell 提示符。
啟動 MySQL CLI: 在容器的 Shell 中,執行
mysql命令來啟動 MySQL 客戶端。mysql如果配置正確,您將看到 MySQL 的版本資訊和
mysql>提示符,表示您已成功連接到 MySQL 伺服器。
設置要使用的數據庫
在 MySQL 中,操作數據通常需要先選擇一個目標數據庫。
嘗試使用不存在的數據庫: 如果您嘗試使用一個不存在的數據庫,例如
test,MySQL 會報錯。mysql> use test輸出將顯示:
ERROR 1049 (42000): Unknown database 'test'選擇已創建的數據庫: 在啟動容器時,我們通過
-e MYSQL_DATABASE='mysqldb'環境變數指定創建了一個名為mysqldb的數據庫。現在,我們使用use命令來選擇它。mysql> use mysqldb成功後,MySQL 會提示「Database changed.」。
在 MySQL 中創建數據表
在選定了數據庫後,我們可以開始創建數據表。
創建
Catalog表: 執行以下 SQL 語句來創建一個名為Catalog的表,其結構與之前在 Oracle 中創建的類似。mysql> CREATE TABLE Catalog( CatalogId INTEGER PRIMARY KEY, Journal VARCHAR(25), Publisher VARCHAR(25), Edition VARCHAR(25), Title VARCHAR(45), Author VARCHAR(25) );INTEGER PRIMARY KEY:定義主鍵為整數類型。VARCHAR(n):定義變長字串類型,最大長度為n。請注意,MySQL 使用VARCHAR而非VARCHAR2。
執行後,MySQL 會返回「Query OK」的確認訊息。
向數據表中添加數據
創建表後,就可以向其中插入數據了。
插入單行數據: 使用
INSERT INTO語句向Catalog表中添加一條記錄。mysql> INSERT INTO Catalog VALUES('1','Oracle Magazine','Oracle Publishing','November December 2013','Engineering as a Service','David A. Kelly');- 注意,MySQL 在處理數字字串時通常比較寬鬆,但建議在插入數字類型時直接使用數字,例如
1而非'1'。
執行後,MySQL 會返回「Query OK」以及影響的行數(例如「1 row affected」)。
- 注意,MySQL 在處理數字字串時通常比較寬鬆,但建議在插入數字類型時直接使用數字,例如
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "MySQL Container (mysqldb)" as MySQLContainer
object "MySQL Server" as MySQLServer
object "MySQL Client (CLI)" as MySQLClient
partition "MySQL 容器操作與數據管理" {
User --> DockerCLI : 執行 docker run ... (啟動容器)
DockerCLI --> DockerDaemon : 請求運行容器
DockerDaemon --> MySQLContainer : 啟動 mysqldb 容器
User --> DockerCLI : 執行 docker ps (驗證容器運行)
DockerCLI --> DockerDaemon : 請求列出運行中容器
DockerDaemon --> User : 顯示 mysqldb 容器狀態 (Up)
User --> DockerCLI : 執行 docker exec -it mysqldb bash (進入容器)
DockerCLI --> MySQLContainer : 啟動容器內 bash 進程
MySQLContainer --> User : 提供容器 Shell 提示符
User --> MySQLClient : 執行 mysql 命令 (啟動 CLI)
MySQLClient --> MySQLServer : 連接至 MySQL 伺服器
MySQLServer --> User : 顯示 mysql> 提示符
User --> MySQLClient : 執行 use test
MySQLClient --> MySQLServer : 嘗試切換到 test 數據庫
MySQLServer --> User : 報錯 "Unknown database 'test'"
User --> MySQLClient : 執行 use mysqldb
MySQLClient --> MySQLServer : 切換到 mysqldb 數據庫
MySQLServer --> User : 回應 "Database changed."
User --> MySQLClient : 執行 CREATE TABLE Catalog(...)
MySQLClient --> MySQLServer : 發送 CREATE TABLE 語句
MySQLServer --> User : 回應 "Query OK"
User --> MySQLClient : 執行 INSERT INTO Catalog VALUES(...)
MySQLClient --> MySQLServer : 發送 INSERT 語句
MySQLServer --> User : 回應 "Query OK, 1 row affected"
}
@enduml看圖說話:
此圖示展示了在 Docker 容器中啟動 MySQL 伺服器後,如何進行後續的數據庫操作。首先,使用者透過 docker run 命令啟動了名為 mysqldb 的 MySQL 容器,並通過 docker ps 命令確認其正在運行。接著,使用者利用 docker exec -it mysqldb bash 命令進入容器的 Shell 環境,然後執行 mysql 命令啟動 MySQL 的命令行客戶端。客戶端連接到 MySQL 伺服器後,使用者嘗試使用 use test 命令切換到一個不存在的數據庫,MySQL 伺服器報錯。隨後,使用者正確地使用 use mysqldb 命令切換到之前創建的 mysqldb 數據庫。在此基礎上,使用者執行 CREATE TABLE Catalog(...) 命令來定義一個新的數據表,MySQL 伺服器確認創建成功。最後,使用者使用 INSERT INTO Catalog VALUES(...) 命令向表中添加了一條記錄,MySQL 伺服器確認數據已成功寫入。整個流程體現了從容器啟動到數據庫基本操作的完整鏈條。
MySQL 數據庫操作:查詢、列表、退出與容器管理
本節將繼續引導您完成 MySQL 數據庫的進階操作,包括查詢數據、列出數據庫和表、安全退出客戶端與容器,以及如何停止運行的 Docker 容器。
查詢數據表中的數據
在成功插入數據後,我們可以使用 SELECT 語句來檢索和查看表中的內容。
- 執行查詢語句:
使用
SELECT * FROM Catalog;命令,可以獲取Catalog表中的所有欄位和所有行。執行後,您將看到之前插入的那一行數據被顯示出來,驗證了數據的完整性。mysql> SELECT * FROM Catalog;
MySQL 表名與大小寫敏感性
值得注意的是,MySQL 在處理數據庫對象名稱(如表名、數據庫名)時,其大小寫敏感性取決於底層操作系統的配置。
- 案例分析:在本章節使用的 Red Hat Enterprise Linux 7 (RHEL 7.1) 環境中,MySQL 表名是大小寫敏感的。如果您嘗試使用與實際表名
Catalog大小寫不符的名稱進行查詢,例如CATALOG,MySQL 將會報錯,提示找不到該表。預期會出現類似「ERROR 1146 (42S02): Table ‘mysqldb.CATALOG’ doesn’t exist」的錯誤訊息。這與 Oracle Database 在某些配置下對表名大小寫不敏感的行為有所不同。mysql> SELECT * FROM CATALOG;
列出數據庫與表
在 MySQL 客戶端中,可以方便地查看當前伺服器實例中存在的所有數據庫,以及特定數據庫中的所有表。
列出所有數據庫: 使用
SHOW DATABASES;命令。mysql> SHOW DATABASES;輸出將列出系統預設的數據庫(如
information_schema,mysql,performance_schema)以及我們之前創建的mysqldb數據庫。列出特定數據庫中的表: 在選定了目標數據庫(例如
mysqldb)後,可以使用SHOW TABLES;命令來列出該數據庫中的所有表。mysql> SHOW TABLES;這將會列出
Catalog表。
退出 MySQL CLI 與 TTY 終端
完成所有數據庫操作後,需要安全地退出客戶端和容器。
退出 MySQL CLI: 在 MySQL 客戶端提示符下,輸入
exit命令。mysql> exitMySQL 客戶端將會關閉,並顯示「Bye」訊息,返回到容器的 Shell 提示符。
退出 TTY 終端: 在容器的 Shell 提示符下,再次輸入
exit命令。root@969088c84a4f:/# exit這將關閉與容器的交互式終端連接,您將返回到主機的 Shell 提示符。
停止 Docker 容器
當不再需要 MySQL 容器時,可以將其停止,以釋放系統資源。
停止容器: 使用
docker stop命令,並指定容器名稱或 ID。sudo docker stop mysqldb命令執行後,Docker 會向容器發送停止信號,容器內的 MySQL 伺服器將會正常關閉。
驗證容器狀態: 再次執行
docker ps命令。sudo docker ps這次,
mysqldb容器將不會出現在運行中的容器列表中,表示它已被成功停止。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "MySQL Container (mysqldb)" as MySQLContainer
object "MySQL Server" as MySQLServer
object "MySQL Client (CLI)" as MySQLClient
object "Host Machine" as HostMachine
partition "MySQL 數據查詢與退出" {
User --> MySQLClient : 執行 SELECT * FROM Catalog;
MySQLClient --> MySQLServer : 發送查詢語句
MySQLServer --> User : 返回 Catalog 表數據
User --> MySQLClient : 執行 SHOW DATABASES;
MySQLClient --> MySQLServer : 請求數據庫列表
MySQLServer --> User : 列出所有數據庫 (含 mysqldb)
User --> MySQLClient : 執行 SHOW TABLES;
MySQLClient --> MySQLServer : 請求表列表
MySQLServer --> User : 列出 Catalog 表
User --> MySQLClient : 執行 exit
MySQLClient --> User : 關閉 CLI, 返回容器 Shell
User --> HostMachine : 執行 exit (在容器 Shell 中)
HostMachine --> User : 退出容器 Shell, 返回主機 Shell
}
partition "Docker 容器管理" {
User --> DockerCLI : 執行 docker stop mysqldb
DockerCLI --> DockerDaemon : 請求停止容器
DockerDaemon --> MySQLContainer : 發送停止信號
MySQLContainer --> MySQLServer : 執行正常關閉流程
MySQLServer --> DockerDaemon : 標記容器為已停止
User --> DockerCLI : 執行 docker ps
DockerCLI --> DockerDaemon : 請求列出運行中容器
DockerDaemon --> User : 不顯示 mysqldb 容器
}
@enduml看圖說話:
此圖示描繪了 MySQL 數據庫操作的後續步驟,包括數據查詢、列表展示、安全退出以及 Docker 容器的停止管理。首先,使用者通過 SELECT * FROM Catalog; 命令查詢並成功獲取了表中已插入的數據。接著,使用者執行 SHOW DATABASES; 和 SHOW TABLES; 命令,分別列出了伺服器上的所有數據庫(包括新創建的 mysqldb)以及 mysqldb 數據庫中的 Catalog 表,展示了數據庫結構。在完成所有數據庫操作後,使用者在 MySQL CLI 中輸入 exit 退出客戶端,隨後在容器的 Shell 中再次輸入 exit 退出交互式終端,實現了雙重退出。最後,使用者在主機上執行 docker stop mysqldb 命令,Docker Daemon 接收指令後,向 mysqldb 容器發送停止信號,容器內的 MySQL 伺服器進行正常關閉流程,容器狀態變為已停止。通過再次執行 docker ps,使用者確認 mysqldb 容器已不再列於運行中的列表中。整個流程涵蓋了從數據操作到資源釋放的完整生命週期管理。
權衡此技術流程的投入與產出後,可以清晰地看到容器化技術為資料庫管理帶來的顯著效能提升。本文所展示的 Docker 與 MySQL 整合路徑,不僅是單純的技術操作指南,更是一套完整的開發環境生命週期管理範式。它將環境配置、服務啟動、數據操作到資源釋放等環節,無縫串聯成一個可重複、可隔離且高度一致的標準流程。相較於傳統的本機安裝模式,這種方法徹底解決了「在我電腦上可以跑」的環境依賴性困境,並將潛在的配置風險(如文中所提的表名大小寫敏感性差異)封裝在可控的容器內部,顯著降低了協作與部署的複雜度。
展望未來,這種將基礎設施即程式碼(IaC)理念應用於開發環境的實踐,正快速成為現代軟體工程的標準配備。隨著 CI/CD 流程的普及,熟練掌握容器化資料庫管理的能力,已從加分項轉變為開發者與維運人員的核心職能。
綜合評估後,玄貓認為,對於追求高效能與穩定性的技術團隊而言,將此工作流內化為標準作業程序,不僅是技術選型的優化,更是對開發文化與工程紀律的根本性提升。