使用容器化資料庫

使用本機容器化資料庫可提供彈性且設定簡便的優勢,讓您在不需要傳統資料庫安裝所帶來的額外負擔下,精確地鏡像生產環境。Docker 簡化了此流程,讓您只需幾個指令即可在隔離的容器中部署、管理及擴充資料庫。

在本指南中,您將學習如何:

  • 執行本機容器化資料庫
  • 存取容器化資料庫的 Shell
  • 從主機連線到容器化資料庫
  • 從另一個容器連線到容器化資料庫
  • 在磁碟區(Volume)中保存資料庫資料
  • 建立自訂資料庫映像檔
  • 使用 Docker Compose 執行資料庫

本指南以 MySQL 映像檔作為範例,但相關概念也可應用於其他資料庫映像檔。

先決條件

若要跟隨本指南進行操作,您必須安裝 Docker。若要安裝 Docker,請參閱 取得 Docker (Get 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:以分離模式 (detached mode) 執行容器,這表示容器會在背景執行。
  • mysql:latest:指定您要使用最新版本的 MySQL 映像檔。

若要驗證您的容器正在執行,請在終端機中執行 docker ps

若要使用 GUI 執行容器:

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

  2. 在搜尋方塊中輸入 mysql,如果尚未選取,請選擇 Images 分頁。

  3. 將滑鼠游標移至 mysql 映像檔上並選擇 Run。隨即會出現 Run a new container 視窗。

  4. 展開 Optional settings

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

    • Container namemy-mysql
    • 環境變數:
      • MYSQL_ROOT_PASSWORDmy-secret-pw
      • MYSQL_DATABASEmydb
    The optional settings screen with the options specified.
  6. 選擇 Run

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

存取容器化資料庫的 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 儀表板並選擇 Containers 檢視。
  2. 在您容器的 Actions 欄中,選擇 Show container actions,然後選擇 Open in terminal

在這個終端機中,您可以存取 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 rm --force my-mysql 以移除名為 my-mysql 的容器。
  • 或者,在 Docker Desktop 儀表板的 Containers 檢視中,選擇容器旁邊的 Delete 圖示。

接下來,您可以使用 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,如果尚未選取,請選擇 Images 分頁。

  3. 將滑鼠游標移至 mysql 映像檔上並選擇 Run。隨即會出現 Run a new container 視窗。

  4. 展開 Optional settings

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

    • Container namemy-mysql
    • 3306/tcp 連接埠的主機連接埠 (Host port)3307
    • 環境變數:
      • MYSQL_ROOT_PASSWORDmy-secret-pw
      • MYSQL_DATABASEmydb
    The optional settings screen with the options specified.
  6. 選擇 Run

  7. Containers 檢視中,驗證該連接埠是否在 Port(s) 欄下列出。您應該會看到 my-mysql 容器顯示為 3307:3306

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

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

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

在開始之前,您必須移除之前為本指南執行的任何容器。若要停止並移除容器,請執行以下任一方式:

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

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

  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. 開啟 https://:8080 以存取您的 phpMyAdmin 容器。
    2. 使用 root 作為使用者名稱,並使用 my-secret-pw 作為密碼登入。您應該能夠連線到 MySQL 伺服器並看到您的資料庫列出。

此時,任何在您的 my-network 容器網路上執行的應用程式都可以透過 my-mysql:3306 存取容器中的 MySQL 服務。

在磁碟區(Volume)中保存資料庫資料

將資料庫資料保存在 Docker 磁碟區 (Volume) 中,對於確保您的資料在容器重啟和移除後依然存在是必要的。Docker 磁碟區讓您可以將資料庫檔案儲存在容器的可寫層之外,這使得升級容器、更換基礎映像檔以及共用資料而不會遺失資料成為可能。以下說明如何使用 Docker CLI 或 Docker Desktop GUI 將磁碟區掛載到您的資料庫容器。

在開始之前,您必須移除之前為本指南執行的任何容器。若要停止並移除容器,請執行以下任一方式:

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

接下來,您可以使用 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 rm --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,如果尚未選取,請選擇 Images 分頁。

    3. 將滑鼠游標移至 mysql 映像檔上並選擇 Run。隨即會出現 Run a new container 視窗。

    4. 展開 Optional settings

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

      • Container namemy-mysql
      • 環境變數:
        • MYSQL_ROOT_PASSWORDmy-secret-pw
        • MYSQL_DATABASEmydb
      • 磁碟區:
        • my-db-volume:/var/lib/mysql
      The optional settings screen with the options specified.

      這裡,磁碟區名稱為 my-db-volume,並掛載在容器內的 /var/lib/mysql

    6. 選擇 Run

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

    1. Containers 檢視中,選擇容器旁邊的 Show container actions 圖示,然後選擇 Open in terminal

    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. Containers 檢視中,選擇容器旁邊的 Delete 圖示,然後選擇 Delete forever。若沒有磁碟區,您建立的資料表在刪除容器時將會遺失。

  4. 執行已掛載磁碟區的容器。

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

    2. 在搜尋方塊中指定 mysql,如果尚未選取,請選擇 Images 分頁。

    3. 將滑鼠游標移至 mysql 映像檔上並選擇 Run。隨即會出現 Run a new container 視窗。

    4. 展開 Optional settings

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

      • Container namemy-mysql
      • 環境變數:
        • MYSQL_ROOT_PASSWORDmy-secret-pw
        • MYSQL_DATABASEmydb
      • 磁碟區:
        • my-db-volume:/var/lib/mysql
      The optional settings screen with the options specified.
    6. 選擇 Run

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

    1. Containers 檢視中,選擇容器旁邊的 Show container actions 圖示,然後選擇 Open in terminal

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

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

      此指令使用容器內的 mysql 工具從 mytable 資料表中選取所有記錄。

      您應該會看到類似下方的輸出。

      column_name
      value
      

此時,任何掛載 my-db-volume 的 MySQL 容器都將能夠存取並儲存已保存的資料。

建立自訂資料庫映像檔

自訂您的資料庫映像檔讓您可以將額外的配置、指令碼或工具包含在基礎資料庫伺服器中。這對於建立符合您特定開發或生產環境需求的 Docker 映像檔特別有用。以下範例概述了如何建置並執行包含資料表初始化指令碼的自訂 MySQL 映像檔。

在開始之前,您必須移除之前為本指南執行的任何容器。若要停止並移除容器,請執行以下任一方式:

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

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

  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。指令末尾的句號 (.) 指定目前目錄作為建置上下文 (context),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
      

      您現在可以存取 https://:8080 來開啟 phpMyAdmin,並使用 root 作為使用者名稱以及 my-secret-pw 作為密碼連線到您的資料庫。

    3. 若要停止容器,請在終端機中按 ctrl+c

現在,透過 Docker Compose,您可以使用單一指令啟動您的資料庫和應用程式、掛載磁碟區、設定網路等。

總結

本指南向您介紹了使用容器化資料庫的精華,特別聚焦於 MySQL,以提升開發環境的彈性、設定簡便性與一致性。本指南涵蓋的應用場景不僅簡化了您的開發工作流程,也為您處理更進階的資料庫管理與部署情境做好準備,確保您的資料驅動應用程式保持穩健且具擴充性。

相關資訊

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.