前言
我在專案開發階段常使用 MySQL Docker,主要是好處,快速啟動、零安裝成本、版本切換,不污染本機系統(不喜歡本機裝一堆有的沒的,特別是有的只會用那麼一次)。而且如果在需要,任何時間、任何機器,都能還原相同 DB 環境。
註: 在測試也非常好用:
1.Unit / Integration Test 啟動臨時 MySQL
2.測試結束,可以將容器刪除
3.不影響正式資料
必要:
安裝 Docker Desktop
參看: https://docs.docker.com/desktop/setup/install/windows-install/
專案結構
|- docker/
| |- mysql/
| |─ docker-compose.yml
| |- init/
| |- schema.sql
實作
新增 docker-compose.yml(MySQL)
services:
mysql:
image: mysql:8.4.7
container_name: dev-mysql
restart: always
ports:
- "3306:3306"
environment:
# 建立 root 預設使用的密碼
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: testdb
# 建立新使用者並設定該使用者的密碼
MYSQL_USER: mysql
MYSQL_PASSWORD: 123456
volumes:
# 我本機上建立的資料目錄
- /Users/danny/mysql_data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
新增 schema.sql
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id bigint NOT NULL AUTO_INCREMENT,
email varchar(255) NOT NULL,
first_name varchar(255) NOT NULL,
last_name varchar(255) DEFAULT NULL,
password varchar(255) NOT NULL,
username varchar(255) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT username_unique UNIQUE (username),
CONSTRAINT email_unique UNIQUE (email)
);
說明:
初始化新實例:
當容器首次啟動時,如需要建立一個具有指定名稱的新資料庫,並進行初始化。它將執行位於指定目錄下、副檔名為 .sql 的檔案/docker-entrypoint-initdb.d。文件將按字母順序執行。
資料儲存:
在主機系統上建立資料目錄,並將其掛載到容器內部可存取的目錄。這樣,資料庫檔案就會位於主機系統上建立資料目錄
啟動 / 停止
# 啟動,如果之前會 pull mysql image過,會需要pull image
docker compose up -d
# 查看狀態,已成功啟動。
docker compose ps
檢視相關狀態。
查看 Docker Desktop,可以看到 Containers 已有剛建立的 dev-mysql
使用mysql client 工具連線,可以看到剛初始建立的table users
# 停止
docker compose down
# 停止並刪除資料
docker compose down -v
留言