前言
近年來我盡量會把開發環境給部署到 Docker 容器內,如此占用系統資源少上很多,且可攜性也較高。倒是沒注意到,原來早在 2017年9月發布的 SQL Server 2017 ,就已經是完整支援 Docker 容器的正式版本。這也代表著 MS 在容器化和跨平台策略上的重大轉變,使 SQL Server 能夠更靈活地部署在各種環境中,不再局限於 Windows 平台。
其實在個人課程講授所使用到的 C# 專案範例,大多是透過 NuGet 安裝 Sqlite 這種極輕量化的資料庫已很受用,將資料庫檔案放置於專案目錄內,唯一要修改的地方就是關於資料庫的連線路徑問題,其它倒也沒啥問題。
例如前幾年我就已使用 Sqlite 展示 C# 撰寫 CRUD Template 的 3-tier 分層架構框架,可以在同一個專案內切換 ADO.NET 與 Entity Framework 的資料存取方式,而不會影響到前端 UI 的操作。詳見 -「petstore-crud-template-csharp」。
不過,SQL Server 比起 Sqlite 來說,會比較適合用來處理極大量 (數以百萬筆以上) 資料的儲存與查詢。近期在教授某一大型企業單位時,我就同時安裝了 Docker 容器的 SQL Server 與 MongoDB 作為對比,然後各塞入數十萬關聯數百萬筆資料查詢時的處理方式與效能調校的考量。我準備把該案例整理為通用的電子商務領域,來展示這種極大量資料處理,是如何在傳統關聯式與文件導向式 NoSQL (MongoDB) 資料庫的設計與實作,並會整理為開源專案上傳至 Github 分享參考。
總之,這些開發環境使用 Docker 容器,然後整理成為 docker-compose 腳本,確實好處多多,我也不用擔心連線設置相關問題 (位址、帳號密碼等),只要在腳本內設置好就可以。
Docker Compose 配置
以下關於 Docker Compose 檔案設置了一個完整的 SQL Server 開發環境,包含資料庫伺服器和管理介面,適合開發和測試使用。
其中,資料庫使用了 SQL Server 2022 Express 較為輕量級的版本,而管理工具則同時安裝了一個網頁版本的 Adminer 管理界面,可以操作簡單的管理機制以及可以執行 SQL 陳述。
services:
# SQL Server 服務
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest # 使用最新的 SQL Server 2022
# 如果需要較輕量的版本,可以使用 2019-latest 或其他版本
container_name: sqlserver-dev
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=yourPassw0rd123 # 使用強密碼
- MSSQL_PID=Express # 使用 Express 版本,最接近 LocalDB 的功能集
ports:
- "14360:1433" # 將容器的 SQL Server 連接埠映射到主機
volumes:
- sqlserver-data:/var/opt/mssql # 使用命名卷
# - ~/docker-vols/mssql:/var/opt/mssql # 持久化資料
# - ./init-scripts:/docker-entrypoint-initdb.d # 初始化腳本(可選)
# 可選:加入 Adminer 或其他資料庫管理工具
adminer:
image: adminer:latest
container_name: adminer-sql
ports:
- "8080:8080"
environment:
# - VIRTUAL_HOST= sqlexpress.localhost
- ADMINER_DEFAULT_SERVER=sqlserver
- ADMINER_DESIGN=pappu687
- ADMINER_DEFAULT_USER=sa
- ADMINER_DEFAULT_PASSWORD=yourPassw0rd123
depends_on:
- sqlserver
volumes:
sqlserver-data:
networks:
default:
external: true
name: nginx-proxy
容器啟動與執行
具體如何執行 Docker,可以參考個人先前撰寫的「Docker 安裝 MongoDB 8.x 與 Mongo Express」。至於如何確定可以正常連線,則可以在本機端瀏覽器輸入 Url:localhost:8080 ,當出現登入窗格後,選擇資料庫類型 (MS SQL)、伺服器名稱、帳號/密碼 (這些資訊全已在 docker-compose 內),其中資料庫欄位可以不用指定。

