.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

到此,项目算是跑起来了。怎么部署后续再搞~


.net 使用Docker开发的更多相关文章

  1. Visual Studio Code和Docker开发asp.net core和mysql应用

    Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...

  2. Mac结合Docker开发

    Mac结合Docker开发 前几天在看Java并发实战时,在Mac上写了一个示例,结果运行后无法按照书本上运行.主要是有些命令,在Mac和Linux是有区别的,比如top, Mac上是不支持-Hp,意 ...

  3. Springboot整合MongoDB的Docker开发,其它应用也类似

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...

  4. docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用

    .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...

  5. vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用

    Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...

  6. vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介

    原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...

  7. vagrant特性——基于docker开发环境(docker和vagrant的结合)-3-boxes和配置

    Docker Boxes Docker provider不需要vagrant box.因此其config.vm.box设置是完全可选的.但是,仍然可以使用并指定一个box来提供默认值.由于一个带着bo ...

  8. 使用Docker开发NodeJs APP

    英文版原文地址 这是两篇连载文章的第一篇,讲解了如何使用 Docker 替代 Vagrant 开发基于 Express 框架的NodeJs App的部分细节.不过,这次要增加点难度:我们要使用 con ...

  9. .net core 在 Docker 开发下的巨坑

    一,Docker 的安装 Windows 安装  Docker 官方文档: https://docs.microsoft.com/zh-cn/virtualization/windowscontain ...

  10. 使用 Docker 开发 - 使用多阶段构建镜像

    多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...

随机推荐

  1. SqlServer Split 的实现

    数据库如何处理传参用指定字符隔开参数的情况 如"name1,name3,name5" 共2种方式, 1.数据库内置函数STRING_SPLIT(sql2016之前的版本不支持该函数 ...

  2. 阿里云pypi软件包预警

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 背景 Python库的官方仓库pypi允许开发者自由上传软件包,这会导致某些攻击者利用这点构造恶意包进行供应链攻击,在用户安装包或者引入包时触发恶意 ...

  3. Win10开启FTP与配置(完整无错版)

    #1.控制面板>程序>启用或关闭Windows功能>-(控制面板可在 桌面右键>个性化>主题>桌面图标设置>勾选控制面板>确定) #2.小娜搜索IIS打 ...

  4. 【SVN】Please execute the 'Cleanup' command.

    背景 项目有个新的bug,我需要提取一个新的分支,但是提取之后,更新分支出现了这个问题 Please execute the 'Cleanup' command. 原因 由于使用SVN更新文件出错,导 ...

  5. Zwibbler—前端Canvas绘图工具使用记录

    本人第一次发博客,用意在于记录自己在开发过程中用到的实用工具并分享出来,写的可能不好,请大家多多包涵!!! 工具官网:https://www.zwibbler.com 基于Canvas的一个前端绘画工 ...

  6. 保姆教程系列二、Nacos实现注册中心

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到  保姆教程系列一.Linux搭建Nacos 注册中心原理 一.环境准备 Java版本:1.8+   (Linux ce ...

  7. java 队列

    Java中的list和set有什么区别   list与set方法的区别有:list可以允许重复对象和插入多个null值,而set不允许:list容器是有序的,而set容器是无序的等等 Java中的集合 ...

  8. Struts2的功能扩展点有哪些?

    l Interceptor及其相关子类 l TypeConverter及其相关子类 l Validator及其相关子类 l Result及其相关子类 l ObjectFactory及其相关子类

  9. zookeeper 负载均衡和 nginx 负载均衡区别 ?

    zk 的负载均衡是可以调控,nginx 只是能调权重,其他需要可控的都需要自己写插件:但是 nginx 的吞吐量比 zk 大很多,应该说按业务选择用哪种方式.

  10. xml文件使用DOM解析,报异常org.xml.sax.SAXParseException,"characterEncoding" 的引用必须以 ';' 分隔符结尾异常

    这个异常一般为xml文件对&的报错,只需要将&改为转义后的&amp即可解决