---
# System prepended metadata

title: 使用 docker 在 mac 上運行 SQL Server

---

使用 docker 在 mac 上運行 SQL Server
==
> 官方：[快速入門：使用 Docker 執行 SQL Server Linux 容器映像](https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash)
> 連線教學：[在 Macbook 上透過 Docker 運行 MSSQL](https://lawrencehutw.medium.com/%E5%9C%A8macbook%E4%B8%8A%E9%80%8F%E9%81%8Edocker%E9%81%8B%E8%A1%8Cmssql-%E4%B8%A6%E7%94%A8azure-data-studio%E9%80%A3%E7%B7%9A-e1e23994a433)

## 使用需求：
- 要在 mac 上使用 SQL Server，但 SQL Server 不支援 mac 上直接使用，所以需要用 docker 容器跑起來
## 安裝 Docker
## 安裝 SQL Server
### 從 Docker Hub 拉取 SQL Server 鏡像
> 鏡像/映像 = image
- `$ docker pull mcr.microsoft.com/mssql/server:2022-latest`
    - `mcr.microsoft.com/mssql/server` 這個就是 image 名稱
    - `2022-latest` 是標籤，通常是版本
- 最新版本指令看 [這裡](https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash#pullandrun2022)
### 執行容器
```
$ docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" \
   -p 1433:1433 --name sql1 --hostname sql1 \
   -d \
   mcr.microsoft.com/mssql/server:2022-latest
```
> [!Warning]
> 因為 Microsoft 預設是以 x86 架構設計的，所以鏡像版本 (linux/amd64) 和 mac(m1/m2) 主機上的版本 (linux/arm64/v8) 會不同，會得到警告，但容器仍有成功執行。
- `-e "ACCEPT_EULA=Y"` ：接受許可協議
- `-e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>"` ：設定密碼，要符合 SQL Server 要求
- `-p 1433:1433`：主機環境的 TCP Port : docker 容器上的 TCP port
    - 如果要在同一個 Image 上建立多個 container，則主機的 Port 號要改 ex: 1435:1433
- `--name sql1`：為容器指定自訂名稱，而不是隨機產生的名稱。如果有多個容器，則無法使用相同名稱
- `--hostname sql1`：用來明確設定容器主機名稱。 如果未指定主機名稱，則會預設為隨機產生之系統 GUID 的容器識別碼。
- `-d`：在背景執行容器(精靈)。
- `mcr.microsoft.com/mssql/server:2022-latest`：SQL Server Linux 容器鏡像

## 檢視容器清單
### 檢視 Docker 容器
`$ docker ps -a`
- 如果看到 STATUS 欄位狀態包含 Up，則表示 SQL Server 容器正在執行中，並且正在接聽 PORT 欄位的連接埠
- 如果看到 STATUS 狀態為 Exited 則表示該容器已停止，可以重新啟用：`$ docker start <containerID or containerName>`

#### 檢視 SQL Server 紀錄錯誤檔
- 可以在容器內檢視紀錄錯誤檔
- `$ docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection`
#### 伺服器已準備好連線
- 如果得到下列訊息，則表示伺服器已準備好連線
`SQL Server is now ready for client connections. This is an informational message; no user action is required.`

## 連線至 SQL Server
- 只要容器成功運行後，就可以連接到 SQL Server
- **GUI** 可以透過兩種方式：
    1. SQL Server Management Studio
    2. Azure Data Studio
        - 安裝 Azure Database Studio：`$ brew install --cask azure-data-studio`
        - create connection，輸入剛剛設定的資料(SQL login)
- **CLI**:
    [連線至 SQL Server](https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash#connect-to-sql-server)
### (非必要) 變更系統管理員(SA)密碼
>[!Warning]
>SA 帳戶是在安裝期間建立的 SQL Server 執行個體系統管理員。
++此帳戶經常是惡意使用者的攻擊目標，所以除非應用程式需要 SA 帳戶，否則應避免啟用。++ 或改用 Windows 驗證登入。
參考：[變更密碼](https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash#sapassword)

### (非必要) 停用 SA 帳戶
- **進入 SQL Server 容器**
`$ docker exec -it sql1 /bin/bash
`
`$ docker exec -it -u root sql1 /bin/bash
`
    - 如果遇到權限問題，可以直接以 root 身份進入容器
    - `sql1` 是自訂的容器名稱 
    - `-u` 是指定使用者
- 安裝 sqlcmd 
    ```
    $ which sqlcmd     
    $ apt-get update   
    $ apt-get install -y unixodbc-dev msodbcsql17
    $ apt-get install -y mssql-tools
    ``` 
    - which 指令是為了確認 sqlcmd 套件路徑
    - apt / apt-get 套件管理包是 Ubuntu 上的管理工具
- 在容器內使用 **sqlcmd** 創建新的 SQL Server 用戶
`$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "當前 SA 密碼" -Q "CREATE LOGIN new_user WITH PASSWORD='新用戶密碼';"
`
- 將新用戶添加到 sysadmin 角色
`$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "當前 SA 密碼" -Q "ALTER SERVER ROLE sysadmin ADD MEMBER new_user;"
`
- 確認新帳號可以成功登入後，將 SA 帳戶移除
`$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "當前 SA 密碼" -Q "ALTER LOGIN SA DISABLE;"
`
- 離開 SQL Server 容器
`$ exit`

