跳至頁尾內容
Iron Academy Logo
C#應用程式
C#應用程式

其他類別

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

[[academy-video-youtube({"vid": "-Cwr49DGtxE", "start_time": "0", "title": "Deploying to a Container and Docker Hub - Building a Sample API in C# Course", "creator": "Tim Corey", "length": "23m 51s"})]]

將.NET Core應用程式部署到Docker容器對現代開發者來說是至關重要的技能。 容器提供不可變的基礎架構、易於分發的特性和輕量級運行環境。 在這份深入指南中,我們將逐步介紹如何將範例API部署到Docker容器,然後將其推送到Docker Hub,按照Tim Corey的綜合影片教程《部署到容器和Docker Hub – 构建C#中的範例API》中的步驟進行。

讓我們逐步探討這個過程,並參考具體的時間戳以便跟隨。 本指南包括使用命令如.NET publish、docker run命令,以及基礎映像、運行時映像和容器映像等術語——這些都是使用Docker部署.NET應用程式的重要概念。

建立和理解範例API

在影片的開頭,Tim強調了在學習Web開發時一個範例應用程式的實用性。 該應用程式包括/courses和/health等端點,模擬真實世界中的問題如健康檢查退化,並設計為可以在本地機器和遠程伺服器上運行。

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

本地設置Docker

Tim使用Docker Desktop檢查Docker是否已安裝在他的本地機器上。他注意到即使本地沒有安裝Docker,也可以直接發布到Docker Hub,但為了演示,他從本地部署開始。

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

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

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

此基礎映像約328 MB,並充當我們容器映像的基礎。 微軟在他們的MCR(微軟容器註冊表)上託管這些影像,它們支持Linux容器和Windows容器。 對於這個項目,Linux是目標操作系統。

在本地發布到容器

Tim導航到API項目資料夾,並在命令行中運行以下命令:

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

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

這就是在背後發生的事情:

  • 使用項目文件(.csproj)構建API

  • 使用.NET restore命令恢復依賴性

  • 輸出進入一個發布文件夾

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

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

使用Docker運行影像

影像建立後,Tim使用Docker Desktop運行容器。 在內部,應用程式監聽8080端口。Tim通過在端口配置中輸入0將其映射到隨機主機端口。

容器啟動時名稱隨機生成(例如,elegant_hoover),瀏覽器打開顯示一個運行中的API,預設響應為"Hello World"。

通過浏覽/courses和/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

  • 最新(現在指向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的影片指南,我們已經:

  • 使用.NET new console構建了一個.NET Core API

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

  • 建立了一個不需要範例Dockerfile的Docker容器

  • 將容器影像上傳到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 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

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