使用容器化資料庫

使用本地容器化資料庫可提供靈活性和易於設定的特性,讓您在沒有傳統資料庫安裝負擔的情況下,更精確地鏡像生產環境。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 執行容器

  1. 在 Docker Desktop 儀表板中,選擇視窗頂部的全域搜尋。

  2. 在搜尋方塊中指定 mysql,如果尚未選取,請選擇 映像檔 標籤。

  3. 將滑鼠懸停在 msyql 映像檔上,然後選擇 執行。此時會出現「執行新的容器」模型。

  4. 展開 選用設定

  5. 在選用設定中,指定以下內容

    • 容器名稱my-mysql
    • 環境變數:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
    The optional settings screen with the options specified.
  6. 選擇 執行

  7. 在 Docker Desktop 儀表板中開啟 容器 視圖,以驗證您的容器是否正在執行。


存取容器化資料庫的 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 以返回您的終端機。

  1. 開啟 Docker Desktop 儀表板,然後選擇 容器 視圖。
  2. 在容器的 動作 欄中,選擇 顯示容器動作,然後選擇 在終端機中開啟

在此終端機中,您可以存取 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 Desktop 儀表板中,在 容器 視圖中選擇容器旁邊的 刪除 圖示。

接下來,您可以使用 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 執行容器

  1. 在 Docker Desktop 儀表板中,選擇視窗頂部的全域搜尋。

  2. 在搜尋方塊中指定 mysql,如果尚未選取,請選擇 映像檔 標籤。

  3. 將滑鼠懸停在 msyql 映像檔上,然後選擇 執行。此時會出現「執行新的容器」模型。

  4. 展開 選用設定

  5. 在選用設定中,指定以下內容

    • 容器名稱my-mysql
    • 3306/tcp 埠的主機埠3307
    • 環境變數:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
    The optional settings screen with the options specified.
  6. 選擇 執行

  7. 容器 視圖中,驗證埠是否已映射到 欄位下。您應該會在 my-mysql 容器中看到 3307:3306


此時,您的主機上執行的任何應用程式都可以透過 localhost:3307 存取容器中的 MySQL 服務。

從另一個容器連線到容器化資料庫

從另一個容器連線到容器化資料庫是微服務架構和開發過程中常見的情況。Docker 的網路功能讓您可以輕鬆建立此連線,而無需將資料庫公開到主機網路。這是透過將資料庫容器和需要存取它的容器放在同一個 Docker 網路上來實現的。

在開始之前,您必須移除您先前為本指南執行的任何容器。要停止並移除容器,請執行下列其中一項操作

  • 在終端機中,執行 docker remove --force my-mysql 以移除名為 my-mysql 的容器。
  • 或者,在 Docker Desktop 儀表板中,在 容器 視圖中選擇容器旁邊的 刪除 圖示。

要建立網路並在其上執行容器

  1. 執行以下指令以建立名為 my-network 的 Docker 網路。

    $ docker network create my-network
    
  2. 執行您的資料庫容器,並使用 --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
    
  3. 執行您的其他容器,並使用 --network 選項指定網路。在本範例中,您將執行一個可以連線到資料庫的 phpMyAdmin 容器。

    1. 執行 phpMyAdmin 容器。使用 --network 選項指定網路,使用 -p 選項讓您可以從主機電腦存取容器,並使用 -e 選項指定此映像檔所需的環境變數。

      $ docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
      
  4. 驗證容器之間可以通訊。在本範例中,您將存取 phpMyAdmin 並驗證它是否連線到資料庫。

    1. 開啟 http://localhost:8080 來存取您的 phpMyAdmin 容器。
    2. 使用 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 Desktop 儀表板中,在 容器 視圖中選擇容器旁邊的 刪除 圖示。

接下來,您可以使用 Docker Desktop GUI 或 CLI 來執行具有磁碟區的容器。


若要執行具有附加磁碟區的資料庫容器,請在 docker run 命令中包含 -v 選項,並指定磁碟區名稱和資料庫在容器內儲存資料的路徑。如果磁碟區不存在,Docker 會自動為您建立。

若要執行具有附加磁碟區的資料庫容器,然後驗證資料是否持續存在

  1. 執行容器並附加磁碟區。

    $ 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 目錄。

  2. 在資料庫中建立一些資料。使用 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

  3. 停止並移除容器。如果沒有磁碟區,您建立的表格將在移除容器時遺失。

    $ docker remove --force my-mysql
    
  4. 使用附加的磁碟區啟動新的容器。這次,您不需要指定任何環境變數,因為設定已儲存在磁碟區中。

    $ docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest
    
  5. 驗證您建立的表格是否仍然存在。再次使用 docker exec 命令在容器內執行 mysql

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

    此命令使用容器中的 mysql 工具從 mytable 表格中選取所有記錄。

    您應該會看到如下所示的輸出。

    column_name
    value
    

