乘风破浪,遇见最佳跨平台跨终端框架.net core/.net生态_再谈.net core添加docker支持_taylorshi-编程思维

背景

很多话题都值得过一段时间再拿出来说说,因为整个.Net生态和社区都在飞速前进,也许你以前知道的,放到如今已经不适用了,需要与时俱进。

这篇重温下给.Net Core项目添加Docker支持并部署运行。

背景:

  • Visual Studio 2022已经成为主流了。
  • .Net 6 LTS已经成为主流了。
  • Docker && K8S已经成为主流了。

什么是Docker

Docker是一种开源项目,用于将应用程序自动部署为可在云或本地运行的便携式独立容器。Docker也是一家公司,它与云、Linux和Windows供应商(包括Microsoft)协作,致力于推广和发展这项技术。

Docker在混合云的所有层部署容器

开发人员可以在Windows、Linux或macOS上使用开发环境。在开发计算机上,开发人员运行部署了Docker映像(包括应用及其依赖项)的Docker主机。在Linux或Mac上进行开发的开发人员使用基于Linux的Docker主机,并且他们可以仅为Linux容器创建映像。在Windows上进行开发的开发人员可以为Linux或Windows容器创建映像。

为了在开发环境中承载容器,并提供其他开发人员工具,Docker为Windows或macOS提供了Docker Desktop。这些产品安装了承载容器所需的VM(Docker主机)。

比较传统虚拟机与Docker容器

对于VM,主机服务器中有三个基本层。从下到上依次为:基础结构、主机操作系统和虚拟机监控程序。毕竟,每个VM都有自己的操作系统和所有必需的库。另一方面,对于Docker,主机服务器仅具有基础结构和操作系统。在此基础上,容器引擎会使容器保持隔离,但允许它们共享单个基本操作系统的服务

由于容器所需的资源要少得多(例如,它们不需要一个完整的OS),所以它们易于部署且可快速启动。这使你能够具有更高的密度,也就是说,这允许你在同一硬件单元上运行更多服务,从而降低了成本。

在同一内核上运行的副作用是,你获得的隔离比VM要少

映像的主要目标是确保在不同部署的同一环境(依赖项)。也就是说,可以在计算机上调试它,然后将其部署到保证具有相同环境的另一台计算机上。

借助容器映像,可打包应用或服务并采用可靠且可重现的方式对其进行部署。可以说Docker不只是一种技术,还是一种原理和过程

在使用Docker时,你不会听到开发人员说:“为什么它能在我的计算机上使用却不能用在生产中?”他们只需说“它在Docker上运行”,因为打包的Docker应用程序可在任何支持的Docker环境上执行,而且它在所有部署目标(例如开发、QA、暂存和生产)上都按预期运行

基础实战

创建解决方案和项目

通过Visual Studio 2022创建新项目,选择C#语言-Windows平台-WebAPI类型,找到ASP.NET Core Web API项目模板。

创建名为HelloNetCoreApi的解决方案和项目。

其他信息版块,框架选.Net 6.0(长期支持) 、勾选配置HTTPS、勾选启用Docker,选择Docker OS为Linux,默认勾选使用控制器、勾选启用OpenAPI,然后点击创建即可。

创建成功。

创建Docker镜像

创建项目的时候,我们勾选了启用Docker,所以项目根目录下会多出一个Dockerfile的文件(无后缀格式),其内容是:

#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
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["HelloNetCoreApi/HelloNetCoreApi.csproj", "HelloNetCoreApi/"]
RUN dotnet restore "HelloNetCoreApi/HelloNetCoreApi.csproj"
COPY . .
WORKDIR "/src/HelloNetCoreApi"
RUN dotnet build "HelloNetCoreApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HelloNetCoreApi.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "HelloNetCoreApi.dll"]

我们通过Windows Terminal切换到解决方案的目录,输入如下命令来生成镜像:

docker build -t hellonetcoreapi:1.0.0 -f .\HelloNetCoreApi\Dockerfile .

注意,这里-t--tag后面跟这个镜像的名字,一般需要全小写英文 + : + 标记值,这里虽然可以省去Tag值,但是建议养成好奇怪,不要省;这里-f--file后面跟Dockerfile这个文件的相对路径,最后一个.指代当前目录。

不出意外,这个镜像就构建成功了,我们可以通过命令来查看。

docker images

运行Docker镜像

有了上面的Docker镜像之后,我们可以来运行它。

docker run --name=sunnycontainer -p 5000:80 -d hellonetcoreapi:1.0.0

上诉命令是指,--name用来指定创建后的容器名称;-p--port是容器外部和内部映射端口,一般是外部端口在前,中间用:相隔,紧接内部端口在后;-d代表后台运行容器,并返回容器ID;

-d后台运行的好处就是,断开之后,它还会持续运行,但是不会重启自动运行。

