您可以使用 Visual Studio 將多容器應用程式部署至 Azure Container Apps 。 一般而言,您會將每個容器部署至個別的容器應用程式實例,但您會在相同的容器應用程式環境中包含所有應用程式的容器,以方便且安全地彼此通訊。 您可以將每個容器應用程式設定為接受來自容器環境內的要求,或允許外部流量。 Azure Container Apps 具有高度彈性且可設定,可針對許多可能的微服務案例,以及一組完整的進階監視工具。 如果您使用 Docker Compose 來管理內部部署容器應用程式,您可能會考慮嘗試將它移植到 Azure 中的容器應用程式環境。
此流程涉及使用 Visual Studio 和 Azure 入口網站的幾個步驟。 您也可以使用 Azure CLI 來執行這些動作,但這已超出本教學課程的範圍。 首先,我們會使用您使用 建立多容器應用程式所建置的應用程式,並使用 發佈 程式加以部署。 Visual Studio 會逐步引導您完成建立第一個容器應用程式、容器應用程式環境,以及建立容器登錄來儲存容器映像的步驟。 然後,您會使用其他容器應用程式再次執行發佈程式。 在發布過程中,您務必選擇相同的容器應用程式環境。 最後,您必須設定 Redis 快取以使用 Azure Redis 快取服務。 您可以修改快取組態程式代碼並重新發佈 Web API。 然後,您可以設定許可權來授與應用程式系統指派的受控識別對快取的存取權。
先決條件
- Azure 訂用帳戶。 註冊 免費試用。
- 已安裝 Azure 開發和 Web 開發工作負載的 Visual Studio 2022 或更新版本。
-
https://github.com/MicrosoftDocs/vs-tutorial-samples
資料夾中的 MulticontainerSample 專案。 範例解決方案含兩個專案:Web API 後端和 ASP.NET Razor 前端,就像您在另一個 教學課程中建立的一樣。 您也可以從頭開始建立兩個專案,因為它們是默認範本的非常簡單修改,方法是遵循該教學課程。 您可以略過 Docker Compose 步驟。
部署 Web API 後端
在 [方案總管] 中,以滑鼠右鍵按兩下 [Web API] 項目節點,然後選取 [ 發佈]。
選擇目標 Azure,然後選取 [Azure Container Apps]。
如果您尚未使用與 Azure 訂用帳戶相關聯的帳戶登入,您可以立即登入,或視需要變更租使用者。
在指定容器應用程式的畫面上,選取 [ 新建 ] 以建立新的容器應用程式。
在 [ 建立 Azure 容器應用程式 ] 頁面上,輸入資源群組等詳細數據。 在此步驟中,您會建立新的資源群組、新的容器環境,以及新的容器登錄。
建立資源可能需要一些時間。 完成時,按 [ 下一步] 移至下一個步驟。
在下一個步驟中,您會建立容器登錄。 如果您建立新的容器登錄,系統會要求您提供一些詳細數據。 您可以選擇與容器應用程式相同的區域和資源群組。
下一個步驟會要求您選擇容器組建類型。 如果您沒有 Dockerfile,請選擇 [.NET SDK ],或者如果您這樣做,請選擇 [Docker Desktop ]。
針對部署類型,選擇 [發佈] [產生 pubxml 檔案] 以建立發行配置檔。
選取 [完成 ] 以完成發佈程序,然後建立發行配置檔。 如果您看到有關額外設定以存取已發佈容器的提示,請選擇 [是]。
您會看到一個頁面,其中顯示 Azure 中的活動,當您關閉該頁面時,發佈畫面現在包含您的容器應用程式的資訊,例如輸入 Web API 的 URL。
按兩下 [ 發佈] 按鈕以發佈至 Azure 容器應用程式。 Visual Studio 會要求建立 Azure 資源,並啟動 WebAPI 容器應用程式的發佈程式。
Visual Studio 可能會嘗試載入新容器應用程式的頁面,但這不會預期會在這個階段運作。
現在您已發行一次,您已建立發行配置檔(.pubxml
檔案),因此您不需要在下一次發佈時重複這些步驟。 只要按下此畫面上的 [ 發佈] 按鈕,除非您要重新開始,或變更您指定的任何 Azure 資源。
稍後,您將使用 Azure 入口網站對 Ingress 進行一些進一步的設定變更,並支援 Azure Redis Cache,但首先,在下一節中,您會部署 Web 前端。
部署前端
修改 Index.cshtml.cs 中的前端程式代碼檔案,以參考 Web API 容器應用程式的新 URL。 這是 [Web API 發佈] 畫面中 [ 資源名稱 ] 底下顯示的名稱。 針對容器對容器通訊,您可以直接使用 HTTP 搭配容器應用程式的名稱,而不需指定完整功能變數名稱 (FQDN) 和埠號碼。 在
OnGet
方法中,將現有設定RequestUri
為 Web API 容器應用程式名稱的行替換,如下列代碼所示。request.RequestUri = new Uri("http://<mywebapi-container-app-name>/Counter");
在 [方案總管] 中,以滑鼠右鍵按兩下 Webfrontend 專案的項目節點,然後選取 [ 發佈]。 在下一個畫面上,選取 [ 新建 ] 以建立新的容器應用程式。
在 [ 建立新的 Azure 容器應用程式 ] 畫面上,選擇您發佈 Web API 專案時所建立的相同資源群組和相同的容器環境。
重要! 請選擇您先前建立的相同容器註冊表。
針對其他步驟,請選擇您針對 Web API 所做的相同選項。 容器組建類型為 Docker Desktop,部署類型為 Publish(generates pubxml 檔案)。
選取 [完成 ] 以完成發佈程序,然後建立發行配置檔。 您會看到一個顯示 Azure 中活動的頁面,當您關閉此頁面後,發佈畫面現在會顯示容器應用程式的資訊,例如 Webfrontend 應用程式的 URL。
在 Azure 入口網站中檢視及設定容器應用程式
- 登入 Azure 入口網站。
- 搜尋容器應用程式,並找出您剛才建立的應用程式。
- 選擇 [輸入 ] 並設定下列選項:
在 [輸入] 畫面上,將 [輸入流量] 設定為 [限制為容器應用程式環境]。 這表示只有 Webfrontend 可以傳送要求。 即使是 Visual Studio 也無法存取此服務,例如,當您完成發佈程式,而 Visual Studio 嘗試載入頁面時,您會在瀏覽器中收到錯誤,而不是存取服務。 這是預期的。
檢查輸入埠 (應該是8080)。 您使用 HTTP 進行 Web API 呼叫,而且您可以在要求 URI 中依名稱直接參考容器應用程式。 Azure 容器應用程式所產生的完整合格的網域名稱(FQDN)會使用 HTTPS URL(如 Visual Studio 上的發佈畫面所示),但內部流量可以繞過該 URL。
針對 Webfrontend 入口,您可採用預設值。 目標埠為 8080,因為輸入會使用 FQDN 和 HTTPS 安全地處理所有要求(或 HTTP 至 HTTPS 重新導向),並使用容器埠 8080 上的 HTTP 將它們轉送至 Webfrontend。
建立 Azure Redis 快取
請遵循下列步驟,在與容器應用程式相同的資源群組中建立 Azure Redis 快取。
在 Azure 入口網站中,開啟您先前建立的 Web API 容器應用程式。 開啟 [服務連接器] 畫面,然後選取 [ 建立]。 [ 建立連線] 區段隨即出現。
在 [ 建立連線 ] 畫面上,輸入 服務類型 作為 Cache for Redis,然後選擇 [ 新建 ] 以建立新的 Redis 快取。
選擇快取,或遵循建立 新 連結來建立快取。 如果您建立新的快取,您可能必須返回容器應用程式和服務連接器,然後重複上述步驟來建立連線。
針對資料庫,選擇 「0」 來建立此快取的第一個編號資料庫。
移至 [ 驗證] 索引標籤。選擇 [系統指派的受控識別]。 接受所有其他預設值,然後選取 [建立]。 這樣做會建立與快取的連接。
回到 Web API 容器應用程式的 [服務連接器 ] 區段中,重新整理以查看新連線的快取(如果您尚未看到快取),然後選取快取旁的複選框。 選取 [驗證 ] 以檢查連線的狀態。 您可以展開快取節點,以查看該 Azure 快取環境變數的值。 在本教學課程中,您只需要 AZURE_REDIS_HOST,但您可以在實際代碼中使用其他變數或更完整的配置。 使用這裡的值來設定 Dockerfile 中的環境變數,如下一節所述,讓 Web API 可以連線到快取。
如需詳細資訊,請參閱 快速入門:從 Azure 入口網站建立 Azure Container Apps 的服務連線。
設定管理身份的角色
在 Azure 入口網站中,您將使用 Azure Redis 快取上的 存取控制 (IAM) 來授予容器應用程式的系統指派受控識別協作者存取權。
- 在 Azure 入口網站中,開啟 Azure Redis 快取的頁面,然後選取 [訪問控制][IAM]。
- 選取 [新增]> [新增角色指派]。 會開啟 [新增角色指派] 頁面。
- 選取 [ 成員] 索引標籤,然後選擇 [受控識別]。
- 選取 [選取成員]。 [ 選取成員] 頁面隨即開啟,然後選取 [系統指派的受控識別]。
- 選取 [容器應用程式],然後選擇 [Web API 容器應用程式]。
- 在 角色 索引標籤中,選擇 Redis 快取參與者。
- 選擇檢閱並指派。 系統會處理要求。
- 開啟 角色指派 以查看 Redis 快取貢獻者角色 下系統指派的受控識別。
下一個步驟是修改 Web API 用戶端中的快取組態,以使用 DefaultAzureCredential
,這是當您使用系統指派的受控識別時,建議驗證的方法。 外部存取應用程式的人不需要有特定的用戶層級角色指派,即可透過這種形式的身分識別管理來存取資源。 如需詳細資訊,請參閱 整合 Azure Redis 快取 - 系統指派的受控識別。
修改 Web API 專案以參考 Azure Redis 快取服務
發佈 Web API 專案以在 Azure 中執行之前,請更新它以參考 Azure Redis 快取,並使用受控識別安全地存取它。 若要容納這種情況,您可以在 Program.cs 中修改快取組態程序代碼。
針對 Azure Redis 快取,您可以使用連線資訊設定環境變數 AZURE_REDIS_HOST
,然後在啟動程式代碼中讀取它以連線到 Azure Redis 快取,並設定快取。
您可以使用 Azure.Identity
來取得能夠透過受控識別處理安全驗證的 DefaultAzureCredential
。
在 Visual Studio 的 Web API 專案中,新增 NuGet 套件
Azure Identity
和Microsoft.Azure.StackExchange.Redis
的參考。為您剛添加的套件加入 using 指令。
using Azure.Identity; using Microsoft.Azure.StackExchange.Redis;
更新 Redis 快取的組態程式代碼。 刪除舊的程式代碼,並將它取代為下列程序代碼。 您可以稍後檢閱批注,並取消批註任何選擇性程序代碼,以符合您自己的更進階案例。
// Check the environment variable for the Redis cache host name var cacheHostName = Environment.GetEnvironmentVariable("AZURE_REDIS_HOST"); if (string.IsNullOrEmpty(cacheHostName)) { throw new InvalidOperationException("The environment variable 'AZURE_REDIS_HOST' is not set."); } var configurationOptions = ConfigurationOptions.Parse($"{cacheHostName}:6380"); // For system-assigned identity. // In the Azure portal, we need to set up Redis service to grant Contributor access to the system-assigned identity // for the container app that hosts this Web API service. await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential()); var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions); builder.Services.AddStackExchangeRedisCache(options => { options.ConfigurationOptions = configurationOptions; options.InstanceName = "SampleInstance"; }); // Uncomment the following line if you need to use the ConnectionMultiplexer directly // (for example, for advanced Redis operations like Pub/Sub or working with Redis data structures). // builder.Services.AddSingleton<IConnectionMultiplexer>(sp => // ConnectionMultiplexer.Connect(configurationOptions));
您稍早建立快取連線時所設定的驗證方法是系統指派的受控識別,因此這裡的程式代碼與該選擇一致。 如果您想要使用其他驗證方法,您必須在這裡對程式代碼進行變更。 請參閱 整合 Azure Redis 快取 - 系統指派的受控識別。
建置 Web API 專案以確認沒有任何錯誤。
如果您有 Dockerfile,請更新 Dockerfile 的基底階段,以定義環境變數
AZURE_REDIS_HOST
。 當您在入口網站中建立 Azure Redis 快取時,或從入口網站中 Web API 容器應用程式頁面的 [服務連接器 ] 區段取得主機(請參閱上一節)。ENV AZURE_REDIS_HOST mycache.redis.cache.windows.net
(選擇性)您可以在環境變數中定義其他組態選項,
AZURE_REDIS_PORT
例如,通常是 6380。 為了簡單起見,此值會硬式編碼,而不是使用環境變數。 您可能也想要設定ASPNETCORE_ENVIRONMENT
為 [開發]。如果您使用 .NET SDK 容器建置類型(不含 Dockerfile),您可以在 下方
profiles > http
中設定環境變數。"http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5107", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "AZURE_REDIS_HOST": "cache11.redis.cache.windows.net" } }
您已準備好發佈並驗證這些變更。 選取 [ 發佈] 畫面上的 [ 發佈] 按鈕。 Visual Studio 會嘗試載入頁面,但這會失敗,因為 Web API 容器應用程式無法存取容器應用程式環境外部的要求。
在您能夠執行與 Azure Redis Cache 相關的應用程式之前,您需要先設定具有正確權限的受控識別以存取快取。
測試應用程式
返回 Webfrontend 專案中的 [ 發佈 ] 畫面,然後按兩下 Webfrontend URL 上的連結。 您應該會看到 Webfrontend 應用程式出現,其中的計數器會在您重新整理頁面時更新。
小提示
Azure Container Apps 會尋求將服務運行時間最大化。 如果其中一項服務發生問題,因此它無法進行健康情況探查,Azure Container Apps 將不會將它設定為作用中的修訂,並使用它來提供服務要求。 因此,在開發和測試程序期間,您可能會偶爾發現您所做的最新變更不會反映在即時網站中。 在 Azure 入口網站中,選取 [ 修訂和複本 ] 以檢視最新發行修訂的狀態。 您可以從該處開啟記錄,以協助針對問題進行疑難解答。
祝賀! 您已成功將多容器應用程式發佈至 Azure Container Apps,並驗證容器之間的通訊,以及應用程式內 Azure Redis 快取的使用。
清理資源
若要清除您在本教學課程期間建立的資源,請移至 Azure 入口網站,並刪除包含容器應用程式、快取和容器登錄的資源群組。
後續步驟
- 深入瞭解 Azure Container Apps。
- 瞭解 .NET Aspire,此技術可協助您更輕鬆地開發與 Azure 中各種資源整合的複雜容器化應用程式和服務。 .NET Aspire 支援開發階段的編排、與多種服務的標準化整合,以及透過 Visual Studio 專案範本的工具支援。
- 您也可以使用 Azure 命令列介面 (CLI) 來處理容器應用程式。 安裝 Azure CLI ,並使用 Azure CLI 命令開始使用 Azure Container Apps,方法是遵循 使用 az containerapp up 命令部署 Azure Container Apps。