網站搜尋

如何在 Linux 中使用 Docker 設置 MySQL


如果你是 MySQL 新手,或者想要快速且輕鬆地安裝 MySQL 資料庫的人,那麼這篇文章適合你。在這篇文章中,我們將學習如何在 Linux 中使用 Docker 和 Docker Compose 設定 MySQL。

讓我們先設置 Docker 環境以啟動 MySQL 容器。

1. 安裝 Docker

在啟動 MySQL Docker 容器之前,您需要在您的機器上安裝 Docker 和 Docker Compose。如果您尚未安裝 Docker 和 Docker Compose,請參考以下指南:

  • 如何在 CentOS 安裝 Docker
  • 如何在 Ubuntu 中安裝 Docker

您也可以參考下方提供的官方 Docker 文件連結,以了解如何設置 Docker 和 Docker Compose。

  • https://docs.docker.com/engine/install/
  • https://docs.docker.com/compose/install/

您可以運行以下命令來檢查您正在使用的 docker 和 docker-compose 版本。

$ docker --version
Docker version 20.10.11, build dea9396
$ docker-compose --version
docker-compose version 1.29.2, build unknown

2. 下載 MySQL Docker 映像檔

前往 Docker Hub 以獲取 MySQL Docker 映像。重要的是,你必須決定要運行哪個版本的 MySQL。

執行以下指令,將 MySQL 映像從 Docker Hub 拉到你的電腦上。

$ docker pull mysql:latest

注意:不必使用標籤 "latest",預設情況下將會拉取最新的映像檔。

要檢查圖像是否在本地可用,您可以運行以下命令:

$ docker images mysql

範例輸出:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        latest    b05128b000dd   12 days ago   516MB

現在映像已經準備好啟動容器。你也可以跳過這個步驟,直接執行下一節所示的「docker run」命令,如果本地沒有映像,它將會自動下載。

3. 啟動 MySQL 容器

執行以下命令以啟動 MySQL Docker 容器:

$ docker run --name mysql -p 3306:3306 -v mysql_volume:/var/lib/mysql/ -d -e "MYSQL_ROOT_PASSWORD=temp123" mysql

啟動 MySQL 容器

讓我們分解上述命令,看看每個標誌的作用。

--name → 給你的容器命名。如果你沒有指定這個參數,docker 將會分配一些隨機生成的名稱。

-p → 端口映射。MySQL 將監聽端口 3306,因此我們將主機的端口(3306 → 3306)映射到 Docker 容器。主機端口不一定非得是 3306,可以是任何可用的端口。

在本地機器上運行以下 netstat 命令,以檢查容器啟動後映射的端口是否正在監聽。

$ netstat -tlnup | grep -i 3306

範例輸出:

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      168870/docker-proxy 
tcp6       0      0 :::3306                 :::*                    LISTEN      168878/docker-proxy 

-v → 將一個卷掛載到容器。Docker 的預設行為是,一旦容器被移除,資料將不會被保留,因此你會失去所有資料。

為了建立持久儲存,我已建立名為「mysql_volume」的卷。MySQL 在容器內的 /var/lib/mysql/ 存放資料,而這裡映射到本地主機目錄 /var/lib/docker/volumes/mysql_volume1/_data,因此你的資料將會是持久的。

如果您希望了解更多關於 Docker 卷的資訊,請查看我們關於此的詳細 文章。

-d → 將以分離模式啟動並運行容器。如果省略 -d 標誌,則您將在終端中看到容器啟動日誌,並且需要打開新的終端會話以連接到容器。

-e → 環境變數。你必須使用以下任一參數來設定 MySQL root 使用者密碼。

  • MYSQL_ROOT_PASSWORD → 使用此環境變數設置您自己的密碼。
  • MYSQL_ALLOW_EMPTY_PASSWORD → 將設置空白或空密碼。您必須設置 MYSQL_ALLOW_EMPTY_PASSWORD=1。
  • MYSQL_RANDOM_ROOT_PASSWORD → 當容器啟動時會生成隨機密碼。你必須設置 MYSQL_RANDOM_ROOT_PASSWORD=1 來生成隨機密碼。

如果你跳過這一步,將會拋出如下所示的錯誤。

環境變數錯誤

4. 檢查 MySQL 容器狀態

您可以使用以下命令檢查已啟動的容器狀態:

$ docker ps

範例輸出:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
e1fb895f6f0f   mysql     "docker-entrypoint.s..."   3 minutes ago   Up 3 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

5. 連接到 MySQL 資料庫

執行以下命令以連接到 MySQL 容器。

$ docker exec -it mysql bash

透過執行以下命令,以 root 使用者連接到 MySQL 資料庫。在我的情況下,我已經透過 MYSQL_ROOT_PASSWORD 設定了自己的密碼。

$ mysql -u root -p

連接到資料庫

如果你在啟動容器時使用了 MYSQL_RANDOM_ROOT_PASSWORD=1,那麼你可以從日誌中獲取自動生成的密碼。

$ docker logs
$ docker logs mysql

生成的根密碼

自動生成的 root 密碼將會很長,且不適合記住。您可以透過執行以下查詢來重設 root 密碼。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysqlpassword';

將密碼 'mysqlpassword' 替換為您自己的密碼。您也可以創建自己的使用者並根據需要授予他權限。

