.NET多年以前已經開始支援Docker,但由於國內.net現狀,生產過程中幾乎用不到docker支援,趁著有點時間搗鼓下~。
先期工作
1、首先安裝 Docker Desktop
2、安裝Visual Studio
建立專案
使用VS分別建立一個ASP.NET Core Api(WebApplication1)與 ASP.NET Core 應用(WebApplication2)
如果專案已經存在,可以選中專案,右鍵點選->選擇新增Docker支援。
在彈出對話方塊中選擇Linux。
專案支援docker後,會在專案下生成一個Dockerfile檔案(用來構建Docker映象的構建檔案)
內容如下:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. #使用“小型”僅執行時基礎映像開始一個階段,將其稱為“基礎”,以供參考 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base # 在映像中建立 /app 目錄 。 WORKDIR /app # 公開埠 80 。 EXPOSE 80 #使用“大型”映像開始用於生成/釋出的新階段。將其稱為“生成” ,以供參考。 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build #在映像中建立目錄 /src 。 WORKDIR /src #複製引用的 .csproj 專案檔案,以便之後能夠還原包 。 COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"] #還原專案和引用專案的包 。 RUN dotnet restore "WebApplication1/WebApplication1.csproj" COPY . . #將解決方案的所有目錄樹(.dockerignore 檔案中包含的檔案/目錄除外)複製到映像中的 /src/專案 目錄 。 WORKDIR "/src/WebApplication1" #生成專案(和其他專案依賴項)並輸出到映像中的 /app/build 目錄 。 RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build #開始一個從“生成”繼續的新階段。將它稱為“釋出” 以進行引用。 FROM build AS publish # 釋出專案(和依賴項)並輸出到映像中的 /app/publish 目錄 。 RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish # 開始一個從“基礎”繼續的新階段,並將其稱為“最終” FROM base AS final #將當前目錄更改為 /app WORKDIR /app #將 /app 目錄從階段“釋出”複製到當前目錄 COPY --from=publish /app/publish . #定義啟動容器時要執行的命令 ENTRYPOINT ["dotnet", "WebApplication1.dll"]
以上說明參考.net官方文件,機器翻譯不是很友好,但結合命令應該能看懂。
單容器執行
1、VS啟動docker除錯:
2、使用命令生成與啟動映象
(1)編譯映象
docker build -f .\WebApplication1\Dockerfile -t webapi . #此處注意Dockerfile檔案所在的目錄
(2)生成容器
ocker run --name webapi -d -p 8060:80 api --name 容器名 -d 後臺執行 -p 埠對映
此時訪問介面:localhost:8060
返回值:
[ { "date": "2022-03-17T09:25:15.9478769+08:00", "temperatureC": -2, "temperatureF": 29, "summary": "Freezing" }, { "date": "2022-03-18T09:25:15.9490679+08:00", "temperatureC": -7, "temperatureF": 20, "summary": "Bracing" }, { "date": "2022-03-19T09:25:15.9490738+08:00", "temperatureC": 15, "temperatureF": 58, "summary": "Warm" }, { "date": "2022-03-20T09:25:15.9490742+08:00", "temperatureC": 26, "temperatureF": 78, "summary": "Mild" }, { "date": "2022-03-21T09:25:15.9490743+08:00", "temperatureC": -15, "temperatureF": 6, "summary": "Chilly" } ]
容器執行
1、右鍵點選WebApplication1應用,選擇新增“容器業務流程協調程式支援”
選擇:“Linux”。
新增完成後,解決方案中會自動生成:docker-compose專案,
主要包含:docker-compose.yml檔案,.dockerignore檔案。
-
.dockerignore 檔案包含你不希望 Docker 在容器中包含的檔案型別和副檔名。這些檔案通常與開發環境和原始碼管理相關聯,並不屬於正在開發的應用或服務。
-
docker-compose.yml是docker-compose的配置檔案,docker-compose是docker提供的一個命令列工具,可以用於定義和執行多容器組成的應用。
docker-compose.yml中生成的內容:
version: '3.4' services: webapplication1: image: ${DOCKER_REGISTRY-}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile
同樣的操作為:WebApplication2新增“容器業務流程協調程式支援”
最終docker-compose.yml內容為:
version: '3.4' services: webapplication2: image: ${DOCKER_REGISTRY-}webapplication2 build: context: . dockerfile: WebApplication2/Dockerfile webapplication1: image: ${DOCKER_REGISTRY-}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile
2、修改WebApplication2的HomeController:
public async Task<IActionResult> Index() { ViewData["Message"] = "Hello from webfrontend"; using (var client = new System.Net.Http.HttpClient()) { var request = new System.Net.Http.HttpRequestMessage(); request.RequestUri = new Uri("http://WebApplication1/WeatherForecast"); var response = await client.SendAsync(request); ViewData["Message"] += " and " + await response.Content.ReadAsStringAsync(); } return View(); }
//因為 docker compose 在其自己的網路中設定主機名, //以便服務名作為主機名顯示給其他服務, //所以這裡使用的是主機名請求。 request.RequestUri = new Uri("http://WebApplication1/WeatherForecast");
3、解決方案的啟動專案設定為 docker-compose
4、管理Docker Compose啟動項
配置完成後會將配置儲存在docker-compose 專案中的launchSettings.json中:
{ "profiles": { "Docker Compose": { "commandName": "DockerCompose", "composeLaunchAction": "LaunchBrowser", "composeLaunchServiceName": "webapplication2", "composeLaunchUrl": "{Scheme}://localhost:{ServicePort}", "commandVersion": "1.0", "serviceActions": { "webapplication1": "StartWithoutDebugging", "webapplication2": "StartDebugging" } } } }
5、F5啟動專案
常見問題
首次啟動可能會出現錯誤:
“error CTC1023: Dockerfile“...\Dockerfile”的除錯程式路徑“C:\Users\Administrator\vsdbg\vs2017u5”無效。”
解決辦法:手動下載.zip包,如果瀏覽器下載太慢,可以考慮使用下載工具
https://vsdebugger.azureedge.net/vsdbg-17-0-10712-2/vsdbg-linux-x64.zip #其中17-0-10712-2(其中 17.0.10712.2 “.”替換成“-”) https://vsdebugger.azureedge.net/vsdbg-17-0-10712-2/vsdbg-linux-musl-x64.zip #其中17-0-10712-2(其中 17.0.10712.2 “.”替換成“-”) 如果其他版本的,可以參考該方式,拼接URL下載
以上兩個包下載完畢後,按照以下步驟操作
1、將vsdbg-linux-x64.zip 解壓到 %USERPROFILE%\vsdbg\vs2017u5 目錄 (vs2017) 2、%USERPROFILE%\vsdbg\vs2017u5 目錄,新增兩個檔案 success_rid.txt 內容填寫:linux-x64 success_version.txt 內容填寫:17.0.10712.2 3、將vsdbg-linux-musl-x64.zip 解壓到 %USERPROFILE%\\vsdbg\vs2017u5\linux-musl-x64 目錄 (vs2017,其他版本參考相似路徑) 4、%USERPROFILE%\vsdbg\vs2017u5\linux-musl-x64 目錄,新增兩個檔案 success_rid.txt 內容填寫:linux-musl-x64 success_version.txt 內容填寫:17.0.10712.2
到此,專案算是跑起來了。怎麼部署後續再搞~