點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Docker 執行 MySQL

Sam Xiao's Avatar 2021-10-21

若要在 macOS 使用 MySQL,不需使用 Homebrew 安裝 macOS 版 MySQL 或安裝 MAMP,直接使用 Docker 執行 MySQL 即可。

Version

MySQL 8.0.26

Docker Compose

docker-compose.yml

version: "3"

services:
  mysql:
    image: mysql:latest
    container_name: mysql
    volumes:
      - ${HOST_DIR}:/var/lib/mysql
    ports:
      - ${MYSQL_PORT}:3306
    environment:
      - MYSQL_DATABASE=${MYSQL_DB}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    command: --default-authentication-plugin=mysql_native_password

設定 MySQL container:

  • image: mysql:latest:使用 MySQL 官方所提供 image 並使用最新版本
  • container_name: mysql:設定 container 名稱
  • volumns:將 host 目錄對應到 MySQL 內部儲存 data 目錄,避免 container 結束後資料就銷毀
  • ports:設定 cotainer 對外 port 與 MySQL 的 port 對應
  • environment:設定 database 名稱, root 的 password
  • --default-authentication-plugin=mysql_native_password:為了讓 Knex 以 id 與 password 方式連接

MySQL 8 的 authentication 從原本 mysql_native_password 改成 caching_sha2_password,這導致 Knex 無法連上 MySQL 8 以上,特別在 command 加上 --default-authentication-plugin=mysql_native_password,命令 MySQL 8 以 mysql_native_password 方式啟動

Environment Variable

.env

HOST_DIR=.data
MYSQL_DB=KnexLab
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=111111

此為 docker-compose.yml 所設定的環境變數,被獨立在 .env 中,可單獨設定,將來不用修改 docker-compose.yml

  • HOST_DIR:設定 MySQL data 要存到 host 位置
  • MYSQL_DB:設定 database 名稱
  • MYSQL_PORT:設定 MySQL 對應到 host 的 port
  • MYSQL_ROOT_PASSWORD:設定 root 的 password

Start MySQL

$ docker compose up -d

使用 docker compose up -d 啟動 MySQL。

mysql000

DataGrip

mysql001

以 DataGrip 連接 MySQL。

mysql002

由於 MySQL 是以 Docker 執行,因此 host 填 localhost,port 透過 3306 即可連接。

mysql003

連進去後能看到 KnexLab database,表示 MySQL 成功啟動。

Stop MySQL

$ docker-compose down

使用 docker-compose down 結束 MySQL。

mysql004

Conclusion

  • 對於 Linux 的 server,不必再如以前安裝 macOS 版本,畢竟移植後還是有些差異,比較好的方式是改用 Docker 版本,不僅原汁原味,且安裝移除都很乾淨
  • 使用 Docker 可使每個 project 都有自己的 MySQL,而不需如傳統必須所有 project 共用同一個 MySQL,導致 database 滿天飛
  • 由於 docker compose down 除了將 container 刪除,其資料也會跟著刪除,因此要使用 volumns 將資料存放在 host