若要在 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 的 portMYSQL_ROOT_PASSWORD
:設定root
的 password
Start MySQL
$ docker compose up -d
使用 docker compose up -d
啟動 MySQL。
DataGrip
以 DataGrip 連接 MySQL。
由於 MySQL 是以 Docker 執行,因此 host 填 localhost
,port 透過 3306
即可連接。
連進去後能看到 KnexLab
database,表示 MySQL 成功啟動。
Stop MySQL
$ docker-compose down
使用 docker-compose down
結束 MySQL。
Conclusion
- 對於 Linux 的 server,不必再如以前安裝 macOS 版本,畢竟移植後還是有些差異,比較好的方式是改用 Docker 版本,不僅原汁原味,且安裝移除都很乾淨
- 使用 Docker 可使每個 project 都有自己的 MySQL,而不需如傳統必須所有 project 共用同一個 MySQL,導致 database 滿天飛
- 由於
docker compose down
除了將 container 刪除,其資料也會跟著刪除,因此要使用volumns
將資料存放在 host