部署到容器和Docker Hub - 在C#課程中構建一個示例API
將.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為中心,非常適合構建可擴展、可測試和可共享的應用程序。
