跳至頁尾內容
Iron Academy Logo
學習C#
學習C#

其他類別

在Linux上的Docker中運行SQL Server

[[academy-video-youtube({"vid": "-H5mMexO4_I", "start_time": "0", "title": "SQL Server in Docker on Linux", "creator": "Tim Corey", "length": "18m 20s"})]]

直接在開發機器上安裝資料庫引擎是一個常見的捷徑,但會導致長期問題。 資料庫伺服器是為專用硬體設計的。 它們消耗大量的記憶體和 CPU,隨著安裝多個版本而累積配置債務,當需要測試不同的發行版本時,升級會變得複雜。 Docker 容器通過在輕量、可丟棄的環境中隔離每個資料庫實例來解決所有這些問題。

在他的影片"SQL Server in Docker on Linux"中,Tim Corey 示範如何使用一個 Docker 命令在 Linux 上啟動 Microsoft SQL Server 實例,從 VS Code 連接到它,並執行查詢。 他還展示了如何並排運行多個 SQL Server 版本以及如何在完成工作後進行清理。 如果您正在追隨 Linux 上的 C# 系列或希望快速、可重複的方式來啟動開發用的 SQL Server,這份操作指南涵蓋完整的設置。

為什麼選擇 Docker 而不是本地安裝

[0:00 - 0:57] Tim 以反對本地資料庫安裝的觀點開場。 核心論點:資料庫引擎為專用伺服器設計。 本地安裝意味著無論您是否使用,它們都會消耗資源,而在同一個機器上管理多個版本(SQL 2019、2022、2025)很快就會成為一個維護負擔。

Docker 容器顛覆了這個模型。 每個資料庫都在自己的隔離環境中運行。 需要時啟動它,不需要時停止它。 刪除它並重新開始,無需剩餘配置。 對於開發和測試,此方法比傳統安裝更快設置、更易於維護,且更靈活。

修正 Portainer 重啟策略

[0:57 - 2:17] 在啟動 SQL Server 之前,Tim 注意到Portainer(上集的 Docker 容器 GUI 管理工具)沒有運行。 上次關閉機器時它退出了,因為沒有設置重啟策略。

修正的辦法是兩個命令:

// Set Portainer to restart automatically (unless manually stopped)
docker update --restart unless-stopped portainer

// Start it now
docker start portainer
// Set Portainer to restart automatically (unless manually stopped)
docker update --restart unless-stopped portainer

// Start it now
docker start portainer

unless-stopped策略表示 Portainer 在重啟時會自動重啟,但如果您明確停止它,它會保持停止狀態。 啟動後,在瀏覽器中可於localhost:9000存取 Portainer。 Tim 建議對於您希望始終運行的管理工具採取此策略,而讓資料庫容器採用手動啟動。

用於 SQL Server 的 Docker 運行命令

[2:17 - 6:09] 整個 SQL Server 的設置可以簡化為一個命令。 Tim 使用 LocalSend 裝置(在較早的副任務影片中提到)從他的 Windows 機器傳送該命令,然後逐步解析每一部分:

// Single command to launch SQL Server 2025 in Docker
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 1433:1433 --name sql2025 mcr.microsoft.com/mssql/server:2025-latest
// Single command to launch SQL Server 2025 in Docker
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 1433:1433 --name sql2025 mcr.microsoft.com/mssql/server:2025-latest

每個旗幟都有特定的目的。 -e "ACCEPT_EULA=Y"旗幟接受 Microsoft 的授權協議。 -e "SA_PASSWORD=Test12345"旗幟以純文字形式設置系統管理員密碼,Tim 表示這樣做對於本地開發是可以的,但絕不能用於任何面向生產的東西。 -p 1433:1433旗幟將容器的內部 SQL Server 埠映射到主機上的相同埠。--name sql2025旗幟為容器提供一個人類可讀的標籤。 而映像標籤2025-latest從 Microsoft 的容器註冊表中提取最新的 SQL Server 2025 版本。

運行命令後,Docker 下載映像層、解壓並啟動服務。 整個過程需時數分鐘,大部分是初始下載。

在 Portainer 中驗證

[6:09 - 7:04] 回到 Portainer,新的 SQL Server 容器出現在容器列表中,顯示其狀態為運行中。 此時 Tim 做出了一個慎重的選擇:不進行資料持久化的卷掛載。 如果刪除容器,其中的資料庫也會消失。

這是針對開發設置的有意安排。重新開始意味著沒有累積的測試資料,沒有來自先前實驗的結構變動,以及沒有由於遺留狀態導致的 "在我機器上運行正常" 問題。 如果您想在刪除容器前保留資料庫,可以先導出它們,但對於本地工作,清理的方法是優先的工作流程。

從 VS Code 連接

[7:04 - 8:50] 為了管理資料庫,Tim 安裝了 Microsoft 為 VS Code 提供的 SQL Server 擴充功能。 安裝後,側邊欄中會出現一個新的 SQL Server 面板,您可以在其中新增連接。

連接參數非常簡單。 伺服器名稱是.(點),這意味著是本地主機。由於容器將埠1433(SQL Server 的預設值)映射過了,因此無需指定埠號。 使用者名稱是sa,密碼是 Docker 命令中的密碼,預設資料庫是master。 當提示時,請信任伺服器證書。