docker run --name=snowcontainer -p 5010:80 -it hellonetcoreapi:1.0.0 /bin/bash

上诉命令是指,--name用来指定创建后的容器名称;-p--port是容器外部和内部映射端口,一般是外部端口在前,中间用:相隔,紧接内部端口在后;-i代表以交互模式运行容器、-t代表为容器重新分配一个伪输入终端,这两者一般一起使用。

-it前台运行的好处就是,运行后直接在当前上下文输出。但是退出后容器也会跟着关闭,适用于临时需求。

从Docker for Windows客户端中也可以看到这两个容器实例。

通过命令可以查询已运行的容器实例:

docker ps -a

通过命令可以查看容器实例IP信息:

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' snowcontainer

通过命令可以查看容器实例的输出:

docker logs snowcontainer

通过命令可以进入到容器实例内部:

docker exec -it snowcontainer /bin/bash

访问容器中服务

sunnycontainer容器为例,在创建容器实例的时候,我们将外部端口5000映射给了它内部的80端口,那么我们就可以通过:

来访问。

实际结果可能会令你震惊,别慌。这只是因为路径不对。对于默认项目模板来说,预设的Api路径是/WeatherForecast

你可能发现了,命名代码中有Swagger的影子,为什么无法访问。

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

从代码可以看出,是因为没有定义环境变量,环境变量我们可以通过Docker创建命令进行设置:

docker run --name=sunnycontainer -p 5000:80 -d -e ASPNETCORE_ENVIRONMENT=Development hellonetcoreapi:1.0.0

这时候就可以顺利访问Swagger

参考

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/taylorshi/p/16619476.html

乘风破浪,遇见最佳跨平台跨终端框架.net core/.net生态_伴随.net6/7与时俱进的.net cli命令行接口_taylorshi-编程思维

前言 .NET命令行接口(CLI)工具是用于开发、生成、运行和发布.NET应用程序的跨平台工具链。 虽然之前已经写过温故知新,DotNet Core SDK和.Net CLI十八般武艺 ,但是随着.Net迈入6,甚至预览7,开始8,有些内容已经开始不适用了,有些命令也随着发生变动,加上Ubuntu和微软正式合作,

乘风破浪,遇见最佳跨平台跨终端框架.net core/.net生态_.net core基础实战之.net core、.net standard、.net 5+_taylorshi-编程思维

什么是.Net Core .NET是一个免费的跨平台开放源代码开发人员平台,用于生成多种类型的应用程序。.NET基于许多大规模应用在生产中使用的高性能运行时构建而来。 .NET Core是由微软维护的最新通用开发平台。它可以在不同的平台上工作,并以一种使.NET快速、灵活和现代的方式进行了重新设计。这恰好是微软的

如何通过c#/vb.net设置word文档段落缩进_carina-baby-编程思维

缩进是指调整文本与页面边界之间的距离。在水平标尺,有四个段落缩进滑块:首行缩进、悬挂缩进、左缩进以及右缩进。在对于word文档的录入时,常常需要注意录入的格式,通过合理地设置段落格式,可以让文稿看起来更加美观,也可以加快录入的速度。在本文中,将详细为您介绍如何通过C#/VB.NET设置Word文档段落缩进。下面是我整理

最短路径算法-迪杰斯特拉(dijkstra)算法在c#中的实现和生产应用_bruceneter-编程思维

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy Algorithm) 贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个

乘风破浪,遇见最佳跨平台跨终端框架.net core/.net生态_伴随.net6/7与时俱进的.net cli命令行接口_taylorshi-编程思维

前言 .NET命令行接口(CLI)工具是用于开发、生成、运行和发布.NET应用程序的跨平台工具链。 虽然之前已经写过温故知新,DotNet Core SDK和.Net CLI十八般武艺 ,但是随着.Net迈入6,甚至预览7,开始8,有些内容已经开始不适用了,有些命令也随着发生变动,加上Ubuntu和微软正式合作,

乘风破浪,遇见最佳跨平台跨终端框架.net core/.net生态_.net core基础实战之.net core、.net standard、.net 5+_taylorshi-编程思维

什么是.Net Core .NET是一个免费的跨平台开放源代码开发人员平台,用于生成多种类型的应用程序。.NET基于许多大规模应用在生产中使用的高性能运行时构建而来。 .NET Core是由微软维护的最新通用开发平台。它可以在不同的平台上工作,并以一种使.NET快速、灵活和现代的方式进行了重新设计。这恰好是微软的

signalr+fluentvalidation实现mvc_hofmann-编程思维

SignalR 简介 - 简书 (jianshu.com) SignalR提供了实时通讯的功能,可以在Asp.Net项目中使用网页实现实时通讯,比如聊天室、在线游戏等等。在服务端通过编写SignalR Hub,可以调用页面上的javascript函数,同样,通过hubconnection,客户端可以使用javascr