使用 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`