跳過到頁腳內容
Iron Academy Logo
C# 應用程式
C# 應用程式

其他分類

部署到容器和Docker Hub - 在C#課程中構建一個示例API

Tim Corey
23m 51s

將.NET Core應用程式部署到Docker容器中是現代開發者的一項關鍵技能。 容器提供不可變的基礎設施、易於分發和輕量化的執行環境。 在這個深入的指南中,我們將演示如何將一個示例API部署到Docker容器,然後將其推送到Docker Hub,參考Tim Corey的綜合視頻教程:"Deploying to a Container and Docker Hub – Building a Sample API in C#。"

讓我們逐步探索過程,參考特定時間戳以便輕鬆跟隨。 此指南包含使用像dotnet publish,docker run命令和base image,runtime image及container image等術語的用法——這些都是使用Docker部署.NET應用程式的重要概念。

建立和了解示例API

在視頻的開頭,Tim強調了學習網頁開發時,示例應用程序的有用性。 該應用程序包括像/course和/health這樣的端點,模擬真實世界的問題,如健康檢查下降,並設計為可以在本地機器和遠程伺服器上運行。

這是一個.NET Core應用程式(更精確地說是一個ASP.NET Core簡約API),可以輕鬆通過Docker容器進行運行和測試。

在本地設置Docker

Tim檢查在其本地機器上安裝了Docker,使用Docker Desktop。他指出可以在本地未安裝Docker的情況下直接發布到Docker Hub,但為了演示,他從本地部署開始。

他展示了兩個預先安裝的Docker映像:

  • 一個用於字幕的個人工具

  • Microsoft的官方ASP.NET Core基礎映像:mcr.microsoft.com/dotnet/aspnet

這個基礎鏡像大約328 MB,是我們容器映像的基礎。 Microsoft在其MCR(Microsoft Container Registry)上託管這些映像,並支持Linux和Windows容器。 對於這個項目,Linux是目標作業系統。

在本地的容器中發布

Tim導航到API專案文件夾,並在命令行中運行以下命令:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

此命令使用.NET 8和.NET 9中的內置容器支持,消除了對Dockerfile的需求。發布過程選擇合適的運行時映像並構建一個自包含的容器映像。

這是幕后發生的事情:

  • 使用專案文件(.csproj)構建API

  • 使用dotnet restore命令還原依賴項

  • 輸出進入發布文件夾

  • 生成一個DLL文件並嵌入到容器中

生成的映像約為333 MB(比基礎大了5 MB)。

使用Docker運行映像

映像創建完成後,Tim使用Docker Desktop運行容器。 在內部,應用程序在8080端口上監聽。Tim通過在端口配置中輸入0來映射到隨機主機端口。

容器以隨機名稱啟動(例如,elegant_hoover),瀏覽器打開顯示一個工作中的API,以"Hello World"作為默認響應。

通過瀏覽到/course和/health,Tim確認API在運行。 健康檢查端點對於模擬生產環境場景很有用。

要查看運行中的容器,您可以在CLI中使用docker ps命令。 Tim之後刪除正在運行的容器和映像以示範清理。

創建Docker Hub存儲庫

接下來,Tim轉向雲端部署部分。 他登錄到其Docker Hub帳戶並創建一個名為thesampleapi的公共存儲庫。

這是Docker映像將被推送的地方,以便其他人可以使用:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

為Docker Hub配置專案

在API的專案文件中,Tim添加元數據以定義發布Docker映像的地點和方式。 他添加了以下代碼塊:

<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
  • ContainerRegistry:指定Docker Hub作為目標註冊。

  • ContainerRepository:Docker Hub存儲庫的路徑。

  • ContainerImageTags:標記映像以進行版本控制和最新發布。

這為未來的多階段構建流準備了映像,不過Tim現在保持簡單。

發布到Docker Hub

Tim再次運行相同的發布命令:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

起初推送失敗,因為他忘記保存.csproj文件。保存後重新運行命令,映像成功上傳到Docker Hub。

在Docker Hub中,thesampleapi存儲庫下同時出現了最新和1.0.0標籤。 這些標籤在拉取特定版本時提供了靈活性。

從Docker Hub拉取映像

Tim演示了如何從任何安裝了Docker的機器上拉取映像:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

多虧Docker層緩存,由於大部分內容已經從基礎映像中存在,所以映像下載很快。

為了運行映像:

docker run -p 0:8080 timcorey/thesampleapi:latest
docker run -p 0:8080 timcorey/thesampleapi:latest

這將隨機主機端口映射到內部端口8080。

創建映像的新版本

為了展示版本控制,Tim編輯.csproj文件以:

<ContainerImageTags>1.0.1;latest</ContainerImageTags>
<ContainerImageTags>1.0.1;latest</ContainerImageTags>

然後重新運行發布命令:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

現在Docker Hub存儲庫顯示三個標籤:

  • 1.0.0

  • 1.0.1

  • latest(現在指向1.0.1)

Tim解釋說,儘管有多個標籤,但Docker並不儲存重複的層,通過不同的層優化磁盤使用。

將Docker映像用於本地開發

Tim強調一旦映像在Docker Hub上,您可以隨時在任何機器上運行,方法是使用:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

然後使用docker run命令啟動它。完成後,清理使用:

docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image
docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image

他解釋這使得它非常適合按需開發和測試而不會使本地機器膨脹。

接下來是什麼?

Tim結束時提到下一步:將同樣的API部署到虛擬專用伺服器(VPS)。 他將演示域名映射和配置容器以公開訪問。

結論:從本地構建到雲端部署

使用Tim Corey的視頻指南,我們已經:

  • 使用dotnet new console構建.NET Core API

  • 使用dotnet restore和dotnet publish進行構建和部署

  • 創建Docker容器而不需要樣本Dockerfile

  • 將容器映像上傳到Docker Hub

  • 使用docker run拉取並運行容器

  • 管理標籤和不同的映像層

  • 準備使用版本化映像為生產環境做準備

這個工作流程,以Docker和.NET為中心,非常適合構建可擴展、可測試和可共享的應用程序。

Hero Worlddot related to 部署到容器和Docker Hub - 在C#課程中構建一個示例API
Hero Affiliate related to 部署到容器和Docker Hub - 在C#課程中構建一個示例API

通過分享您所愛的東西賺得更多

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

鋼鐵支援團隊

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