.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镜像的构建文件)
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #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)编译镜像
1 2 | docker build -f .\WebApplication1\Dockerfile -t webapi . #此处注意Dockerfile文件所在的目录 |
(2)生成容器
1 2 3 4 5 | ocker run --name webapi -d -p 8060:80 api --name 容器名 -d 后台运行 -p 端口映射 |
此时访问接口:localhost:8060
返回值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [ { "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中生成的内容:
1 2 3 4 5 6 7 | version: '3.4' services: webapplication1: image: ${DOCKER_REGISTRY-}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile |
同样的操作为:WebApplication2添加“容器业务流程协调程序支持”
最终docker-compose.yml内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(); } |
1 2 3 4 | //因为 docker compose 在其自己的网络中设置主机名, //以便服务名作为主机名显示给其他服务, //所以这里使用的是主机名请求。 request.RequestUri = new Uri( "http://WebApplication1/WeatherForecast" ); |
3、解决方案的启动项目设置为 docker-compose
4、管理Docker Compose启动项
配置完成后会将配置保存在docker-compose 项目中的launchSettings.json中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { "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
到此,项目算是跑起来了。怎么部署后续再搞~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?