# macOS M4 使用 Docker 安裝 SQL Server
## 0. 開啟 Rosetta,Apple Silicon 必做(目前發現不用,可越過這段)
1. 開啟 **Docker Desktop → Settings → Features in development**
2. 勾選 **Use Rosetta for x86/amd64 emulation on Apple Silicon**
3. **重啟 Docker Desktop**
> ✅ 目的:讓 M4(ARM 架構)能執行 x86_64(amd64)的 SQL Server 映像。
---
## 1. 建立資料持久化目錄
```bash
# 建立資料目錄(持久化)
mkdir -p ~/docker/mssql/data
# 啦取映像檔
docker pull mcr.microsoft.com/mssql/server:2022-latest
# 啟動容器(Apple Silicon 建議加 --platform linux/amd64)
docker run -d \ # 以背景模式 (-d) 啟動新容器
--name mssql \ # 指定容器名稱為 mssql
--platform linux/amd64 \ # 強制使用 x86_64 架構(Apple M 系列需加此參數)
-e "ACCEPT_EULA=Y" \ # 接受 SQL Server 授權條款 (EULA)
-e "MSSQL_SA_PASSWORD=YourStrong!Passw0rd" \ # 設定系統管理員帳號 (sa) 的登入密碼
-e "MSSQL_PID=Developer" \ # 使用免費開發者版本授權
-e "TZ=Asia/Taipei" \ # 設定容器內的時區為台北時間
-p 1433:1433 \ # 將主機的 1433 埠對應到容器的 1433 埠(SQL Server 預設埠)
-v ~/docker/mssql/data:/var/opt/mssql \ # 掛載資料夾以持久化資料(主機 ↔ 容器)
mcr.microsoft.com/mssql/server:2022-latest # 指定使用的映像檔(SQL Server 2022 最新版本)
```
> 📂 用途:保存 SQL Server 資料,即使刪容器資料也不會消失。
---
## 2. 啟動 SQL Server 容器
```bash
docker run -d --name mssql --platform linux/amd64 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<你的密碼>" -e "MSSQL_PID=Developer" -e "TZ=Asia/Taipei" -p 1433:1433 -v ~/docker/mssql/data:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latest
```
> 🔸 `--platform linux/amd64`:Apple M4 必加
> 🔸 `-v`:掛載資料夾以持久化資料
> 🔸 `-p 1433:1433`:讓主機透過 1433 埠連線至 SQL Server
---
## 3. 檢查容器狀態與日誌
```bash
docker ps
docker logs -f mssql
```
看到:`SQL Server is now ready for client connections.`
即表示 SQL Server 啟動成功 🎉
離開日誌模式 → **按下 `Ctrl + C`**
---
## 4. 建立測試資料庫與資料表
### 進入 SQL Server 容器內
```bash
docker exec -it mssql bash -lc "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P '<你的密碼>' -C"
```
```
docker exec -it mssql bash -lc "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P '<你的密碼>' -C -Q 'SELECT @@VERSION;'"
```
### 建立資料庫 `Test`
```sql
CREATE DATABASE Test;
GO
USE Test;
GO
```
### 建立資料表 `Employees`
```sql
CREATE TABLE Employees (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(50),
Department NVARCHAR(50),
Salary INT,
HireDate DATE
);
GO
```
### 插入測試資料
```sql
INSERT INTO Employees (Name, Department, Salary, HireDate)
VALUES
('Alice', 'IT', 60000, '2023-05-01'),
('Bob', 'Finance', 55000, '2022-09-15'),
('Charlie', 'HR', 50000, '2021-12-20');
GO
```
### 查詢確認
```sql
SELECT * FROM Employees;
GO
```
離開 `sqlcmd`:
```sql
QUIT
```
---
## 5. 刪除測試資料庫(清理環境)
### 重新進入容器
```bash
docker exec -it mssql bash -lc "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P '<你的密碼>' -C"
```
### 刪除 `Test` 資料庫
```sql
ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;
GO
QUIT
```
> ✅ 執行後,`Test` 資料庫會被完全移除。
---
## 6. 從 macOS 主機連線 (使用 DataGrip)
| 項目 | 值 |
| ------------- | --------------------------------- |
| Database Type | Microsoft SQL Server |
| Host | `localhost` |
| Port | `1433` |
| User | `sa` |
| Password | `<你的密碼>` |
| Database | 可選填(例如 Test) |
| SSL / TLS | 勾選 **Trust server certificate** |
> 💡 在 DataGrip 連線設定中勾選「Trust server certificate」即可避免憑證錯誤。
### CLI 方式(安裝新版 sqlcmd)
```bash
brew install sqlcmd
sqlcmd -S localhost -U sa -P '<你的密碼>' -C -Q "SELECT name FROM sys.databases;"
```
---
## 7. 常用維運指令(含註解)
```bash
# 查看目前正在運行的所有容器清單
docker ps
# 追蹤指定容器 (mssql) 的即時日誌輸出
# 按下 Ctrl + C 可離開追蹤模式
docker logs -f mssql
# 重新啟動容器 (先停止再啟動)
docker restart mssql
# 停止容器的執行(但不刪除)
docker stop mssql
# 啟動已經停止的容器
docker start mssql
# 強制刪除容器(不會刪除掛載在主機的資料,例如 ~/docker/mssql/data)
docker rm -f mssql
```
---
## 8. 關閉 Docker 與服務
```bash
# 停止單一 SQL Server 容器
docker stop mssql
# 停止所有容器
docker stop $(docker ps -q)
# 刪除 container
docker rm -f mssql
# 關閉 Docker Desktop 應用程式
osascript -e 'quit app "Docker"'
```
重新開啟 Docker Desktop:
```bash
open -a Docker
```
---
## 附註設定
| 項目 | 建議設定 |
| --------------- | -------------------------------------------- |
| SQL Server 版本 | `mcr.microsoft.com/mssql/server:2022-latest` |
| 密碼規則 | ≥8 碼,含大小寫、數字、符號 |
| 建議記憶體 | Docker Desktop → Resources → Memory ≧ 4 GB |
| 預設資料夾 | `~/docker/mssql/data` |
| 預設埠 | 1433(可改為 11433) |
| 測試資料庫 | Test(可刪除) |
| 測試資料表 | Employees(含三筆測試資料) |