連接後,VS Code 顯示 Docker 圖標在連接旁,確認它已檢測到容器化環境。 系統資料庫(master、model、msdb、tempdb)出現在樹狀結構中,隨時可用。

建立資料庫並運行查詢

[8:50 - 12:45] 當建立連接後,Tim 從 VS Code 側邊欄直接建立一個新資料庫,名為PeopleDB。 在其中,他使用可視化設計器建立了一個NVARCHAR(50),非空)。

然後他打開了一個新的查詢視窗並插入了測試資料:

INSERT INTO dbo.People (FirstName, LastName)
VALUES
    ('Tim', 'Corey'),
    ('Sue', 'Storm'),
    ('Dave', 'Corey')
INSERT INTO dbo.People (FirstName, LastName)
VALUES
    ('Tim', 'Corey'),
    ('Sue', 'Storm'),
    ('Dave', 'Corey')

執行SELECT確認行已到位:

SELECT * FROM dbo.People
-- Returns: Tim Corey, Sue Storm, Dave Corey

SELECT * FROM dbo.People WHERE LastName = 'Corey'
-- Returns: Tim Corey, Dave Corey
SELECT * FROM dbo.People
-- Returns: Tim Corey, Sue Storm, Dave Corey

SELECT * FROM dbo.People WHERE LastName = 'Corey'
-- Returns: Tim Corey, Dave Corey

完整過程(建立資料庫、設計表格、插入資料、帶過濾條件的查詢)僅需數分鐘。 一切都是在Docker 容器內運行,通過 VS Code 管理,主機上無需安裝 SQL Server。

停止、啟動和資源管理

[12:45 - 14:20] 當您完成與 SQL Server 的工作後,可以在 Portainer 中單擊一下或在終端輸入一個命令來停止它:

docker stop sql2025
docker stop sql2025

停止的容器釋放所有 CPU 和記憶體資源。 它繼續消耗的唯一資源是映像和容器文件的磁碟空間,這與(通常小於)本地 SQL Server 安裝相當。

Tim 指出這是相較於傳統安裝的核心優勢。 本地安裝的 SQL Server 作為 Windows 或 Linux 服務運行,始終消耗資源。 一個 Docker 容器僅在您選擇啟動時才使用資源。

並列運行多個版本

[14:20 - 17:17] Docker 對資料庫開發的一個最實用的功能是能夠同時運行多個版本。 Tim 通過與現有 2025 容器並行啟動 SQL Server 2022 來展示:

// SQL Server 2022 on a different port
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 2022:1433 --name sql2022 mcr.microsoft.com/mssql/server:2022-latest
// SQL Server 2022 on a different port
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 2022:1433 --name sql2022 mcr.microsoft.com/mssql/server:2022-latest

關鍵差異在於埠映射:-p 2022:1433將容器的內部埠1433映射到主機上的2022埠。這樣可以避免與已經使用1433的2025實例的埠衝突。下載完成後,兩個容器出現在 Portainer 中,可以同時運行。

這非常有用,當客戶在生產環境中運行 SQL Server 2022,而團隊在2025版本上開發。切換版本不需要重新安裝,只需啟動正確的容器。 所有可用的SQL Server 映像(2017、2019、2022、2025)均列在mcr.microsoft.com,同樣的方法也適用於 MySQL、PostgreSQL、MongoDB 和 Cosmos DB。

總結:一個命令構建完整的資料庫環境

[17:17 - 17:47] 操作指南演示了一個 Docker 命令如何取代過去多步驟的安裝過程,涵蓋配置嚮導、服務管理和版本衝突。 容器在幾分鐘內啟動,僅在需要時運行,刪除後不會在主機系統上留下任何痕跡。

對於在多個項目中工作的開發人員來說,這個模式能夠清晰地擴展。 每個專案都有自己的容器、自己的版本和自己的隔離資料。

結論

[17:47 - 18:20] 總結一下:SQL Server 在 Linux 上運行在 Docker 中,使用一個docker run命令。 透過使用 SQL Server 擴充功能從 VS Code 連接,通過側邊欄建立資料庫和表格,像對待任何其他 SQL Server 實例一樣撰寫查詢。 完成後,停止容器並回收資源。

using Docker 進行資料庫管理和 VS Code 進行查詢的組合,為您提供了一個完整的在 Linux 上的 SQL 開發流程,而不需要本地資料庫安裝。

範例提示:如果需要測試特定的 SQL Server 版本,請查看mcr.microsoft.com以獲取所有可用標籤。 您可以透過為每個容器指派不同的主機埠(1433、2019、2022、2025)同時運行2017、2019、2022和2025。 以具描述性的名稱命名它們(sql2022),這樣 Portainer 和docker ps輸出能夠保持可讀性。

觀看完整影片於他的 YouTube頻道,獲得更多在 Linux 上使用資料庫開發 C# 的見解。

Hero Worlddot related to 在Linux上的Docker中運行SQL Server
Hero Affiliate related to 在Linux上的Docker中運行SQL Server

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話