.Net項(xiàng)目在Docker容器中開發(fā)部署
.NET多年以前已經(jīng)開始支持Docker,但由于國(guó)內(nèi).net現(xiàn)狀,生產(chǎn)過程中幾乎用不到docker支持,趁著有點(diǎn)時(shí)間搗鼓下。
先期工作
1、首先安裝Docker Desktop
2、安裝Visual Studio
創(chuàng)建項(xiàng)目
使用VS分別創(chuàng)建一個(gè)ASP.NET Core Api(WebApplication1)與 ASP.NET Core 應(yīng)用(WebApplication2)
如果項(xiàng)目已經(jīng)存在,可以選中項(xiàng)目,右鍵點(diǎn)擊->選擇添加Docker支持。
在彈出對(duì)話框中選擇Linux。
項(xiàng)目支持docker后,會(huì)在項(xiàng)目下生成一個(gè)Dockerfile文件(用來構(gòu)建Docker鏡像的構(gòu)建文件)
內(nèi)容如下:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. #使用“小型”僅運(yùn)行時(shí)基礎(chǔ)映像開始一個(gè)階段,將其稱為“基礎(chǔ)”,以供參考 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base # 在映像中創(chuàng)建 /app 目錄 。 WORKDIR /app # 公開端口 80 。 EXPOSE 80 #使用“大型”映像開始用于生成/發(fā)布的新階段。將其稱為“生成” ,以供參考。 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build #在映像中創(chuàng)建目錄 /src 。 WORKDIR /src #復(fù)制引用的 .csproj 項(xiàng)目文件,以便之后能夠還原包 。 COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"] #還原項(xiàng)目和引用項(xiàng)目的包 。 RUN dotnet restore "WebApplication1/WebApplication1.csproj" COPY . . #將解決方案的所有目錄樹(.dockerignore 文件中包含的文件/目錄除外)復(fù)制到映像中的 /src/項(xiàng)目 目錄 。 WORKDIR "/src/WebApplication1" #生成項(xiàng)目(和其他項(xiàng)目依賴項(xiàng))并輸出到映像中的 /app/build 目錄 。 RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build #開始一個(gè)從“生成”繼續(xù)的新階段。將它稱為“發(fā)布” 以進(jìn)行引用。 FROM build AS publish # 發(fā)布項(xiàng)目(和依賴項(xiàng))并輸出到映像中的 /app/publish 目錄 。 RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish # 開始一個(gè)從“基礎(chǔ)”繼續(xù)的新階段,并將其稱為“最終” FROM base AS final #將當(dāng)前目錄更改為 /app WORKDIR /app #將 /app 目錄從階段“發(fā)布”復(fù)制到當(dāng)前目錄 COPY --from=publish /app/publish . #定義啟動(dòng)容器時(shí)要運(yùn)行的命令 ENTRYPOINT ["dotnet", "WebApplication1.dll"]
以上說明參考.net官方文檔,機(jī)器翻譯不是很友好,但結(jié)合命令應(yīng)該能看懂。
單容器運(yùn)行
1、VS啟動(dòng)docker調(diào)試:
2、使用命令生成與啟動(dòng)鏡像
(1)編譯鏡像
docker build -f .\WebApplication1\Dockerfile -t webapi . #此處注意Dockerfile文件所在的目錄
(2)生成容器
docker run --name webapi -d -p 8060:80 api --name 容器名 -d 后臺(tái)運(yùn)行 -p 端口映射
此時(shí)訪問接口: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" } ]
容器運(yùn)行
1、右鍵點(diǎn)擊WebApplication1應(yīng)用,選擇添加“容器業(yè)務(wù)流程協(xié)調(diào)程序支持”
選擇:“Linux”。
添加完成后,解決方案中會(huì)自動(dòng)生成:docker-compose項(xiàng)目,
主要包含:docker-compose.yml文件,.dockerignore文件。
.dockerignore 文件包含你不希望 Docker 在容器中包含的文件類型和擴(kuò)展名。這些文件通常與開發(fā)環(huán)境和源代碼管理相關(guān)聯(lián),并不屬于正在開發(fā)的應(yīng)用或服務(wù)。
docker-compose.yml是docker-compose的配置文件,docker-compose是docker提供的一個(gè)命令行工具,可以用于定義和運(yùn)行多容器組成的應(yīng)用。
docker-compose.yml中生成的內(nèi)容:
version: '3.4' services: webapplication1: image: ${DOCKER_REGISTRY-}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile
同樣的操作為:WebApplication2添加“容器業(yè)務(wù)流程協(xié)調(diào)程序支持”
最終docker-compose.yml內(nèi)容為:
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(); }
//因?yàn)?docker compose 在其自己的網(wǎng)絡(luò)中設(shè)置主機(jī)名, //以便服務(wù)名作為主機(jī)名顯示給其他服務(wù), //所以這里使用的是主機(jī)名請(qǐng)求。 request.RequestUri = new Uri("http://WebApplication1/WeatherForecast");
3、解決方案的啟動(dòng)項(xiàng)目設(shè)置為 docker-compose
4、管理Docker Compose啟動(dòng)項(xiàng)
配置完成后會(huì)將配置保存在docker-compose 項(xiàng)目中的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啟動(dòng)項(xiàng)目
常見問題
首次啟動(dòng)可能會(huì)出現(xiàn)錯(cuò)誤:
“error CTC1023: Dockerfile“...\Dockerfile”的調(diào)試程序路徑“C:\Users\Administrator\vsdbg\vs2017u5”無效?!?/pre>
解決辦法:手動(dòng)下載.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下載
以上兩個(gè)包下載完畢后,按照以下步驟操作
1、將vsdbg-linux-x64.zip 解壓到 %USERPROFILE%\vsdbg\vs2017u5 目錄 (vs2017) 2、%USERPROFILE%\vsdbg\vs2017u5 目錄,添加兩個(gè)文件 success_rid.txt 內(nèi)容填寫:linux-x64 success_version.txt 內(nèi)容填寫:17.0.10712.2 3、將vsdbg-linux-musl-x64.zip 解壓到 %USERPROFILE%\\vsdbg\vs2017u5\linux-musl-x64 目錄 (vs2017,其他版本參考相似路徑) 4、%USERPROFILE%\vsdbg\vs2017u5\linux-musl-x64 目錄,添加兩個(gè)文件 success_rid.txt 內(nèi)容填寫:linux-musl-x64 success_version.txt 內(nèi)容填寫:17.0.10712.2
到此,項(xiàng)目算是跑起來了。
到此這篇關(guān)于.Net項(xiàng)目在Docker容器中開發(fā)部署的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .NET 5 部署在docker上運(yùn)行的方法
- Linux系統(tǒng)Docker 部署 ASP.NET Core應(yīng)用的流程分析
- 部署.Net6項(xiàng)目到docker
- Docker部署Mysql,.Net6,Sqlserver等容器
- ASP.NET Core開發(fā)Docker部署
- .Net?Core部署Docker容器
- 使用Docker部署ASP.NET?Core程序
- .NET?6?從0到1使用Docker部署至Linux環(huán)境超詳細(xì)教程
- Linux系統(tǒng)docker部署.net?core3.1的詳細(xì)步驟
- .NET?8?部署到?Docker的詳細(xì)過程
- .Net8項(xiàng)目使用docker、docker-compose部署的圖文步驟
相關(guān)文章
在一個(gè)網(wǎng)站下再以虛擬目錄的方式掛多個(gè)網(wǎng)站的方法
在一個(gè)網(wǎng)站下再以虛擬目錄的方式掛N個(gè)網(wǎng)站的方法2010-04-04.Net Core中自定義認(rèn)證實(shí)現(xiàn)
本文主要介紹了.Net Core中自定義認(rèn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01asp.net core 騰訊驗(yàn)證碼的接入示例代碼
這篇文章主要介紹了asp.net core 騰訊驗(yàn)證碼的接入示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10ASP.NET?MVC開發(fā)接入微信公共平臺(tái)
這篇文章主要為大家介紹了微信平臺(tái)開發(fā)ASP.NET?MVC接入微信公共平臺(tái)實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04ASP.NET MVC SSO單點(diǎn)登錄設(shè)計(jì)與實(shí)現(xiàn)代碼
本篇文章主要介紹了ASP.NET MVC SSO單點(diǎn)登錄設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01LazyCaptcha自定義隨機(jī)驗(yàn)證碼和字體的示例詳解
LazyCaptcha是仿EasyCaptcha和SimpleCaptcha,基于.Net?Standard?2.1的圖形驗(yàn)證碼模塊,這篇文章主要介紹了LazyCaptcha自定義隨機(jī)驗(yàn)證碼和字體?,需要的朋友可以參考下2022-03-03