.net 使用Docker開發


.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

到此,項目算是跑起來了。怎么部署后續再搞~


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM