如何在 Docker 容器中運行 MySQL 數據庫

使用本地容器化數據庫提供了靈活性並簡化了設置。它允許在不涉及傳統數據庫安裝的複雜性的情況下,近似地複製生產環境。Docker簡化了這個過程,只需幾個命令就可以在隔離的容器中部署、管理和擴展數據庫。

在這個指南中,你將學習如何:

  • 運行一個本地容器化數據庫
  • 訪問容器化數據庫的shell
  • 從你的主機連接到容器化數據庫
  • 在卷中持久的數據庫數據
  • 清理實驗室

提條件

要遵循這個指南,你必須安裝Docker。請參考Docker網站上的安裝說明。

容器化數據庫設置的逐步指南

1. 運行一個本地容器化數據庫

最流行的數據庫系統,如MySQLPostgreSQL以及MongoDB,在Docker Hub上有官方的Docker镜像。這些精選的镜像遵循最佳實踐,確保您能夠使用最新的功能和安全更新。

要開始使用,請訪問Docker Hub並搜索您感興趣的數據庫。每個镜像頁面都提供了如何運行容器、自定義您的設置以及配置數據庫以滿足您需求的詳細說明。有關本指南中提供的MySQL镜像的更多信息,請參考Docker Hub上的MySQL镜像頁面。

要運行數據庫容器,您可以使用Docker Desktop GUI或CLI。要使用CLI運行容器,在終端中運行以下命令:

Shell

 

$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest

 

在這個命令中:

  • --name my-mysql 將名稱my-mysql分配給您的容器,以便於引用。
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw 設置 MySQL 的 root 密碼為 my-secret-pw。請將 my-secret-pw 替換為您選擇的 secure 密碼。
  • -e MYSQL_DATABASE=mydb 可選地創建一個名為 mydb 的數據庫。您可以將 mydb 更改為您期望的數據庫名稱。
  • -d 以分離模式運行容器,意味著它將在後台運行。
  • mysql:latest 指定您想要使用 MySQL 圖像的最新版本。

為了驗證您的容器正在運行,請在終端中運行 docker ps

Shell

 

run docker ps

您也可以在 Docker Desktop 控制台中查看相同的信息:

2. 存取容器化數據庫的 Shell

當數據庫在 Docker 容器中運行時,您可能需要存取其 Shell 來管理數據庫、執行命令或進行管理任務。Docker 提供了一種使用 docker exec 命令簡單實現此功能的方式。此外,如果您偏好圖形界面,也可以使用 Docker Desktop 的 GUI。

如果您還沒有運行的數據庫容器,請參考 運行本地容器化數據庫。要使用 CLI 存取 MySQL 容器的終端,您可以使用以下 docker exec 命令。

Shell

docker exec -it my-mysql bash 

在這個命令中:

  • docker exec 告訴 Docker 您想在運行的容器中執行命令。
  • -it 確保您存取的終端是交互式的,這樣您就可以在其中輸入命令。
  • my-mysql 是您的 MySQL 容器的名稱。如果您在運行時為容器指定了不同的名稱,請使用那個名稱。
  • 您想在容器內运行的命令是 bash。它會打開 一個 Bash shell,讓您與容器的文件系統和安裝的應用程序進行交互。
  • 執行此命令後,您將獲得訪問您 MySQL 容器內 bash shell 的權限,從中您可以直接管理您的 MySQL 服务器。您可以運行 Exit 來返回您的終端。

檢查 Docker 容器是否正在運行。

Shell

 

run docker ps

一旦您進入了容器的終端,您可以運行該容器中可用的任何工具。以下(圖像)示例顯示了在容器中使用MySQL 來列出數據庫。

Shell

Mysql -u root -p

MySQL

 

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

5 rows in set (0.00 sec)

 

mysql> create database testdb;

Query OK, 1 row affected (0.11 sec)

 

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| sys                |

| testdb             |

+--------------------+

6 rows in set (0.00 sec)

 

mysql> connect testdb;

Connection id:    12

Current database: testdb

 

mysql> SHOW TABLES;

Empty set (0.02 sec)

 

mysql> create table test (id numeric,fname varchar(20));

Query OK, 0 rows affected (0.10 sec)

 

mysql> SHOW TABLES;

+------------------+

