使用容器化資料庫
使用本地容器化資料庫提供靈活性和易於設定,使您能夠緊密地映象生產環境,而無需傳統資料庫安裝的開銷。Docker 簡化了此過程,使您能夠僅使用幾個命令在隔離的容器中部署、管理和擴充套件資料庫。
在本指南中,您將學習如何
- 執行本地容器化資料庫
- 訪問容器化資料庫的 shell
- 從您的主機連線到容器化資料庫
- 從另一個容器連線到容器化資料庫
- 在卷中持久化資料庫資料
- 構建自定義資料庫映象
- 使用 Docker Compose 執行資料庫
本指南使用 MySQL 映象作為示例,但這些概念可以應用於其他資料庫映象。
先決條件
要按照本指南進行操作,您必須安裝 Docker。要安裝 Docker,請參閱 獲取 Docker。
執行本地容器化資料庫
大多數流行的資料庫系統(包括 MySQL、PostgreSQL 和 MongoDB)在 Docker Hub 上都提供 Docker 官方映象。這些映象是一組經過精心挑選的映象,遵循最佳實踐,確保您可以訪問最新的功能和安全更新。要開始使用,請訪問 Docker Hub 並搜尋您感興趣的資料庫。每個映象的頁面都提供了有關如何執行容器、自定義設定以及根據您的需要配置資料庫的詳細說明。有關本指南中使用的 MySQL 映象的更多資訊,請參閱 Docker Hub MySQL 映象 頁面。
要執行資料庫容器,您可以使用 Docker Desktop GUI 或 CLI。
要使用 CLI 執行容器,請在終端中執行以下命令
$ 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 替換為您選擇的安全密碼。-e MYSQL_DATABASE=mydb
可選地建立一個名為 mydb 的資料庫。您可以將 mydb 更改為您想要的資料庫名稱。-d
以分離模式執行容器,這意味著它在後臺執行。mysql:latest
指定您要使用最新版本的 MySQL 映象。
要驗證您的容器是否正在執行,請在終端中執行 docker ps
要使用 GUI 執行容器
在 Docker 儀表板中,選擇視窗頂部的全域性搜尋。
在搜尋框中指定
mysql
,如果尚未選擇,請選擇映象
選項卡。將滑鼠懸停在
msyql
映象上,然後選擇執行
。將顯示“執行新容器”模型。展開“可選設定”。
在可選設定中,指定以下內容
- 容器名稱:
my-mysql
- 環境變數:
MYSQL_ROOT_PASSWORD
:my-secret-pw
MYSQL_DATABASE
:mydb
- 容器名稱:
選擇
執行
。在 Docker 儀表板中開啟“容器”檢視,以驗證您的容器是否正在執行。
訪問容器化資料庫的 shell
當您在 Docker 容器內執行資料庫時,您可能需要訪問其 shell 來管理資料庫、執行命令或執行管理任務。Docker 提供了一種使用 docker exec
命令直接執行此操作的簡便方法。此外,如果您喜歡使用圖形介面,可以使用 Docker Desktop 的 GUI。
如果您尚未執行資料庫容器,請參閱 執行本地容器化資料庫。
要使用 CLI 訪問 MySQL 容器的終端,您可以使用以下 docker exec
命令。
$ docker exec -it my-mysql bash
在此命令中
docker exec
告訴 Docker 您要在一個正在執行的容器中執行命令。-it
確保您訪問的終端是互動式的,這樣您就可以向其中輸入命令。my-mysql
是您的 MySQL 容器的名稱。如果您在執行容器時將其命名為其他名稱,請使用該名稱。bash
是您要在容器內執行的命令。它將開啟一個 bash shell,使您可以與容器的檔案系統和已安裝的應用程式進行互動。
執行此命令後,您將被授予訪問 MySQL 容器內 bash shell 的許可權,從中您可以直接管理您的 MySQL 伺服器。您可以執行 exit
返回到您的終端。
- 開啟 Docker 儀表板並選擇“容器”檢視。
- 在容器的“操作”列中,選擇“顯示容器操作”,然後選擇“在終端中開啟”。
在此終端中,您可以訪問 MySQL 容器內的 shell,從中您可以直接管理您的 MySQL 伺服器。
訪問容器的終端後,您可以執行該容器中可用的任何工具。以下示例顯示了在容器中使用 mysql
列出資料庫。
# mysql -u root -p
Enter password: my-secret-pw
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
從您的主機連線到容器化資料庫
從您的主機機器連線到容器化資料庫涉及將容器內的埠對映到您主機機器上的埠。此過程確保容器內的資料庫可以透過主機機器的網路訪問。對於 MySQL,預設埠為 3306。透過公開此埠,您可以使用主機機器上的各種資料庫管理工具或應用程式與您的 MySQL 資料庫進行互動。
在開始之前,您必須刪除之前為本指南執行的任何容器。要停止和刪除容器,請執行以下任一操作
- 在終端中,執行
docker remove --force my-mysql
刪除名為my-mysql
的容器。 - 或者,在 Docker 儀表板中,在“容器”檢視中選擇您容器旁邊的“刪除”圖示。
接下來,您可以使用 Docker Desktop GUI 或 CLI 執行帶有對映埠的容器。
在終端中執行以下命令。
$ 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。
要驗證埠是否已對映,請執行以下命令。
$ docker ps
您應該看到如下所示的輸出。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eb776cfd73c mysql:latest "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp my-mysql
要使用 GUI 執行容器
在 Docker 儀表板中,選擇視窗頂部的全域性搜尋。
在搜尋框中指定
mysql
,如果尚未選擇,請選擇映象
選項卡。將滑鼠懸停在
msyql
映象上,然後選擇執行
。將顯示“執行新容器”模型。展開“可選設定”。
在可選設定中,指定以下內容
- 容器名稱:
my-mysql
- 主機埠 針對 3306/tcp 埠:
3307
- 環境變數:
MYSQL_ROOT_PASSWORD
:my-secret-pw
MYSQL_DATABASE
:mydb
- 容器名稱:
選擇
執行
。在“容器”檢視中,驗證埠是否已在“埠”列下對映。您應該在“my-mysql”容器中看到 3307:3306。
此時,您主機上執行的任何應用程式都可以透過 localhost:3307
訪問容器中的 MySQL 服務。
從另一個容器連線到容器化資料庫
從另一個容器連線到容器化資料庫是微服務架構和開發過程中常見的場景。Docker 的網路功能使您能夠輕鬆地建立此連線,而無需將資料庫公開到主機網路。這是透過將資料庫容器和需要訪問它的容器都放在同一個 Docker 網路上實現的。
在開始之前,您必須刪除之前為本指南執行的任何容器。要停止和刪除容器,請執行以下任一操作
- 在終端中,執行
docker remove --force my-mysql
刪除名為my-mysql
的容器。 - 或者,在 Docker 儀表板中,在“容器”檢視中選擇您容器旁邊的“刪除”圖示。
要建立網路並在其上執行容器
執行以下命令以建立一個名為 my-network 的 Docker 網路。
$ docker network create my-network
執行您的資料庫容器並使用
--network
選項指定網路。這將在 my-network 網路上執行容器。$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb --network my-network -d mysql:latest
執行您的其他容器並使用
--network
選項指定網路。在本示例中,您將執行一個可以連線到您的資料庫的 phpMyAdmin 容器。執行一個 phpMyAdmin 容器。使用
--network
選項指定網路,使用-p
選項使您可以從主機機器訪問容器,並使用-e
選項指定此映象所需的 envrionment 變數。$ docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
驗證容器是否可以通訊。在本示例中,您將訪問 phpMyAdmin 並驗證它是否連線到資料庫。
- 開啟 https://:8080 訪問您的 phpMyAdmin 容器。
- 使用
root
作為使用者名稱和my-secret-pw
作為密碼登入。您應該連線到 MySQL 伺服器並看到您的資料庫列出。
此時,在您的 my-network
容器網路上執行的任何應用程式都可以訪問容器中位於 my-mysql:3306
的 MySQL 服務。
在卷中持久化資料庫資料
將資料庫資料持久化到 Docker 卷對於確保您的資料在容器重啟和刪除時能夠存活至關重要。Docker 卷允許您將資料庫檔案儲存在容器的可寫層之外,從而可以升級容器、切換基礎並共享資料,而不會丟失資料。以下是如何使用 Docker CLI 或 Docker Desktop GUI 將卷附加到您的資料庫容器。
在開始之前,您必須刪除之前為本指南執行的任何容器。要停止和刪除容器,請執行以下任一操作
- 在終端中,執行
docker remove --force my-mysql
刪除名為my-mysql
的容器。 - 或者,在 Docker 儀表板中,在“容器”檢視中選擇您容器旁邊的“刪除”圖示。
接下來,您可以使用 Docker Desktop GUI 或 CLI 來執行帶有卷的容器。
要執行帶有附加捲的資料庫容器,請在您的 docker run
命令中包含 -v
選項,指定卷名稱和資料庫在容器記憶體儲資料的路徑。如果卷不存在,Docker 會自動為您建立它。
要執行帶有附加捲的資料庫容器,然後驗證資料是否持久化
執行容器並附加捲。
$ 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
並建立一個表。$ 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
的值。停止並刪除容器。如果沒有卷,您建立的表將在刪除容器時丟失。
$ docker remove --force my-mysql
使用附加的卷啟動一個新的容器。這次,您不需要指定任何環境變數,因為配置儲存在卷中。
$ docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest
驗證您建立的表是否仍然存在。再次使用
docker exec
命令在容器內執行mysql
。$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
此命令使用容器中的
mysql
工具從mytable
表中選擇所有記錄。您應該看到如下所示的輸出。
column_name value
要執行帶有附加捲的資料庫容器,然後驗證資料是否持久化
執行帶有附加捲的容器。
在 Docker 儀表板中,選擇視窗頂部的全域性搜尋。
在搜尋框中指定
mysql
,如果尚未選中,請選擇 映像 選項卡。將滑鼠懸停在 mysql 映像上,然後選擇 執行。將出現 執行新容器 模型。
展開“可選設定”。
在可選設定中,指定以下內容
- 容器名稱:
my-mysql
- 環境變數:
MYSQL_ROOT_PASSWORD
:my-secret-pw
MYSQL_DATABASE
:mydb
- 卷:
my-db-volume
:/var/lib/mysql
這裡,卷的名稱是
my-db-volume
,它被掛載到容器中的/var/lib/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
的值。
在 容器 檢視中,選擇您容器旁邊的 刪除 圖示,然後選擇 永久刪除。如果沒有卷,您建立的表將在刪除容器時丟失。
執行帶有附加捲的容器。
在 Docker 儀表板中,選擇視窗頂部的全域性搜尋。
在搜尋框中指定
mysql
,如果尚未選中,請選擇 映像 選項卡。將滑鼠懸停在 mysql 映像上,然後選擇 執行。將出現 執行新容器 模型。
展開“可選設定”。
在可選設定中,指定以下內容
- 容器名稱:
my-mysql
- 環境變數:
MYSQL_ROOT_PASSWORD
:my-secret-pw
MYSQL_DATABASE
:mydb
- 卷:
my-db-volume
:/var/lib/mysql
- 容器名稱:
選擇
執行
。
驗證您建立的表是否仍然存在。
在 容器 檢視中,在您的容器旁邊選擇 顯示容器操作 圖示,然後選擇 在終端中開啟。
在容器的終端中執行以下命令以驗證您建立的表是否仍然存在。
# mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
此命令使用容器中的
mysql
工具從mytable
表中選擇所有記錄。您應該看到如下所示的輸出。
column_name value
此時,任何掛載 my-db-volume
的 MySQL 容器都能夠訪問和儲存持久化資料。
構建自定義資料庫映象
自定義您的資料庫映像可以讓您在基本資料庫伺服器旁邊包含額外的配置、指令碼或工具。這對於建立與您的特定開發或生產環境需求相匹配的 Docker 映像特別有用。以下示例概述瞭如何構建和執行包含表初始化指令碼的自定義 MySQL 映像。
在開始之前,您必須刪除之前為本指南執行的任何容器。要停止和刪除容器,請執行以下任一操作
- 在終端中,執行
docker remove --force my-mysql
刪除名為my-mysql
的容器。 - 或者,在 Docker 儀表板中,在“容器”檢視中選擇您容器旁邊的“刪除”圖示。
要構建和執行您的自定義映像
建立 Dockerfile。
在您的專案目錄中建立一個名為
Dockerfile
的檔案。對於本示例,您可以在您選擇的空目錄中建立Dockerfile
。此檔案將定義如何構建您的自定義 MySQL 映像。將以下內容新增到
Dockerfile
中。# syntax=docker/dockerfile:1 # Use the base image mysql:latest FROM mysql:latest # Set environment variables ENV MYSQL_DATABASE mydb # Copy custom scripts or configuration files from your host to the container COPY ./scripts/ /docker-entrypoint-initdb.d/
在此 Dockerfile 中,您設定了 MySQL 資料庫名稱的環境變數。您還可以使用
COPY
指令將自定義配置檔案或指令碼新增到容器中。在本示例中,來自您的主機./scripts/
目錄的檔案被複制到容器的/docker-entrypoint-initdb.d/
目錄中。在此目錄中,.sh
、.sql
和.sql.gz
指令碼在容器首次啟動時執行。有關 Dockerifles 的更多詳細資訊,請參見 Dockerfile 參考。建立一個指令碼檔案以初始化資料庫中的表。在您的
Dockerfile
所在的目錄中,建立一個名為scripts
的子目錄,然後建立一個名為create_table.sql
的檔案,其中包含以下內容。
CREATE TABLE IF NOT EXISTS mydb.myothertable ( column_name VARCHAR(255) ); INSERT INTO mydb.myothertable (column_name) VALUES ('other_value');
您現在應該擁有以下目錄結構。
├── your-project-directory/ │ ├── scripts/ │ │ └── create_table.sql │ └── Dockerfile
構建您的映像。
在終端中,更改目錄到您的
Dockerfile
所在的目錄。執行以下命令以構建映像。
$ docker build -t my-custom-mysql .
在此命令中,
-t my-custom-mysql
將您的新映像標記(命名)為my-custom-mysql
。命令末尾的句點 (.) 指定當前目錄作為構建的上下文,Docker 在這裡查詢 Dockerfile 和構建所需的任何其他檔案。
按照 執行本地容器化資料庫 中的步驟執行您的映像。這次,指定您的映像名稱而不是
mysql:latest
。此外,您不再需要指定MYSQL_DATABASE
環境變數,因為它現在由您的 Dockerfile 定義。$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysql
使用以下命令驗證您的容器是否正在執行。
$ docker ps
您應該看到如下所示的輸出。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f74dcfdb0e59 my-custom-mysql "docker-entrypoint.s…" 2 hours ago Up 51 minutes 3306/tcp, 33060/tcp my-mysql
驗證您的初始化指令碼是否已執行。在終端中執行以下命令以顯示
myothertable
表的內容。$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.myothertable;"
您應該看到如下所示的輸出。
column_name other_value
使用您的 my-custom-mysql
映像執行的任何容器在首次啟動時都會初始化表。
使用 Docker Compose 執行資料庫
Docker Compose 是一個用於定義和執行多容器 Docker 應用程式的工具。只需一個命令,您就可以配置所有應用程式的服務(如資料庫、Web 應用程式等)並管理它們。在本示例中,您將建立一個 Compose 檔案並使用它來執行 MySQL 資料庫容器和 phpMyAdmin 容器。
要使用 Docker Compose 執行您的容器
建立 Docker Compose 檔案。
在您的專案目錄中建立一個名為
compose.yaml
的檔案。此檔案將定義服務、網路和卷。將以下內容新增到
compose.yaml
檔案中。services: db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: mydb ports: - 3307:3306 volumes: - my-db-volume:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: PMA_HOST: db PMA_PORT: 3306 MYSQL_ROOT_PASSWORD: my-secret-pw ports: - 8080:80 depends_on: - db volumes: my-db-volume:
對於資料庫服務
db
是服務的名稱。image: mysql:latest
指定該服務使用來自 Docker Hub 的最新 MySQL 映像。environment
列出了 MySQL 用於初始化資料庫的環境變數,例如 root 密碼和資料庫名稱。ports
將主機上的埠 3307 對映到容器中的埠 3306,允許您從主機連線到資料庫。volumes
將my-db-volume
掛載到容器內的/var/lib/mysql
,以持久化資料庫資料。
除了資料庫服務之外,還有一個 phpMyAdmin 服務。預設情況下,Compose 為您的應用程式設定一個網路。每個服務的容器都加入預設網路,並且可以被該網路上的其他容器訪問,並且可以透過服務名稱發現。因此,在
PMA_HOST
環境變數中,您可以指定服務名稱db
以連線到資料庫服務。有關 Compose 的更多詳細資訊,請參見 Compose 檔案參考。
執行 Docker Compose。
開啟一個終端並更改目錄到您的
compose.yaml
檔案所在的目錄。使用以下命令執行 Docker Compose。
$ docker compose up
您現在可以訪問 https://:8080 並使用
root
作為使用者名稱,my-secret-pw
作為密碼連線到您的資料庫。要停止容器,請在終端中按
ctrl
+c
。
現在,使用 Docker Compose,您可以啟動您的資料庫和應用程式、掛載卷、配置網路等等,所有這些都只需一個命令。
總結
本指南向您介紹了使用容器化資料庫(特別是 MySQL)的基本知識,重點介紹了增強靈活性、簡化設定以及在您的開發環境之間保持一致性。本指南中介紹的用例不僅簡化了您的開發工作流程,還為您準備了更高階的資料庫管理和部署場景,確保您的資料驅動應用程式保持穩健和可擴充套件。
相關資訊