.net 使用Docker開發

溫暖如太陽發表於2022-04-09

.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

到此,專案算是跑起來了。怎麼部署後續再搞~


 

相關文章