6. 載入範例資料

建立 MySQL 的主要目的是載入一些資料並對其執行查詢。有幾種方式可以載入資料。我有一個名為「load_data.sql」的範例檔案,其中包含以下查詢。

CREATE DATABASE IF NOT EXISTS football;

USE football;

CREATE TABLE IF NOT EXISTS players (
    player_name     VARCHAR(16)     NOT NULL,
    player_age      INT             NOT NULL,
    player_club     VARCHAR(16)     NOT NULL,
    player_country  VARCHAR(16)     NOT NULL
);

INSERT INTO players VALUES ("Messi",34,"PSG","Argentina");
INSERT INTO players VALUES ("Ronaldo",36,"MANU","Portugal");
INSERT INTO players VALUES ("Neymar",29,"PSG","Brazil");
INSERT INTO players VALUES ("Kane",28,"SPURS","England");
INSERT INTO players VALUES ("E Hazard",30,"MADRID","Belgium");

第一種方法是使用「docker cp」命令,將資料從本機複製到 Docker 容器中。

$ docker cp load_data.sql mysql:/tmp
$ docker exec -it mysql bash
$ ls -l /tmp/

現在你可以連接到 mysql 客戶端並執行 source 命令,或將檔案重定向到 mysql 客戶端。

$ mysql -u root -p
mysql> source /tmp/load_data.sql

或

$ mysql -u root -p < /tmp/load_data.sql

連接到資料庫並查詢您的表格。

$ mysql -u root -p
mysql> show databases;
mysql> use football;
mysql> show tables;
mysql> select * from players;

玩家桌

第二種方法是在執行 docker exec 命令時重新導向 .sql 檔案。

$ docker exec -i mysql mysql -u root -p < load_data.sql

7. 使用 Docker-Compose 設置 MySQL 容器

與其拉取映像並運行 docker run 命令,不如使用 docker-compose 快速啟動容器。當你需要創建多個容器時,Docker-compose 是最適合的工具。

建立一個名為 docker-compose.yml 或 docker-compose.yaml 的檔案。複製並貼上以下的 yaml 代碼。這與我在前面的章節中手動運行的內容相同。

version: '3.8'
services:
  database:
    image: mysql:latest
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: temp1234
    ports:
      - "3306:3306"
    volumes:
      - mysql_volume:/var/lib/mysql
volumes:
  mysql_compose_volume:

現在執行以下命令,這將啟動 MySQL Docker 容器。

$ docker-compose up

使用 Docker Compose 啟動 MySQL 容器

使用 docker-compose 執行以下命令以檢查已啟動容器的狀態:

$ docker-compose ps

範例輸出:

Name              Command             State                          Ports                       
-------------------------------------------------------------------------------------------------
mysql   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp

8. 使用 MySQL Workbench 連接到 MySQL 資料庫

到目前為止,我們已經看到如何從容器內使用 mysql 客戶端連接到資料庫。你也可以使用任何 GUI 客戶端連接到資料庫,例如 mysql workbench、dbeaver、Heidi SQL 等。

無論你使用哪種 GUI 客戶端,重要的是要注意,在啟動容器時映射了哪個端口。

在我的情況下,我已將 localhost (3306) 映射到 container (3306)。所以如果我必須建立與資料庫的連接,我必須連接到 localhost:3306 或 127.0.0.1:3306。

我正在使用 MySQL Workbench 作為我的 GUI 客戶端。如果你尚未在你的電腦上安裝 MySQL Workbench,則可以使用以下指示來安裝它。

8.1. 在 Linux 上安裝 MySQL Workbench

前往 官方網站 下載套件檔案。您必須選擇您的作業系統以下載 .deb 或 .rpm 檔案。

為 MySQL Workbench 選擇作業系統

在下一步,它會要求您登入或註冊。您可以點擊「不用了,直接開始下載」選項來跳過登入或註冊。

跳過登入或註冊選項

在基於 Debian 的系統上,按照以下方式安裝 MySQL Workbench:

$ cd <path to downloaded .deb file>
$ sudo apt install ./mysql-workbench-community_8.0.27-1ubuntu21.04_amd64.deb

在基於 RHEL 的系統上,按如下方式安裝 MySQL Workbench:

$ cd <path to downloaded .rpm file>
$ sudo dnf localinstall ./mysql-workbench-community-8.0.27-1.el8.x86_64.rpm

安裝完成後,您可以從選單或快捷列啟動 MySQL Workbench。

啟動 MySQL Workbench

8.2. 連接到 MySQL 資料庫

連接到運行在 Docker 容器內的資料庫。您應該根據容器的設置嘗試連接到 localhost:3306 或 localhost:<port-no>。

管理 MySQL 連線

在連接到資料庫之前,您可以按「測試連線」來檢查 MySQL Workbench 是否能成功連接到資料庫實例。

測試 MySQL 連線

現在你可以開始對你創建的表格執行查詢了。

在 MySQL Workbench 執行範例查詢

9. 結論

在本文中,我們已經看到如何使用 docker run 和 docker-compose 方法來啟動 MySQL 容器。如果你想為測試或學習目的設置 MySQL,Docker 已經足夠用了。

希望這對你有幫助。