若要執行具有附加磁碟區的資料庫容器,然後驗證資料是否持續存在

  1. 執行具有附加磁碟區的容器。

    1. 在 Docker Desktop 儀表板中,選擇視窗頂部的全域搜尋。

    2. 在搜尋方塊中指定 mysql,如果尚未選取,請選取**映像檔**索引標籤。

    3. 將滑鼠懸停在 **mysql** 映像檔上,然後選取**執行**。**執行新的容器**模型隨即出現。

    4. 展開 選用設定

    5. 在選用設定中,指定以下內容

      • 容器名稱my-mysql
      • 環境變數:
        • MYSQL_ROOT_PASSWORD:my-secret-pw
        • MYSQL_DATABASE:mydb
      • 磁碟區:
        • my-db-volume:/var/lib/mysql
      The optional settings screen with the options specified.

      這裡,磁碟區的名稱為 my-db-volume,它掛載在容器中的 /var/lib/mysql 位置。

    6. 選擇 執行

  2. 在資料庫中建立一些資料。

    1. 在**容器**檢視中,在容器旁邊選取**顯示容器動作**圖示,然後選取**在終端機中開啟**。

    2. 在容器的終端機中執行以下命令來新增表格。

      # 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`。

  3. 在**容器**檢視中,選取容器旁邊的**刪除**圖示,然後選取**永久刪除**。如果沒有磁碟區,您建立的表格將在刪除容器時遺失。

  4. 執行具有附加磁碟區的容器。

    1. 在 Docker Desktop 儀表板中,選擇視窗頂部的全域搜尋。

    2. 在搜尋方塊中指定 mysql,如果尚未選取,請選取**映像檔**索引標籤。

    3. 將滑鼠懸停在 **mysql** 映像檔上,然後選取**執行**。**執行新的容器**模型隨即出現。

    4. 展開 選用設定

    5. 在選用設定中,指定以下內容

      • 容器名稱my-mysql
      • 環境變數:
        • MYSQL_ROOT_PASSWORD:my-secret-pw
        • MYSQL_DATABASE:mydb
      • 磁碟區:
        • my-db-volume:/var/lib/mysql
      The optional settings screen with the options specified.
    6. 選擇 執行

  5. 驗證您建立的表格是否仍然存在。

    1. 在**容器**檢視中,在容器旁邊選取**顯示容器動作**圖示,然後選取**在終端機中開啟**。

    2. 在容器的終端機中執行以下命令,以驗證您建立的表格是否仍然存在。

      # 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 Desktop 儀表板中,在 容器 視圖中選擇容器旁邊的 刪除 圖示。

若要建置和執行您的自訂映像檔

  1. 建立 Dockerfile。

    1. 在您的專案目錄中建立一個名為 Dockerfile 的檔案。在本範例中,您可以在您選擇的空目錄中建立 Dockerfile。此檔案將定義如何建置您的自訂 MySQL 映像檔。

    2. 將以下內容新增到 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 指令碼。如需 Dockerfiles 的詳細資訊,請參閱 Dockerfile 參考

    3. 建立指令碼檔案以初始化資料庫中的表格。在 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
  2. 建置您的映像檔。

    1. 在終端機中,將目錄變更為 Dockerfile 所在的目錄。

    2. 執行以下命令來建置映像檔。

      $ docker build -t my-custom-mysql .
      

      在此命令中,-t my-custom-mysql 將您的新映像檔標記(命名)為 my-custom-mysql。命令結尾的句點 (.) 將目前目錄指定為建置的上下文,Docker 會在其中尋找 Dockerfile 和建置所需的任何其他檔案。

  3. 如同您在 執行本機容器化資料庫 中所做的那樣執行您的映像檔。這次,請指定您的映像檔名稱,而不是 mysql:latest。此外,您不再需要指定 MYSQL_DATABASE 環境變數,因為它現在由您的 Dockerfile 定義。

    $ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysql
    
  4. 使用以下命令驗證您的容器是否正在執行。

    $ 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
    
  5. 驗證您的初始化指令碼是否已執行。在終端機中執行以下命令以顯示 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 應用程式的工具。使用單一命令,您可以設定所有應用程式的服務(例如資料庫、網路應用程式等)並管理它們。在本範例中,您將建立一個 Compose 檔案,並使用它來執行 MySQL 資料庫容器和 phpMyAdmin 容器。

若要使用 Docker Compose 執行您的容器

  1. 建立 Docker Compose 檔案。

    1. 在您的專案目錄中建立一個名為 compose.yaml 的檔案。此檔案將定義服務、網路和磁碟區。

    2. 將以下內容新增到 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,讓您可以從主機電腦連線到資料庫。
      • volumesmy-db-volume 掛載到容器內的 /var/lib/mysql 以持久保存資料庫資料。

      除了資料庫服務之外,還有一個 phpMyAdmin 服務。預設情況下,Compose 會為您的應用程式設定單一網路。每個服務的容器都會加入預設網路,並且可以被該網路上的其他容器存取,也可以透過服務名稱找到。因此,在 PMA_HOST 環境變數中,您可以指定服務名稱 db 以連線到資料庫服務。如需 Compose 的詳細資訊,請參閱 Compose 檔案參考

  2. 執行 Docker Compose。

    1. 開啟終端機,並將目錄變更為 compose.yaml 檔案所在的目錄。

    2. 使用以下命令執行 Docker Compose。

      $ docker compose up
      

      您現在可以透過 http://localhost:8080摘要

      本指南向您介紹了使用容器化資料庫(特別是 MySQL)的基礎知識,以增強靈活性、簡化設定並確保開發環境的一致性。本指南中涵蓋的用例不僅簡化了您的開發流程,還讓您為更進階的資料庫管理和部署情境做好準備,確保您的資料驅動應用程式保持穩固且可擴展。

      相關資訊