.NET多年以前已經開始支持Docker,但由於國內.net現狀,生產過程中幾乎用不到docker支持,趁著有點時間搗鼓下~。 先期工作 1、首先安裝 Docker Desktop 2、安裝Visual Studio 創建項目 使用VS分別創建一個ASP.NET Core Api(WebApplic ...
.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
到此,項目算是跑起來了。怎麼部署後續再搞~