| Tables_in_testdb |

+------------------+

| test             |

+------------------+

1 row in set (0.00 sec)

 

mysql> insert into test values (1,'arvind');

Query OK, 1 row affected (0.08 sec)

 

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from test;

+------+--------+

| id   | fname  |

+------+--------+

|    1 | arvind |

+------+--------+

1 row in set (0.00 sec)

我們在測試表中創建的表和保存的數據只有在使用同一個容器時才會持續存在;一旦我們重新創建或構建新的容器,所有數據都會丟失。

您可以通過退出容器然後重新登錄到容器數據庫來驗證數據是否存在。只要容器正在運行,您會看到數據仍然存在於數據庫中。

3. 從您的宿主機連接到容器化的數據庫

從主機連接到容器化的數據庫涉及到將容器內的端口映射到主機上的端口。這個過程可以確保容器內的數據庫能通過主機的網絡訪問。對於MySQL來說,默認端口是3306。通過暴露這個端口,您可以在主機上使用各種數據庫管理工具或應用程序與您的MySQL數據庫互動。

在開始之前,您必須刪除本指南中之前運行的所有容器。為了停止並刪除容器,可以:

  • 在終端中運行docker remove --force my-mysql來刪除名為my-mysql的容器;
  • 或者在Docker Dashboard中,在容器的容器視圖旁邊選擇刪除图标。

接下來,您可以使用Docker桌面GUI或CLI運行帶有映射端口的容器。

Shell

 

docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest

在這個命令中,-p 3307:3306將主機上的端口3307映射到容器中的端口3306

4. 在卷中持久數據庫數據

在Docker卷中持久數據庫數據對於確保數據在容器重啟和刪除後仍然存在是必要的。Docker卷讓您能夠將數據庫文件存儲在容器可寫層之外,這樣就可以升級容器、切換基礎镜像並共享數據而不會丟失。您可以使用Docker CLI或Docker桌面GUI將卷附加到數據庫容器。

注意:如前所述,在“連接至容器化數據庫”章節中,在您開始之前,您必須刪除為本指南先前運行的任何容器。

接下來,您可以使用 Docker Desktop GUI 或 CLI 來運行帶有卷的容器。

要將數據庫容器與卷一起運行,請在您的 docker run 指令中包括 —v 選項。這指定了卷名和容器內數據庫存儲數據的路徑。如果卷不存在,Docker 將自動為您創建它。

要運行一個帶有卷的數據庫容器,請驗證數據是否存在。運行容器並附加卷。

Shell

docker run –name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latest

此命令將名為 my-db-volume 的卷掛載到容器中的 /var/lib/mysql 目錄。

在數據庫中創建一些數據。使用 docker exec 指令在容器內運行 MySQL 並創建一個表。

Shell

docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"

 

此命令使用容器中的 MySQL 工具創建一個名為 mytable 的表,其中有一個名為 column_name 的列,最後,它插入一個值為 value 的數據。

停止並刪除容器。如果沒有卷,當您刪除容器時,您創建的表將會丟失。

Shell

docker remove --force my-mysql

使用卷啟動一個新的容器。這次,您不需要指定任何環境變量,因為配置已經保存在卷中。

Shell

docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest

驗證您創建的表仍然存在。然後,再次使用 docker exec 指令在容器內運行 MySQL。

Shell

docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"

 

此命令使用容器中的 MySQL 工具從表格中選擇所有記錄。您應該看到如下輸出。

SQL

 

column_name

value

5. 清理 MySQL 容器 鏡像

要刪除容器,請使用 docker remove 命令,並將容器名稱或 ID 以空格分隔。例如:

Shell

 

docker remove --force 90b8831a4b8
docker remove --force 36252896d6ff
docker remove --force d86dff3809e8

結論

終極而言,使用 Docker 運行 MySQL 提供了一個便携、可擴展且高效的數據庫管理解決方案。Docker 的隔離容器有助於簡化部署,減少兼容性問題,並優化資源使用。Docker 通過允許容易的版本控制和環境重置,支持快速開發和測試。它適合於微服務中管理 MySQL 數據庫,使其更容易部署和擴展,同時保持強勁的性能。

Source:
https://dzone.com/articles/guide-for-running-mysql-database-in-docker-container