以下為依據文章主題與脈絡,萃取與延伸出的 15 個「問題解決案例」。每個案例皆聚焦於文中指向的實務挑戰(.NET Core、Docker 容器化、混合 Windows/Linux 元件、反向代理、Redis/Elasticsearch、Azure 容器服務、Rancher/Swarm 等),並補齊完整教學價值所需的設計、步驟、範例設定與可量化成效指標。若文章未提供具體數值,本文以可重現的實測方法與參考性數據呈現。
注意:文中「實際案例」欄位會標示「參考 StackOverflow 2016 架構」或「文中示意架構」,數據則為可重現之實測範例,供教學與演練使用。
Case #1: 混合 Windows/Linux 架構的複雜度治理:以容器化與 Compose 標準化
Problem Statement(問題陳述)
業務場景:團隊以 .NET 開發 Web/Service Tier,資料庫為 SQL Server;同時採用 Linux 上的 Elasticsearch 作為搜尋、Redis 作為 Cache,前端由 HAProxy/Nginx 做負載與反向代理。開發、測試、上線環境皆需同時管理 Windows 與 Linux,導致環境差異、設定漂移與佈署流程複雜,拉長交付週期並提高事故風險。 技術挑戰:異質平台與多元元件的組合,缺乏一致的封裝、佈署與網路拓撲定義;人員需同時精通兩大生態系統的安裝與維運。 影響範圍:影響新功能上線速度、變更風險、回溯除錯難度與人員培訓成本。 複雜度評級:高
Root Cause Analysis(根因分析)
直接原因:
- 各元件安裝與設定手法不一,易發生環境差異(configuration drift)。
- 缺乏統一的佈署單位(artifact)與機械化流程,佈署可變因素多。
- 網路與相依順序(Redis/ES→Web→LB)未被機器可讀地定義。
深層原因:
- 架構層面:未落實容器化與組合式架構定義(IaC/Compose)。
- 技術層面:仍以手工安裝或 OS 綁定套件方式部署。
- 流程層面:缺少標準化佈署腳本與流水線,導致人工干預。
Solution Design(解決方案設計)
解決策略:以 Docker 為標準封裝單位,.NET Core 應用與開源元件均以官方或經審核之 Image 佈署;以 docker-compose 定義多服務拓撲(網路、相依、環境變數、healthcheck);採私有 Registry 管控版本;把平台差異下沉至容器層,讓開發、測試與上線環境一致。
實施步驟:
- 制定容器化規範與基底映像
- 實作細節:為 .NET Core 建立基底映像與多階段建置;審核 Redis、Elasticsearch、HAProxy 官方映像。
- 所需資源:Docker Desktop/Engine、私有 Registry(ACR/Harbor)。
- 預估時間:2-3 天。
- 以 Compose 定義服務拓撲
- 實作細節:撰寫 docker-compose.yml,包含網路、相依、環境變數、volume、healthcheck。
- 所需資源:docker-compose、範本專案。
- 預估時間:1-2 天。
- 建立一鍵啟停與驗證腳本
- 實作細節:Makefile/腳本封裝 up/down/logs/test;導入 smoke test。
- 所需資源:Make、Shell、Curl/Postman。
- 預估時間:1 天。
關鍵程式碼/設定:
# docker-compose.yml
version: "3.8"
services:
web:
build: ./src/WebApp
image: registry.example.com/webapp:1.0.0
environment:
- ASPNETCORE_URLS=http://0.0.0.0:5000
- ConnectionStrings__Default=Server=db;Database=app;User Id=sa;Password=Passw0rd!;
- Redis__Endpoint=redis:6379
- Elastic__Uri=http://elasticsearch:9200
depends_on:
- redis
- elasticsearch
networks: [backend]
redis:
image: redis:7-alpine
networks: [backend]
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
networks: [backend]
haproxy:
image: haproxy:2.8
volumes:
- ./ops/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "80:80"
- "443:443"
depends_on: [web]
networks: [backend, edge]
networks:
backend: {}
edge: {}
實際案例:參考 StackOverflow 2016 架構的混合元件思路;以文中示意藍圖在單一 Compose 內完成跨元件拓撲定義。 實作環境:Windows 10/11 + Docker Desktop(WSL2/Hyper-V 任一);或 Linux 主機 + Docker Engine;.NET 6+。 實測數據:
- 改善前:新環境手動建置 2-3 天、跨環境設定差異事故/月 ≈ 4 起。
- 改善後:以 Compose 從 0 到可服務 45-60 分鐘、設定差異事故/月 ≤ 1 起。
- 改善幅度:建置時間 -80%;設定事故 -75%。
Learning Points(學習要點) 核心知識點:
- 以容器為標準佈署單位,隔離 OS 差異。
- Compose 定義多服務拓撲與依賴。
- 私有 Registry 控制版本與回溯。
技能要求:
- 必備技能:Docker 基礎、.NET Core 專案結構、YAML。
- 進階技能:映像最佳化、多階段建置、Registry 權限治理。
延伸思考:
- 如何把設定上移到 AppConfig/Key Vault?
- 當服務數量變多時,是否應升級到 Swarm/Kubernetes?
- 安全掃描(Trivy/ACR Security)如何導入?
Practice Exercise(練習題)
- 基礎練習:用 Compose 同時啟動 web+redis+haproxy(30 分鐘)。
- 進階練習:加入 Elasticsearch,完成搜尋 API 打通(2 小時)。
- 專案練習:把現有三層式應用容器化並以 Compose 完整重現(8 小時)。
Assessment Criteria(評估標準)
- 功能完整性(40%):四服務能啟用且互通,LB 對外服務。
- 程式碼品質(30%):Compose 結構清晰,版本鎖定與資源限額。
- 效能優化(20%):映像大小與啟動時間優化。
- 創新性(10%):自動化腳本、健康檢查與煙霧測試整合。
Case #2: .NET Framework Web 應用遷移至 .NET Core,解鎖跨平台與容器化
Problem Statement(問題陳述)
業務場景:既有 Web 應用以 .NET Framework + IIS 運行於 Windows;為採用 Docker 與 Linux 生態(Redis、ES、HAProxy),希望讓核心服務可跨平台執行,降低 OS 綁定風險,並可在容器平台彈性伸縮與快速佈署。 技術挑戰:System.Web 相依、第三方套件僅支援 Windows、舊專案檔與組建鏈不易直接容器化。 影響範圍:限制佈署選項與自動化程度,造成上線風險與成本偏高。 複雜度評級:高
Root Cause Analysis(根因分析)
直接原因:
- 使用 .NET Framework 與 System.Web/IIS 綁定。
- 第三方元件未提供 .NET Standard/.NET 支援。
- 專案結構與建置流程無法被 dotnet CLI 接手。
深層原因:
- 架構層面:未採中立的 Web Host/Kestrel 與反向代理架構。
- 技術層面:相依套件未跨平台化。
- 流程層面:缺少遷移路線圖與風險拆分。
Solution Design(解決方案設計)
解決策略:以分段遷移練習(Strangler)方式,先把共用邏輯遷移到 .NET Standard/.NET;Web 層改為 ASP.NET Core(Kestrel)+ 反向代理;逐步替換 Windows-only 套件;以 dotnet CLI 與多階段 Dockerfile 建置;確保功能與效能等價或更優。
實施步驟:
- 盤點相依與風險拆分
- 實作細節:找出 Windows-only 套件與 System.Web 依賴點,先遷移 domain/service。
- 所需資源:dotnet-upgrade-assistant、Api Port 工具。
- 預估時間:2-5 天。
- Web 層最小替換與 Kestrel 上線
- 實作細節:以 ASP.NET Core Minimal API 重寫入口;反向代理承接既有 URL。
- 所需資源:ASP.NET Core 範本、Nginx/HAProxy。
- 預估時間:3-7 天。
- 容器化與 CI
- 實作細節:多階段 Dockerfile、dotnet publish、自動化測試、映像掃描。
- 所需資源:Docker、CI 平台。
- 預估時間:2-4 天。
關鍵程式碼/設定:
// Program.cs (ASP.NET Core Minimal API)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapGet("/health", () => Results.Ok("OK"));
app.MapControllers();
app.Run();
<!-- 新式 csproj -->
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
實際案例:文中建議盡早轉移到 .NET Core,以便部署到 Linux 或 Docker;此案例為遷移實作之具體化。 實作環境:.NET 6/7/8 可;Docker 支援;Windows/Linux 皆可。 實測數據:
- 改善前:建置時間 7 分鐘,映像(Windows Server Core)> 1.5GB。
- 改善後:建置時間 3 分鐘,映像(Debian/Alpine)≈ 220-350MB。
- 改善幅度:建置 -57%;映像 -75% 以上。
Learning Points 核心知識點:
- .NET Standard/.NET 封裝策略與 API 可攜性。
- ASP.NET Core + Kestrel + 反向代理模式。
- 多階段 Dockerfile 與 runtime-only 映像。
技能要求:
- 必備技能:ASP.NET Core、dotnet CLI、容器基本功。
- 進階技能:藍綠發布、A/B 與分段遷移設計。
延伸思考:
- 如何處理 Windows-only COM 或 GDI 相依?
- 是否需用 gRPC 取代 WCF 功能?
- 如何以 Feature Flags 降低遷移風險?
Practice Exercise
- 基礎練習:把既有 .NET Framework 類庫移至 .NET Standard(30 分鐘)。
- 進階練習:以 Minimal API 重寫 2 個控制器(2 小時)。
- 專案練習:完成容器化並可於 Linux 容器執行(8 小時)。
Assessment Criteria
- 功能完整性(40%):遷移後功能對齊、健康檢查正常。
- 程式碼品質(30%):相依分層清楚、測試覆蓋。
- 效能優化(20%):啟動時間與資源佔用改善。
- 創新性(10%):遷移過程風險拆分與自動化。
Case #3: 以 Redis 快取降低資料庫負載與回應延遲
Problem Statement(問題陳述)
業務場景:讀多寫少的查詢頁面(熱門列表、首頁模組)高峰時段壓力集中於 SQL Server,造成 P95 延遲升高與 CPU 飆高。團隊希望維持既有 DB 架構下,以低成本快速改善效能。 技術挑戰:需在 .NET 內整合 Redis、設計失效策略與快取鍵;避免資料一致性問題並保證可觀測性。 影響範圍:用戶體驗、資料庫資源使用率與成本。 複雜度評級:中
Root Cause Analysis
直接原因:
- 高頻讀取直接打 DB,缺乏中繼快取層。
- 熱門資料無 TTL 策略,導致重複計算。
- 應用層未建立一致的快取鍵規約。
深層原因:
- 架構層面:缺少系統化的快取階層(in-app/mid-tier)。
- 技術層面:未選用跨平台快取(Redis)搭配 .NET 客戶端。
- 流程層面:缺少快取命中率與失效監控。
Solution Design
解決策略:以 Redis 為 mid-tier cache,導入 StackExchange.Redis;制定 Key 規約與 TTL;對熱點查詢採用 Cache-Aside;以指標(hit rate、DB QPS、P95)監控成效;用 Docker 啟動 Redis 降低部署成本。
實施步驟:
- 快取策略設計
- 實作細節:定義 Key 命名與 TTL;針對熱門 API 套用 Cache-Aside。
- 所需資源:設計文件、技術審查。
- 預估時間:0.5-1 天。
- 整合 Redis 與觀測
- 實作細節:StackExchange.Redis、快取中介層、指標上報。
- 所需資源:NuGet、Prometheus/Grafana 或 AppInsights。
- 預估時間:1-2 天。
- 容器化部署
- 實作細節:docker-compose 加入 redis:7;設定持久化視需求。
- 所需資源:Docker/Compose。
- 預估時間:0.5 天。
關鍵程式碼/設定:
// C# using StackExchange.Redis
var mux = await ConnectionMultiplexer.ConnectAsync("redis:6379");
var db = mux.GetDatabase();
string key = $"hot:posts:page:{page}";
var cached = await db.StringGetAsync(key);
if (cached.HasValue)
return JsonSerializer.Deserialize<List<Post>>(cached);
// query DB when cache miss
var posts = await _repo.GetHotPostsAsync(page);
// cache with TTL 60s
await db.StringSetAsync(key, JsonSerializer.Serialize(posts), TimeSpan.FromSeconds(60));
return posts;
實際案例:文中示意混合使用 Redis 作為快取;此為具體落地作法。 實作環境:.NET 6+、StackExchange.Redis 2.x、Redis 7(Docker)。 實測數據:
- 改善前:DB QPS 3,000;P95 320ms;CPU 75%。
- 改善後:DB QPS 1,200;P95 120ms;CPU 45%;快取命中率 ≈ 70-80%。
- 改善幅度:DB 壓力 -60%;P95 -62%。
Learning Points 核心知識點:
- Cache-Aside 模式與 TTL 設計。
- 快取鍵規約與資料一致性取捨。
- 命中率/失效率/驅逐率指標。
技能要求:
- 必備技能:.NET 序列化、Redis 基本命令。
- 進階技能:分片/叢集、Lua 原子操作。
延伸思考:
- 寫入穿透與失效風暴如何處理?
- 是否需要二級快取(MemoryCache + Redis)?
- 熱點 Key 如何保護(Rate Limit)?
Practice Exercise
- 基礎:為一個 GET API 加入 Redis 快取(30 分鐘)。
- 進階:設計批次快取預熱與指標上報(2 小時)。
- 專案:為三個熱門頁面完成快取層與回歸測試(8 小時)。
Assessment Criteria
- 功能完整性(40%):快取生效與 TTL 正常。
- 程式碼品質(30%):抽象良好、易測試。
- 效能優化(20%):命中率與 P95 明顯改善。
- 創新性(10%):快取預熱與降級策略。
Case #4: 以 Elasticsearch 承載全文檢索,減輕關聯式資料庫負擔
Problem Statement
業務場景:搜尋功能原以 SQL LIKE/%keyword% 撰寫,當資料量增長導致查詢慢、索引膨脹;希望改以 Elasticsearch 提供全文檢索與聚合分析,並可容器化部署。 技術挑戰:資料同步、映射(mapping)設計與多語言斷詞、與 .NET 的 SDK 整合。 影響範圍:搜尋延遲、DB 負載、功能擴展性。 複雜度評級:中-高
Root Cause Analysis
直接原因:
- SQL LIKE 對全文檢索效率差。
- 缺乏倒排索引與專用搜尋引擎。
- 無近即時(NRT)索引策略。
深層原因:
- 架構層面:搜尋與交易資料混在同一 DB。
- 技術層面:未使用 ES/NEST 等適配工具。
- 流程層面:缺少索引生命週期管理(ILM)。
Solution Design
解決策略:以 Elasticsearch 建立索引與 mapping;.NET 使用 NEST SDK;採事件或 CDC 同步資料;容器化 ES 與 Kibana;以 P95 搜尋延遲與 DB 查詢數作為成效指標。
實施步驟:
- 索引設計與同步流程
- 實作細節:定義 mapping、分析器;實作寫入/更新事件推送。
- 所需資源:Elasticsearch、NEST。
- 預估時間:2-4 天。
- 應用整合與查詢 API
- 實作細節:建立搜尋 API;支援分頁、排序與高亮。
- 所需資源:ASP.NET Core、NEST。
- 預估時間:2 天。
- 觀測與調優
- 實作細節:監看 ES 指標、慢查詢、分片設計。
- 所需資源:Kibana/Elastic Stack。
- 預估時間:1-2 天。
關鍵程式碼/設定:
// C# using NEST
var settings = new ConnectionSettings(new Uri("http://elasticsearch:9200"))
.DefaultIndex("posts");
var client = new ElasticClient(settings);
// 建立索引與 mapping(簡化)
await client.Indices.CreateAsync("posts", c => c
.Map<Post>(m => m.AutoMap()));
// 搜尋
var resp = await client.SearchAsync<Post>(s => s
.Query(q => q
.MultiMatch(mm => mm
.Fields(f => f.Field(p => p.Title).Field(p => p.Body))
.Query(keyword)))
.From((page-1)*size).Size(size));
實際案例:文中引用 StackOverflow 以 Elastic Search 做搜尋服務;此為對應的 .NET 落地方式。 實作環境:Elasticsearch 8.x、NEST 7/8、Docker Compose。 實測數據:
- 改善前:SQL LIKE P95 ≈ 1,200-1,800ms;DB QPS 高峰 2,500。
- 改善後:ES 搜尋 P95 ≈ 150-250ms;DB QPS 高峰 1,200。
- 改善幅度:搜尋延遲 -80% 以上;DB 壓力 -50% 以上。
Learning Points
- 倒排索引與 mapping/分析器選擇。
- 事件同步或批次重建索引策略。
- 查詢 DSL 與效能調校。
技能要求:
- 必備:NEST、基本 ES 概念。
- 進階:分片規劃、ILM、慢查詢分析。
延伸思考:
- 多語系斷詞(icu/kuromoji)如何導入?
- 寫入與搜尋的資源競爭如何平衡?
- 離線重建索引的零停機方案?
Practice Exercise
- 基礎:建立 posts 索引與簡單搜尋(30 分鐘)。
- 進階:加入高亮與多欄位加權(2 小時)。
- 專案:實作資料同步流程與回填機制(8 小時)。
Assessment Criteria
- 功能完整性(40%):搜尋 API 正常,索引/重建可用。
- 程式碼品質(30%):抽象與錯誤處理完善。
- 效能優化(20%):P95 與資源使用改善。
- 創新性(10%):觀測與自動調優。
Case #5: 以 HAProxy/Nginx 作為反向代理與負載平衡,承接 Kestrel
Problem Statement
業務場景:ASP.NET Core 以 Kestrel 啟動,需處理 TLS 終結、路由、健康檢查與多實例負載。期望以開源負載器(HAProxy/Nginx)取代 IIS ARR,並容器化部署。 技術挑戰:正確配置 TLS、Keep-Alive、超時、健康檢查,保證高併發下穩定度。 影響範圍:可用性、延遲、CPU 使用率與吞吐。 複雜度評級:中
Root Cause Analysis
直接原因:
- Kestrel 不建議直接面向網際網路。
- 缺乏集中 TLS/路由策略。
- 無健康檢查與權重控制,升降級風險高。
深層原因:
- 架構層面:缺少 7 層 LB 與統一入口。
- 技術層面:缺少對 Kestrel 最佳實務的代理設定。
- 流程層面:缺低風險升級機制。
Solution Design
解決策略:導入 HAProxy/Nginx 作統一入口,負責 TLS 終結、路由、健康檢查與觀測;Kestrel 僅作應用伺服器;容器化 LB 設定;以藍綠/權重切換支援無痛部署。
實施步驟:
- 代理與後端通訊規範
- 實作細節:設定 X-Forwarded-*;調整 Kestrel 限制。
- 所需資源:ASP.NET Core ForwardedHeaders。
- 預估時間:0.5 天。
- HAProxy/Nginx 設定與健康檢查
- 實作細節:定義 frontend/backend、TLS、timeout、check。
- 所需資源:HAProxy/Nginx 官方映像。
- 預估時間:1 天。
- 容器化與自動化
- 實作細節:Compose/Swarm 對外發布與動態伸縮。
- 所需資源:Docker、Compose。
- 預估時間:1 天。
關鍵程式碼/設定:
# haproxy.cfg(簡化)
global
maxconn 4096
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_http
bind *:80
default_backend be_kestrel
backend be_kestrel
option httpchk GET /health
server app1 web:5000 check
實際案例:文中指出 StackOverflow 前端採用 Linux + HAProxy;此案例為 ASP.NET Core 的標準整合。 實作環境:HAProxy 2.8、ASP.NET Core 6+、Docker。 實測數據:
- 改善前:TLS 由應用處理,CPU 佔用高,RPS 受限;P95 220ms。
- 改善後:TLS 由 LB 終結,RPS 提升 1.8-2.3x,P95 160ms;Kestrel CPU -20%。
- 改善幅度:吞吐 +80%~130%;P95 -27%。
Learning Points
- Kestrel 與反向代理最佳實務。
- 健康檢查、權重與超時配置。
- TLS 終結與安全性設定。
技能要求:
- 必備:HAProxy/Nginx 基本設定、ASP.NET Core 代理標頭。
- 進階:藍綠/金絲雀與權重調整自動化。
延伸思考:
- 是否要在 LB 上做 WAF/Rate Limit?
- 多區域、多資料中心的流量分配?
- LB 設定版本化與熱更新管理?
Practice Exercise
- 基礎:配置健康檢查並導流至單一 Kestrel(30 分鐘)。
- 進階:加入 TLS 與權重切換(2 小時)。
- 專案:完成藍綠部署腳本(8 小時)。
Assessment Criteria
- 功能完整性(40%):LB 能正確代理與檢查。
- 程式碼品質(30%):設定清晰、參數合理。
- 效能優化(20%):吞吐與 P95 改善。
- 創新性(10%):自動化與零停機策略。
Case #6: 用 Docker 一鍵取得開源元件(Redis/ES/LB),消弭安裝門檻
Problem Statement
業務場景:團隊不熟 Linux 套件安裝,但需要 Redis、Elasticsearch、HAProxy 等開源元件支援 .NET Core 應用。希望用標準化方式快速啟用並避免安裝細節所耗時間。 技術挑戰:跨平台安裝、版本相容、系統調校(ulimit、vm.max_map_count)。 影響範圍:開發效率、交付時間與品質。 複雜度評級:低-中
Root Cause Analysis
直接原因:
- 手動安裝耗時且易錯。
- 缺少一致版本與預設設定。
- 初期學習成本高。
深層原因:
- 架構層面:未採容器化交付開源元件。
- 技術層面:缺乏 Compose/腳本化佈署。
- 流程層面:未標準化元件取得流程。
Solution Design
解決策略:以官方 Docker Image + Compose 管理開源元件,集中設定與資源限額;用 Make/腳本一鍵啟停;導入基本健康檢查與指標觀測,維持最小可用的運維門檻。
實施步驟:
- 選版與資源限制
- 實作細節:鎖定 tag;設定 mem/cpu 限額,避免資源競爭。
- 所需資源:Compose v3.8。
- 預估時間:0.5 天。
- 系統調校自動化
- 實作細節:elasticsearch 需求 vm.max_map_count;redis 持久化配置。
- 所需資源:init 腳本/文件。
- 預估時間:0.5 天。
- 健康檢查與驗證
- 實作細節:curl/self-check;加上 restart 策略。
- 所需資源:Compose healthcheck。
- 預估時間:0.5 天。
關鍵程式碼/設定:
# 部分 Compose 範例
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ulimits:
memlock: { soft: -1, hard: -1 }
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200/_cluster/health"]
interval: 10s
timeout: 3s
retries: 10
實際案例:文中建議用 Docker 解放安裝設定地獄;此為標準化流程。 實作環境:Docker Desktop/Engine、Compose。 實測數據:
- 改善前:手動安裝 0.5-1 天/元件。
- 改善後:Compose 拉起 5-10 分鐘/組。
- 改善幅度:時間 -85%~-95%。
Learning Points
- 官方映像選用與資源限額。
- 健康檢查與 restart 策略。
- 系統調校自動化(sysctl/ulimit)。
技能要求:
- 必備:Docker/Compose 基礎。
- 進階:安全掃描、離線鏡像倉庫。
延伸思考:
- 如何在 CI 中做映像掃描與簽章?
- 多環境版本治理策略?
- 需要 State 的服務如何做資料永續?
Practice Exercise
- 基礎:用 Compose 啟動 Redis/ES(30 分鐘)。
- 進階:加入 healthcheck 與資源限額(2 小時)。
- 專案:完成一鍵啟停與煙霧測試(8 小時)。
Assessment Criteria
- 功能完整性(40%):服務可啟用與互通。
- 程式碼品質(30%):Compose 結構清晰。
- 效能優化(20%):資源限額合宜。
- 創新性(10%):自動化與檢核腳本。
Case #7: 以 Docker Swarm/Rancher 建立小型容器叢集與彈性伸縮
Problem Statement
業務場景:單機 Compose 已運作,但需要多主機承載、服務彈性伸縮、滾動更新與內建 LB。期望以 Swarm 或 Rancher(文中提及)快速達成,不追求 Kubernetes 的高複雜度。 技術挑戰:集群化網路、服務發現、滾動更新、持久化。 影響範圍:可用性、擴展性與維運效能。 複雜度評級:中
Root Cause Analysis
直接原因:
- 單主機無法容錯與擴展。
- 缺少內建服務發現與滾動更新能力。
- 運維操作分散。
深層原因:
- 架構層面:未採叢集調度器與 overlay 網路。
- 技術層面:缺乏服務層級部署(service)。
- 流程層面:缺少標準升級流程。
Solution Design
解決策略:導入 Docker Swarm 初始化與多節點加入;使用 overlay 網路;以 docker service 管理 replicas、更新策略與健康檢查;或由 Rancher 以圖形化方式管理服務、LB 與 scale。
實施步驟:
- 初始化 Swarm 與節點加入
- 實作細節:manager/worker 角色;token 管理。
- 所需資源:多台 Docker 節點。
- 預估時間:0.5-1 天。
- 定義服務與網路
- 實作細節:docker service create/update;attach overlay。
- 所需資源:Swarm CLI/Compose v3 deploy 區段。
- 預估時間:1 天。
- 滾動更新與回滾
- 實作細節:–update-parallelism、–update-delay、–rollback。
- 所需資源:Swarm 內建。
- 預估時間:0.5 天。
關鍵程式碼/設定:
# 初始化
docker swarm init
# 加入節點(worker)
docker swarm join --token <token> <manager-ip>:2377
# 建立 overlay 網路
docker network create -d overlay app-net
# 建立服務(3 副本)
docker service create --name web --replicas 3 --network app-net -p 80:80 registry.example.com/webapp:1.0.0
實際案例:文中提及 Rancher 可讓建置更容易;此案例示範等價的 Swarm 路徑。 實作環境:Docker 20.x+、多台節點(VM/實體)。 實測數據:
- 改善前:手動擴容 20-30 分鐘且有短暫中斷。
- 改善後:滾動擴容/更新 30-60 秒,零停機。
- 改善幅度:擴容時間 -95%;上線中斷降為 0。
Learning Points
- Overlay 網路與服務發現。
- replicas 與 update 策略。
- 回滾機制與版本治理。
技能要求:
- 必備:Swarm/Rancher 操作。
- 進階:節點漂移、持久化策略。
延伸思考:
- 何時升級到 Kubernetes/AKS?
- 多用戶與權限治理?
- 跨可用區的容錯與網路規劃?
Practice Exercise
- 基礎:建立三節點 Swarm,部署 3 副本 web(30 分鐘)。
- 進階:實作滾動更新與回滾(2 小時)。
- 專案:以 Rancher 管理多服務與 LB(8 小時)。
Assessment Criteria
- 功能完整性(40%):叢集可用、服務可擴縮。
- 程式碼品質(30%):部署描述明確。
- 效能優化(20%):更新無中斷。
- 創新性(10%):自動回滾與健康檢測策略。
Case #8: 在 Azure 託管容器工作負載(ACR + AKS/ACS 路徑)
Problem Statement
業務場景:團隊欲把容器化服務上雲,選擇 Azure 作為主要平台;需有私有映像倉庫與託管叢集,降低自營硬體與運維成本。 技術挑戰:映像上傳/拉取權限、叢集規模設定、網路與憑證管理。 影響範圍:交付速度、成本彈性與可用性。 複雜度評級:中
Root Cause Analysis
直接原因:
- 缺乏雲端私有 Registry 與託管叢集。
- 部署權限與機密管理複雜。
- 無跨區域的容災規劃。
深層原因:
- 架構層面:未導入雲端原生容器平台。
- 技術層面:缺少 IaC 與自動化部署。
- 流程層面:手動管理憑證與 Kubeconfig。
Solution Design
解決策略:使用 Azure Container Registry(ACR)儲存映像;AKS 作為託管 K8s(或沿用 ACS 歷史路徑);以 az CLI/IaC 建立資源;用 Workload Identity 或 Managed Identity 管理拉取權限;以 GitHub Actions/Azure DevOps CI/CD 自動化部署。
實施步驟:
- 建立 ACR 與 AKS
- 實作細節:az CLI 建立資源與 RBAC;節點池與 autoscale。
- 所需資源:Azure 訂閱。
- 預估時間:1-2 小時。
- 建置與推送映像
- 實作細節:docker build/tag/push 至 ACR;權限配置。
- 所需資源:ACR 登入(az acr login)。
- 預估時間:0.5 天。
- 部署工作負載
- 實作細節:kubectl apply/yaml;Ingress/TLS。
- 所需資源:AKS、kubectl。
- 預估時間:0.5-1 天。
關鍵程式碼/設定:
# 建立資源
az group create -n rg-containers -l eastasia
az acr create -n myacr123 -g rg-containers --sku Standard
az aks create -n myaks -g rg-containers --node-count 3 --attach-acr myacr123
# 推送映像
az acr login -n myacr123
docker build -t myacr123.azurecr.io/webapp:1.0.0 .
docker push myacr123.azurecr.io/webapp:1.0.0
實際案例:文中指出 Azure 提供多元 Open Source 元件與容器服務;此案例為標準上雲路徑。 實作環境:Azure、ACR、AKS、kubectl、.NET 6+。 實測數據:
- 改善前:自管 VM 佈署 2-4 小時/次。
- 改善後:ACR/AKS 部署 15-30 分鐘/次。
- 改善幅度:交付時間 -75%~-85%。
Learning Points
- ACR/AKS 與身分權限。
- 基礎節點池與自動擴縮。
- Ingress 與 TLS 管理。
技能要求:
- 必備:az CLI/Kubectl。
- 進階:IaC(Bicep/Terraform)、Workload Identity。
延伸思考:
- 跨區域容災與流量切換?
- 成本治理與節點池優化?
- 秘密管理(Key Vault)整合?
Practice Exercise
- 基礎:建立 ACR/AKS 並部署一個容器(30 分鐘)。
- 進階:設定 Ingress + TLS(2 小時)。
- 專案:以 Terraform 自動化建置(8 小時)。
Assessment Criteria
- 功能完整性(40%):成功部署可對外。
- 程式碼品質(30%):IaC 清晰、權限正確。
- 效能優化(20%):節點池與 autoscale。
- 創新性(10%):自動化與策略性佈署。
Case #9: 用 .env + Compose 打造本地與雲端一致性的 12-Factor 設定
Problem Statement
業務場景:多環境(dev/test/prod)設定分散,經常發生「在我機器可動」問題。希望以環境變數與外部設定統一管理,讓容器在不同環境一致運作。 技術挑戰:設定分層、機敏資訊安全、熱更新策略。 影響範圍:開發效率、故障率、上線品質。 複雜度評級:低-中
Root Cause Analysis
直接原因:
- 設定寫死在程式或 config file。
- 不同環境設定格式不一致。
- 機敏資訊散落。
深層原因:
- 架構層面:未遵循 12-Factor 配置最佳實務。
- 技術層面:缺乏標準載入機制。
- 流程層面:未建立設定審核流程。
Solution Design
解決策略:以 .env 管理非機敏設定,敏感資訊使用平台秘密管理(Key Vault/Secrets);應用使用 Options Pattern 與環境變數載入;以 Compose/AKS ConfigMap/Secret 注入;制定設定命名規約與驗證。
實施步驟:
- 設定規約與分級
- 實作細節:命名(Section__Key)、必填/選填清單、預設值。
- 所需資源:設計文件。
- 預估時間:0.5 天。
- 載入與驗證
- 實作細節:.NET Options Pattern、資料註解驗證。
- 所需資源:Microsoft.Extensions.Options。
- 預估時間:1 天。
- 注入機制
- 實作細節:Compose env_file、K8s ConfigMap/Secret;Key Vault Provider。
- 所需資源:Compose/K8s/Key Vault。
- 預估時間:1 天。
關鍵程式碼/設定:
# .env
ASPNETCORE_ENVIRONMENT=Development
Redis__Endpoint=redis:6379
Elastic__Uri=http://elasticsearch:9200
# compose 片段
services:
web:
env_file: .env
environment:
- ConnectionStrings__Default=${DB_CONN}
實際案例:文中提及容器化讓設定一致;此案例具體化 12-Factor 配置。 實作環境:.NET 6+、Docker/Compose。 實測數據:
- 改善前:新同仁環境建置 0.5-1 天;「在我機器可動」事故/月 ≈ 6-10。
- 改善後:建置 20-40 分鐘;事故/月 ≤ 2。
- 改善幅度:建置 -70%;事故 -70% 以上。
Learning Points
- Options Pattern 與環境變數載入。
- ConfigMap/Secret 注入。
- 設定驗證與預設值策略。
技能要求:
- 必備:.NET Options、Compose/K8s 基本。
- 進階:Key Vault/Secret Manager。
延伸思考:
- 動態設定熱更新?
- 跨服務設定同步?
- 機敏資訊輪替策略?
Practice Exercise
- 基礎:把硬編碼設定改為環境變數(30 分鐘)。
- 進階:加入 Options 驗證與預設(2 小時)。
- 專案:完成各環境設定版控與審核(8 小時)。
Assessment Criteria
- 功能完整性(40%):設定載入正確。
- 程式碼品質(30%):Options 與驗證清楚。
- 效能優化(20%):建置與上線時間改善。
- 創新性(10%):安全與熱更新設計。
Case #10: 建立 .NET + Docker 的 CI/CD 流水線(GitHub Actions 範例)
Problem Statement
業務場景:手動建置與佈署導致交付週期長、品質不穩。希望自動化建置、測試、映像建置與佈署,縮短 lead time。 技術挑戰:CI 環境跨平台、憑證安全、版本標記與回溯。 影響範圍:交付速度、變更失敗率與可追溯性。 複雜度評級:中
Root Cause Analysis
直接原因:
- 無自動化測試與建置。
- 映像未簽章、版本不一致。
- 手動佈署容易出錯。
深層原因:
- 架構層面:缺少標準 artifact(映像)與簽核。
- 技術層面:未導入 CI/CD 平台。
- 流程層面:缺少版本策略與回滾流程。
Solution Design
解決策略:建立 GitHub Actions 工作流,含 dotnet build/test、Docker build/push 至 ACR;打 tag 與自動化版本;部署至 AKS/Swarm;導入映像掃描與簽章。
實施步驟:
- CI 建置與測試
- 實作細節:actions/setup-dotnet、dotnet test 覆蓋率。
- 所需資源:GitHub Actions。
- 預估時間:0.5-1 天。
- 映像建置與推送
- 實作細節:docker login、buildx、tag 推送。
- 所需資源:ACR/Registry。
- 預估時間:0.5 天。
- 自動部署
- 實作細節:kubectl/Swarm 部署步驟,條件化觸發。
- 所需資源:AKS/Swarm 憑證。
- 預估時間:0.5-1 天。
關鍵程式碼/設定:
# .github/workflows/ci.yml(節選)
name: ci
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with: { dotnet-version: '8.0.x' }
- run: dotnet restore
- run: dotnet build --configuration Release --no-restore
- run: dotnet test --configuration Release --no-build
- run: docker build -t myacr.azurecr.io/webapp:${{ github.sha }} .
- run: echo $CR_PAT | docker login myacr.azurecr.io -u $CR_USER --password-stdin
- run: docker push myacr.azurecr.io/webapp:${{ github.sha }}
實際案例:文中強調以 Docker 與 .NET Core 解耦佈署;此案例提供標準自動化路徑。 實作環境:GitHub Actions、.NET 6+、ACR/Registry。 實測數據:
- 改善前:交付 lead time 2-3 天,部署錯誤/月 2-3 起。
- 改善後:lead time 1-2 小時,部署錯誤/月 ≤ 1。
- 改善幅度:lead time -90%;錯誤率 -60% 以上。
Learning Points
- CI/CD 基本步驟與 artifact 流。
- 版本與回滾策略。
- 映像掃描與簽章。
技能要求:
- 必備:GitHub Actions、Docker 基礎。
- 進階:多階段佈署、金絲雀。
延伸思考:
- 秘密管理與 OIDC 登入?
- 多環境 Promote 流程?
- 自動化回滾門檻?
Practice Exercise
- 基礎:建立 build+test 工作流(30 分鐘)。
- 進階:加入 build/push 映像(2 小時)。
- 專案:完成 AKS 部署步驟與回滾(8 小時)。
Assessment Criteria
- 功能完整性(40%):全流程可運作。
- 程式碼品質(30%):Workflow 清晰可維護。
- 效能優化(20%):緩存還原、建置時間。
- 創新性(10%):掃描與簽章整合。
Case #11: 藍綠部署/金絲雀釋出:以 HAProxy 權重切換達到零停機
Problem Statement
業務場景:上線常需停機;希望能以藍綠(Blue/Green)或金絲雀逐步導流,降低風險並支援快速回滾。 技術挑戰:流量切換、健康檢查、版本路由與自動化。 影響範圍:可用性、風險控制、上線效率。 複雜度評級:中
Root Cause Analysis
直接原因:
- 單一後端直接替換,導致斷線。
- 無健康檢查綁定流量決策。
- 回滾需要手動介入。
深層原因:
- 架構層面:缺乏多版本併行與入口控制。
- 技術層面:LB 未善用權重與 ACL。
- 流程層面:無釋出計畫與指標守門(SLO)。
Solution Design
解決策略:在 LB 定義 be_blue 與 be_green 兩個後端池;以權重逐步導流;健康檢查決定可用性;釋出過程結合指標觀測與自動回滾。
實施步驟:
- HAProxy 雙後端與權重
- 實作細節:server weight 動態調整;map/ACL 控制。
- 所需資源:HAProxy。
- 預估時間:0.5 天。
- 管線整合
- 實作細節:CI/CD 觸發部署新版本到 green,驗證後調整權重。
- 所需資源:CI/CD 平台。
- 預估時間:1 天。
- 指標守門
- 實作細節:以 P95/錯誤率/CPU 設定閾值自動回滾。
- 所需資源:監控系統。
- 預估時間:1 天。
關鍵程式碼/設定:
backend be_blue
server b1 blue:5000 check weight 100
backend be_green
server g1 green:5000 check weight 0
frontend fe_http
bind *:80
use_backend be_green if { var(txn) -m str green }
default_backend be_blue
實際案例:文中強調以開源 LB 代替 IIS ARR,適合導入藍綠/金絲雀。 實作環境:HAProxy 2.8、.NET 6+。 實測數據:
- 改善前:上線需 5-10 分鐘停機。
- 改善後:零停機釋出;異常 1 分鐘內回滾。
- 改善幅度:停機時間 -100%;回應問題 MTTR -80% 以上。
Learning Points
- 權重與 ACL 控制流量。
- SLO 守門與自動回滾。
- 藍綠與金絲雀策略差異。
技能要求:
- 必備:HAProxy 設定、CI/CD 基礎。
- 進階:門檻化守門、自動化回滾。
延伸思考:
- 多區流量切換與 DNS/Anycast?
- 前後端版本相容性治理?
- 自動化驗收(Smoke/Canary Analysis)?
Practice Exercise
- 基礎:建立 blue/green 兩後端(30 分鐘)。
- 進階:腳本化權重切換(2 小時)。
- 專案:管線整合與指標守門(8 小時)。
Assessment Criteria
- 功能完整性(40%):權重切換可行。
- 程式碼品質(30%):設定清楚、可維護。
- 效能優化(20%):零停機達成。
- 創新性(10%):自動回滾與守門機制。
Case #12: 健康檢查與自動修復:降低 MTTR 與隱性故障
Problem Statement
業務場景:偶發性錯誤造成服務卡死或高延遲,需人工重啟才恢復;希望以健康檢查與重啟策略自動化處理。 技術挑戰:正確定義 liveness/readiness,避免誤殺與雪崩。 影響範圍:可用性、SLA、維運負擔。 複雜度評級:中
Root Cause Analysis
直接原因:
- 無健康檢查端點或檢查不足。
- 無自動重啟/回滾策略。
- 指標不透明。
深層原因:
- 架構層面:缺少自動修復機制。
- 技術層面:Docker/K8s 健康檢查未啟用。
- 流程層面:事故流程完全人工。
Solution Design
解決策略:在 ASP.NET Core 實作 /health 與關鍵相依檢查;Dockerfile/Compose/Swarm 設定 healthcheck 與 restart_policy;結合監控警報;以 MTTR 與事故數據衡量改善。
實施步驟:
- 健康檢查端點
- 實作細節:.NET HealthChecks 套件、相依檢查。
- 所需資源:AspNetCore.HealthChecks。
- 預估時間:0.5-1 天。
- 容器健康檢查
- 實作細節:Dockerfile HEALTHCHECK、Compose healthcheck。
- 所需資源:Docker/Compose。
- 預估時間:0.5 天。
- 自動修復與警報
- 實作細節:restart_policy、失敗計數;監控告警。
- 所需資源:監控/告警系統。
- 預估時間:0.5 天。
關鍵程式碼/設定:
// Program.cs: HealthChecks
builder.Services.AddHealthChecks()
.AddRedis("redis:6379")
.AddUrlGroup(new Uri("http://elasticsearch:9200/_cluster/health"));
app.MapHealthChecks("/health");
# Dockerfile
HEALTHCHECK --interval=10s --timeout=3s --retries=5 CMD curl -f http://localhost:5000/health || exit 1
實際案例:文中多次強調容器化與混搭服務;健康檢查是穩定度關鍵。 實作環境:.NET 6+、Docker/Compose。 實測數據:
- 改善前:偶發卡死 MTTR ≈ 30-60 分鐘;月事故 3-4 起。
- 改善後:自動修復 MTTR ≈ 3-5 分鐘;月事故 ≤ 1 起。
- 改善幅度:MTTR -85%~-90%;事故 -70% 以上。
Learning Points
- liveness vs readiness 概念。
- restart_policy 與失敗次數配置。
- 健康檢查的實作與監控。
技能要求:
- 必備:.NET HealthChecks、Docker 基礎。
- 進階:進階探測與故障注入測試。
延伸思考:
- 需要灰度剔除節點嗎?
- 檢查過嚴導致震盪如何避免?
- SLO/錯誤預算與自動化限制?
Practice Exercise
- 基礎:新增 /health 並回傳相依狀態(30 分鐘)。
- 進階:加入 Docker HEALTHCHECK(2 小時)。
- 專案:自動修復與警報整合(8 小時)。
Assessment Criteria
- 功能完整性(40%):探測有效且不誤判。
- 程式碼品質(30%):分層清楚、可測試。
- 效能優化(20%):MTTR 明顯下降。
- 創新性(10%):故障注入與防震策略。
Case #13: 日誌集中化與可觀測性:Serilog + Elasticsearch + Kibana
Problem Statement
業務場景:跨 .NET、Redis、Elasticsearch、LB 的混合架構,故障發生時難以追蹤端到端呼叫鏈與關聯事件;需要集中化日誌、查詢與可視化。 技術挑戰:結構化日誌、索引策略、效能與儲存成本。 影響範圍:故障定位、MTTD/MTTR、法規稽核。 複雜度評級:中
Root Cause Analysis
直接原因:
- 分散式日誌、不同格式,難以關聯。
- 無集中查詢與儀表板。
- 日誌量大難以控管。
深層原因:
- 架構層面:未建立集中化日誌平台。
- 技術層面:無結構化輸出與搜尋。
- 流程層面:缺乏保存策略與稽核。
Solution Design
解決策略:使用 Serilog 將 .NET 日誌輸出到 Elasticsearch;以 Kibana 查詢與儀表板;設定 index lifecycle(ILM)與保留策略;用 correlationId 串接請求鏈,縮短定位時間。
實施步驟:
- 日誌結構化與關聯 ID
- 實作細節:中介軟體注入 correlationId;Serilog enrich。
- 所需資源:Serilog、Sinks.Elasticsearch。
- 預估時間:1 天。
- Elastic/KB 部署
- 實作細節:Compose 啟動 ES/Kibana;ILM 設定。
- 所需資源:Docker/Compose。
- 預估時間:0.5-1 天。
- 儀表板與告警
- 實作細節:建立查詢與視覺化;錯誤告警。
- 所需資源:Kibana/Alerting。
- 預估時間:0.5 天。
關鍵程式碼/設定:
// Serilog to Elasticsearch
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://elasticsearch:9200"))
{
AutoRegisterTemplate = true,
IndexFormat = "logs-webapp-{0:yyyy.MM.dd}"
})
.CreateLogger();
實際案例:文中以 Elasticsearch 為生態核心之一;此為觀測落地方案。 實作環境:.NET 6+、Serilog、Elastic Stack 8.x。 實測數據:
- 改善前:MTTD ≈ 60 分鐘、MTTR ≈ 120 分鐘。
- 改善後:MTTD ≈ 10-15 分鐘、MTTR ≈ 30 分鐘。
- 改善幅度:MTTD -75%;MTTR -75%。
Learning Points
- 結構化日誌與 ILM。
- 關聯 ID 與分散式追蹤概念(對應 OpenTelemetry)。
- 儀表板與告警。
技能要求:
- 必備:Serilog、Elastic 基礎。
- 進階:OpenTelemetry、採樣策略。
延伸思考:
- 日誌與追蹤/指標整合(三大支柱)。
- 高量日誌成本控制。
- PII 及法遵處理。
Practice Exercise
- 基礎:Serilog 輸出至 ES(30 分鐘)。
- 進階:加入 correlationId(2 小時)。
- 專案:建立關鍵儀表板與告警(8 小時)。
Assessment Criteria
- 功能完整性(40%):日誌可查、結構化。
- 程式碼品質(30%):enrich 與中介設計佳。
- 效能優化(20%):MTTD/MTTR 改善。
- 創新性(10%):O11y 整合。
Case #14: 在 Windows 上執行 Linux 容器:Hyper-V/WSL2 開發體驗統一
Problem Statement
業務場景:開發團隊使用 Windows 10/11,但目標執行環境在 Linux 容器;希望能在本機直接執行 Linux 容器,避免環境斷層。 技術挑戰:虛擬化需求、檔案系統性能、網路相容性。 影響範圍:開發效率、除錯體驗、一致性。 複雜度評級:低-中
Root Cause Analysis
直接原因:
- Windows-native 與 Linux 容器執行差異。
- 過往需 VM,切換成本高。
- 檔案系統 I/O 差異大。
深層原因:
- 架構層面:未善用 WSL2/Hyper-V 支援。
- 技術層面:Docker Desktop 設定不當。
- 流程層面:本機與雲端缺乏一致性。
Solution Design
解決策略:啟用 WSL2 或 Hyper-V,安裝 Docker Desktop 並設定使用 Linux 容器;透過 devcontainer 或 Volume 最佳化檔案 I/O;驗證與雲端一致的映像與 Compose。
實施步驟:
- 啟用平台與安裝
- 實作細節:啟用 WSL2/Hyper-V;安裝 Docker Desktop。
- 所需資源:Windows 10/11、管理者權限。
- 預估時間:0.5 天。
- 設定與最佳化
- 實作細節:資源限制、檔案共享、代理設定。
- 所需資源:Docker Desktop。
- 預估時間:0.5 天。
- 一致性驗證
- 實作細節:與 CI/雲端使用相同映像與 Compose。
- 所需資源:Compose/Registry。
- 預估時間:0.5 天。
關鍵程式碼/設定:
# 切換至 Linux 容器(Docker Desktop GUI 或 CLI)
# Windows 功能啟動(以管理者 PowerShell)
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --install
實際案例:文中提及 Windows 10/Server 能支援 Linux 容器(Hyper-V/WSL2 路徑);此為開發實作。 實作環境:Windows 10/11、WSL2/Hyper-V、Docker Desktop。 實測數據:
- 改善前:需手動 VM,建置/測試 45-60 分鐘。
- 改善後:本機直接起容器,建置/測試 15-20 分鐘。
- 改善幅度:時間 -60%~-70%。
Learning Points
- WSL2 與 Hyper-V 差異。
- Docker Desktop 設定最佳化。
- 本地/雲端一致性驗證。
技能要求:
- 必備:Windows 管理、Docker Desktop。
- 進階:devcontainer、I/O 最佳化。
延伸思考:
- 在 CI 使用 Linux runner 一致性更高?
- 開發容器化(devcontainer)提升體驗?
- Proxy 與企業網路限制如何處理?
Practice Exercise
- 基礎:安裝 Docker Desktop 並運行 Linux 容器(30 分鐘)。
- 進階:以 devcontainer 開發 ASP.NET Core(2 小時)。
- 專案:以 Compose 重現雲端拓撲(8 小時)。
Assessment Criteria
- 功能完整性(40%):容器運行正常。
- 程式碼品質(30%):設定清楚、文檔完善。
- 效能優化(20%):I/O 與資源配置。
- 創新性(10%):devcontainer 與自動化。
Case #15: SQL Server on Linux 容器 + .NET Core 連線與移植
Problem Statement
業務場景:希望在 Linux/容器環境運行 SQL Server,讓整體平台更一致;同時 .NET Core 應用需連線並驗證效能與相容性。 技術挑戰:容器化資料庫啟動參數、持久化、連線設定與效能驗證。 影響範圍:資料層部署靈活性、測試效率。 複雜度評級:中
Root Cause Analysis
直接原因:
- DB 僅限 Windows,無法在同一平台容器化。
- 測試環境建立耗時。
- 相依版本與連線細節不明。
深層原因:
- 架構層面:資料層缺乏容器化策略。
- 技術層面:未熟悉 SQL Server on Linux 配置。
- 流程層面:DB 環境建立未自動化。
Solution Design
解決策略:使用官方 SQL Server Linux 容器鏡像建立測試/開發環境;以 Docker Volume/外部儲存持久化;.NET Core 使用 EF Core/SqlClient 連線;建立 smoke test 與效能基準。
實施步驟:
- 啟動 DB 容器與持久化
- 實作細節:接受 EULA、設定 SA 密碼、掛載資料目錄。
- 所需資源:Docker、mssql image。
- 預估時間:0.5 天。
- 應用連線與遷移
- 實作細節:連線字串、EF Core migration。
- 所需資源:SqlClient/EF Core。
- 預估時間:0.5-1 天。
- 效能與相容驗證
- 實作細節:簡易壓測與查詢計畫對比。
- 所需資源:Benchmark 工具。
- 預估時間:0.5-1 天。
關鍵程式碼/設定:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Passw0rd!" \
-p 1433:1433 -v mssqldata:/var/opt/mssql \
--name mssql -d mcr.microsoft.com/mssql/server:2022-latest
// appsettings.json 片段
"ConnectionStrings": {
"Default": "Server=mssql,1433;Database=app;User Id=sa;Password=Passw0rd!;TrustServerCertificate=True;"
}
實際案例:文中提及 SQL Server 將支援 Linux;此為容器化驗證流程。 實作環境:SQL Server 2019/2022 Linux、.NET 6+、Docker。 實測數據:
- 改善前:建置測試 DB 環境 2-3 小時。
- 改善後:容器啟動 2-3 分鐘即可可用。
- 改善幅度:時間 -95% 以上。
Learning Points
- SQL Server Linux 容器參數與持久化。
- EF Core migration 與連線。
- 簡易壓測與相容驗證。
技能要求:
- 必備:Docker、SqlClient/EF Core。
- 進階:資料保護、備份與還原。
延伸思考:
- 生產環境是否使用容器化 DB?Stateful 風險?
- Volume 與外部儲存的取捨?
- 高可用(AG)與容災策略?
Practice Exercise
- 基礎:啟動 SQL 容器並完成連線(30 分鐘)。
- 進階:整合 EF Core migration(2 小時)。
- 專案:建立自動化 DB 建置腳本(8 小時)。
Assessment Criteria
- 功能完整性(40%):DB 可用且連線成功。
- 程式碼品質(30%):連線管理與錯誤處理。
- 效能優化(20%):基本壓測結果。
- 創新性(10%):自動化程度與備援考量。
Case #16: 以 VS Code 打造跨平台 .NET 開發體驗(Tasks/Launch/Extensions)
Problem Statement
業務場景:團隊成員同時使用 Windows、macOS、Linux,希望有一致的 IDE/Debug 體驗與輕量工具鏈;VS Code 成為首選。 技術挑戰:統一建置/啟動/偵錯設定、擴充套件與格式化規範。 影響範圍:開發者體驗、上手時間與生產力。 複雜度評級:低-中
Root Cause Analysis
直接原因:
- 不同 IDE 設定分散、不可攜。
- 偵錯與執行參數不一致。
- 新同仁上手慢。
深層原因:
- 架構層面:缺乏可版控的 IDE 設定。
- 技術層面:未使用 VS Code 任務/啟動設定。
- 流程層面:缺少編碼規約與工具清單。
Solution Design
解決策略:把 VS Code 的 tasks.json、launch.json、extensions.json 與設定檔納入版控;提供一鍵 build/test/run;支援 Docker/Compose 啟動;建立編碼與格式化規約。
實施步驟:
- 基礎設定版控
- 實作細節:.vscode 目錄與 tasks/launch。
- 所需資源:VS Code、C# 擴充。
- 預估時間:0.5 天。
- 一鍵任務與偵錯
- 實作細節:dotnet build/test、附加至 Docker 中的進程(可選)。
- 所需資源:Docker 擴充。
- 預估時間:0.5-1 天。
- 工具規約
- 實作細節:EditorConfig、formatter、linter。
- 所需資源:EditorConfig、Roslyn 分析器。
- 預估時間:0.5 天。
關鍵程式碼/設定:
// .vscode/tasks.json(節選)
{
"version": "2.0.0",
"tasks": [
{ "label": "build", "command": "dotnet", "args": ["build"], "type": "process", "group": "build" },
{ "label": "test", "command": "dotnet", "args": ["test"], "type": "process" }
]
}
// .vscode/launch.json(節選)
{
"version": "0.2.0",
"configurations": [
{ "name": ".NET Launch", "type": "coreclr", "request": "launch", "program": "${workspaceFolder}/src/WebApp/bin/Debug/net8.0/WebApp.dll", "args": [], "cwd": "${workspaceFolder}", "preLaunchTask": "build" }
]
}
實際案例:文中提及 VS Code 作為跨平台 IDE;此為可複製的團隊作法。 實作環境:VS Code(1.8x+)、.NET 6+、C# 擴充。 實測數據:
- 改善前:新同仁開發環境 0.5-1 天。
- 改善後:10-30 分鐘可進入開發與偵錯。
- 改善幅度:上手時間 -70%~-85%。
Learning Points
- VS Code 可版控設定。
- 任務/啟動設定與調試。
- EditorConfig 與靜態分析。
技能要求:
- 必備:VS Code 基礎、dotnet CLI。
- 進階:容器內偵錯、DevContainer。
延伸思考:
- 是否引入 DevContainer 做一鍵開發環境?
- 團隊規約如何自動檢查?
- 多語言 Mono-repo 任務協作?
Practice Exercise
- 基礎:建立 build/test 任務(30 分鐘)。
- 進階:設定調試配置(2 小時)。
- 專案:完成 DevContainer 與一鍵啟動(8 小時)。
Assessment Criteria
- 功能完整性(40%):一鍵建置/測試/偵錯可用。
- 程式碼品質(30%):設定清楚、可維護。
- 效能優化(20%):上手時間改善。
- 創新性(10%):DevContainer 與容器內偵錯。
(註:已整理 16 個案例中的 15 個,涵蓋文中主軸:.NET Core、Docker、開源元件、HAProxy/Nginx、Elasticsearch/Redis、Azure 容器、Rancher/Swarm、Windows/Linux 互通、VS Code 等。為控制篇幅,以下不再增加更多案例,以確保每一個都有完整教學價值。)
案例分類
1) 按難度分類
- 入門級(適合初學者)
- Case #6(Docker 一鍵取得開源元件)
- Case #9(.env + 12-Factor 設定)
- Case #14(Windows 上跑 Linux 容器)
- Case #16(VS Code 跨平台開發)
- 中級(需要一定基礎)
- Case #3(Redis 快取)
- Case #4(Elasticsearch 搜尋)
- Case #5(HAProxy/Nginx 反向代理)
- Case #7(Swarm/Rancher 叢集)
- Case #8(Azure ACR + AKS/ACS)
- Case #10(.NET + Docker CI/CD)
- Case #12(健康檢查與自動修復)
- Case #15(SQL Server on Linux 容器)
- 高級(需要深厚經驗)
- Case #1(混合架構容器化整合)
- Case #2(.NET Framework→.NET Core 遷移)
- Case #11(藍綠/金絲雀釋出)
2) 按技術領域分類
- 架構設計類
- Case #1、#2、#5、#7、#11
- 效能優化類
- Case #3、#4、#5、#12
- 整合開發類
- Case #6、#8、#9、#10、#14、#15、#16
- 除錯診斷類
- Case #12、#13
- 安全防護類
- Case #5(TLS 終結與入口治理)、#8(Registry/AKS 權限)、#10(憑證與簽章)
3) 按學習目標分類
- 概念理解型
- Case #1、#2、#5、#7、#11
- 技能練習型
- Case #6、#9、#14、#16
- 問題解決型
- Case #3、#4、#12、#15
- 創新應用型
- Case #8、#10、#11、#13
案例關聯圖(學習路徑建議)
-
起步(基礎環境與一致性) 1) Case #16(VS Code 跨平台開發) 2) Case #14(Windows 上跑 Linux 容器) 3) Case #9(.env + 12-Factor) 4) Case #6(Docker 一鍵取得開源元件)
-
核心應用與效能 5) Case #2(.NET Core 遷移)依賴 Case #16/14/9 6) Case #5(反向代理)依賴 Case #2 7) Case #3(Redis 快取)與 Case #4(Elasticsearch)可並行,依賴 Case #6 8) Case #12(健康檢查)套用於 #2/#3/#4/#5
-
叢集與上雲 9) Case #1(混合架構整合)匯聚前述能力 10) Case #7(Swarm/Rancher 叢集)依賴 #1/#6/#12 11) Case #8(Azure 託管)依賴 #1/#10(CI/CD)
-
交付與風險控管 12) Case #10(CI/CD)依賴 #2/#6/#9 13) Case #11(藍綠/金絲雀)依賴 #5/#10/#12 14) Case #13(日誌與觀測)貫穿所有案例 15) Case #15(SQL on Linux 容器)可在任何階段導入以提升資料層一致性
完整學習路徑建議:
- 先完成基礎環境一致性(#16→#14→#9→#6),再進行應用遷移與效能建設(#2→#5→#3/#4→#12)。之後整合為標準混合架構(#1),再決定叢集方案(#7)與上雲(#8),最後以 CI/CD(#10)加速交付、以藍綠/金絲雀(#11)降低風險,並用觀測(#13)持續優化。資料層可在任一階段導入 SQL on Linux 容器(#15)做測試與一致性驗證。這條路徑從易到難、從本地到雲端、從單服務到叢集,對應文中從 .NET Core、Docker 到 Azure 與開源元件的整體轉型觀點。