Asp.Net Core部署:早知道,还是docker!以及一点碎碎念

前言

AspNetCore技术栈在我们团队里的使用也有一段时间了,之前的部署方式一直是本地编译之后上传可执行文件到服务器,使用supervisor来管理进程这种很原始的方式。f26ffc31d10cfd42bb3cd0dcae68ef26.png

参考之前的文章:Asp.Net Core学习笔记:(五)构建和部署

对于小项目来说尚可,够用,但是存在几个问题:

  1. 每次更新花费的时间太长了aafd29101a571c62f87c38bd5779924c.png,无论是Framework-Dependent还是Self-Contained,都要上传很大的文件~

  2. 更新的时候需要在supervisor里把进程停掉,不然无法覆盖

  3. 每次更新都是手动操作,一点也不geek3a250df7a8c8d5d8e16541e034a647fc.png

鉴于之前使用Django的项目里docker用得非常愉快,而且到处在宣传.netcore新技术对docker的官方支持有多好多好,于是我这也不能落后,必须上docker部署啊!

更关键的一点理由是,最近搞了个新的小项目,用到了Redis,但服务器上没装Redis,作为一个被docker惯坏的人,我也不可能去安装配置这些东西29e46eb6aeedea344096d1fdc94ae603.png~

那就开始吧,直接从微软官方文档开始(MSDN真是好东西啊5ab3164d16e3f32748f38da83fe07925.png

开始

事实上,我现在已经开始尝鲜使用 .net6.0 来新建项目了,默认的项目模板中就带有docker配置,完全是傻瓜式的,不用自己写什么配置文件,上传到服务器里就是docker build一把梭(或者是docker-compose up更好)

没有的也没事,把VS升级到最新的2022版本~~(其他版本应该也有,请自测)~~,项目右键添加就能选择Docker支持了

e949f756a701056ec614799f5fbb7e0a.png

其实Rider也可以,并且我在此前也是一直使用Rider开发的,但截至本文编写时,Rider的2021.3版本还没推出,尚未支持 .net6.0 ,因此我没有使用Rider测试自动添加docker支持0969fe8a1489660906f61900c6a5b7e0.png

788425ca8a24251c9193885c7b943a8d.png

不想使用傻瓜式生成dockerfile也行,下面给出我部署的这个项目的dockerfile,可以参考一下。(项目名称为:DataMiddlePlatform

#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 443FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DataMiddlePlatform/DataMiddlePlatform.csproj", "DataMiddlePlatform/"]
RUN dotnet restore "DataMiddlePlatform/DataMiddlePlatform.csproj"
COPY . .
WORKDIR "/src/DataMiddlePlatform"
RUN dotnet build "DataMiddlePlatform.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "DataMiddlePlatform.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DataMiddlePlatform.dll"]

其实dockerfile基本可以不管的,因为 .net6.0 项目生成的时候,都会有个dockerfile,在本项目中我只修改了docker-compose.yml文件,因为要增加一个Redis容器~

以下是我的docker-compose.yml文件代码

version: '3.4'services:redis:image: redisexpose:- 6379web:image: ${DOCKER_REGISTRY-}webenvironment:- ASPNETCORE_ENVIRONMENT=Production- ASPNETCORE_URLS=https://+:443;http://+:80build:context: .dockerfile: DataMiddlePlatform/Dockerfiledepends_on:- redisports:- "15002:80"- "15003:443"

不多解释了,docker-compose的用法详见官方文档e74b035401212c5d5332761da17f851c.png

环境切换

之前我们在docker-compose.yml里添加了Redis容器,并在web镜像里添加了依赖,所以在Web容器里访问Redis是用redis:6379这样的地址,不像本地开发时一样使用localhost:6379,如果在Django里就要在settings.py里根据环境变量判断了(我的Django-Starter框架集成了自动识别)

而AspNetCore的基础设施做得很完善,默认就有developmentstagingproduction这三个环境,每个环境有对应的appsettings.json配置文件,所以只要在配置文件里区分不同的Redis地址就好了,如果是其他数据库的配置也同理,真是方便啊~!

到本项目中就是,在appsettings.Development.json文件里,Redis的连接地址是"Connection": "127.0.0.1:6379",本地开发时使用本地安装的Redis服务。

然后appsettings.json文件里,使用"Connection": "redis:6379",docker部署的时候,使用docker里的Redis服务~

完美4cd4036653f7775520b40158ef312ab7.png

部署

既然写完了dockerfiledocker-compose.yml,那部署这块也没啥好说的,就把整个代码文件夹上传到服务器,之后一行命令搞定:docker-compose up~

因为这AspNetCore本身性能就很可以了,小项目都不用nginx来提供静态文件服务,方便得很~!

要更新服务的话,目前就是上传代码之后执行docker-compose up --build重新构建,因为只需要上传代码文件,这样下来每次更新的速度快多了,而且可以写脚本在git commit后一键执行更新,也…算是自动了吧…hhh

小结

微服务是发展趋势,应用从旧的部署方式到容器化是很重要的一步,虽然我们团队的Java还处在一个jar包丢上去supervisor运行的阶段c2efdd61ccf000ce1dbcefb4377f98cf.png,(吐槽:后面甚至有项目都没有挂supervisor,直接shell里执行起来,什么时候挂了都不知道d9dea29578523d0d5f149f01622db1df.png

经过这段时间的实践下来,AspNetCore还是很可靠的扛住了不低的并发,也有比较完善的生态(虽然第三方库比不上Java和Python,但完完全全够好用了),开发效率高(但学习门槛也不低,至少比Django难0a41f87551f82aa45cf68ef75c71d349.png),综合优缺点下来,加上我自己对这框架的掌握也还很粗浅,所以只能小范围推广了~

我对于AspNetCore目前还处在摸索阶段,好用是好用,就是在工作中用得还不够多,不够熟悉,加上之前折腾Django的经历让我尝到了动态语言开发的甜头,所以不会短时间把团队的技术栈全部迁移到NetCore上去,毕竟会C#的人还是不够多,新招进来的应届生来现学也有不低的门槛8bbf6fab33146f8bc001ce3f9f33f4e3.png,项目进度也禁不起这种折腾…

我还是很喜欢微软的这套技术栈,它真的很好用,目前以及后续的小项目毫无疑问都会选择这套东西,但对于提高多少生产力,我目前是没多少底气的,接下来要调研一番构建自动化、部署自动化方面的技术,哎,小团队的基础设施不足真是痛苦…… 难怪现在Serverless开始流行起来了,低代码平台也起来了,程序员终究要自己砸自己的饭碗…793554f9f9e22d72779830e23e02607c.png

参考资料

  • 托管和部署 ASP.NET Core | Microsoft Docs

  • 在 Docker 容器中托管 ASP.NET Core | Microsoft Docs

  • .NET 微服务。适用于容器化 .NET 应用程序的体系结构 | Microsoft Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04-快速排序

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第4章 快速排序 4.1 分而治之 divide and conquer , 简称D&C:一种著名的递归式问题解决方法。 例子1: 假设你是农场主,有一小块土地。要求将这块地均匀地分…

android studio no marked region found along edge Found along top edge

由于种种原因,导致9图已经不是9图格式了,但是在Eclipse里面不会报错,在android studio 里面会报错 Error:9-patch image D:\download\avatar-android-master\avatar-android-master\sample\src\main\res\drawable-hdpi\abc_list_divider_holo…

lisp画靶子 visual_基于VisualLISP的AutoCAD绘图命令的二次开发_沈良翼

2009AutoCAD是由美国Autodesk公司于20世纪80年代初为微机上应用CAD技术而开发的绘图程序软件包,经过不断的完善,现已经成为国际上广为流行的绘图工具。AutoCAD允许用户定制菜单和工具栏,并能利用内嵌语言Autolisp、VisualLisp、VBA、ADS、ARX…

.Net相关

Lucene 全文搜索 http://lucenenet.apache.org/ Memcached 分布式缓存 http://memcached.org/ selenium UI自动化测试 http://docs.seleniumhq.org/ TestDriven.Net Unit Test http://www.testdriven.net/default.aspx MySql 数据库 http://dev.mysql.com/ dotPeek 反编译 http…

linux c之((void *) - 1)是啥意思

1、问题 今天看到进程通信通过使用内存共享来实现,看到了((void *)-1),当时一脸蒙逼,不知道什么意思。 2、理解 我一开始以为是空指针减1,自己好傻逼 实际意思是((void *)-1)是把-1转换成指针0xFFFFFFFF 3、总结 当一个函数返…

Linux下安装compsoer ,并使用composer安装laravel

为什么80%的码农都做不了架构师?>>> 1、composer安装 https://getcomposer.org/download/打开composer官网。根据提示linux下可以使用php安装。 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" php -r "if (ha…

AspNetCore在docker部署时遇到一个小坑

哦吼之前刚说了尝试了使用docker来部署AspNetCore应用(Asp.Net Core部署:早知道,还是docker!以及一点碎碎念),结果这才刚上班就遇到问题了 …我这项目用的数据库是Oracle,之前直接运行没啥问题,…

JS篇 学习笔记

ECMA Script API: Array.prototype.splice(start, deleteCount, value ...) 数组操作中有:push、pop、unshift左移入、shift左进出;splice不仅可以完成删除操作,而且还可以从中间插入:当deleteCount参数为0时就可以将后面的多个参…

05-散列表

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第5章 散列表 假设你在一家杂货店上班。有顾客来买东西时,你得到一个本子中查找价格。如果本子的内容不是按字母顺序来排序的,你可能为查找苹果价格而浏览每一页&#xff0c…

疯狂ios讲义疯狂连载之实现游戏逻辑(2)

13.6.5 定义获取通道的工具方法这里所谓的通道指的是一个方块上、下、左、右4个方向上的空白方块图13.10显示了一个方块四周的通道。图13.10 方块四周的通道下面是获取某个坐标点四周通道的4个方法。程序清单codes/13/Link/Link/sources/board/FKGameService.m13.6.6 没有转折点…

linux之进程间通信--使用信号

一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号…

opencv 平面法向量_在OpenCV中绘制平面的法向量

我使用2D条形码识别3D空间中的平面,我想绘制相对于其中心的法线。这是我用来计算正常的代码def compute_normal(camera, board, bounds, frame):extrinsics, ip, op get_extrinsics(camera, frame, board, bounds)extrinsic extrinsics[0]if not extrinsic: retur…

CentOS升级Python2.7及安装pip

CentOS升级Python2.7及安装pip<?xml version"1.0" encoding"UTF-8"?> CentOS升级Python2.7及安装pip1) 升级Python2.7?1234567891011121314151617181920212223242526272829303132python -V # 查看版本&#xff1a;Python 2.6.6mkdir -p ~/Env/py…

解决Maven工程中报 Missing artifact jdk.tools:jdk.tools

2019独角兽企业重金招聘Python工程师标准>>> 解决方法&#xff1a; 在pom.xml中添加如下依赖&#xff1a; <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>…

回到地球之后,这个男人创建了Ubuntu

文 | 大东出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;2002 年&#xff0c;莫斯科当地时间 4 月 25 日 9 时 26 分&#xff0c;满载着补给和 3 名宇航员的“联盟-TM 号”航天飞船在“联盟 U”火箭的推进下飞往国际空间站。同行的三人中&#xff0c;年…

Hadoop完全分子式环境搭建—问题及解决办法

Hadoop完全分布式环境搭建 ps:本人是按照尚硅谷的教程搭建的&#xff0c;版本hadoop2.7&#xff0c;centos版本6&#xff0c;一台主机&#xff0c;两台从机。 一&#xff0e;版本问题 1.尽量使用hadoop版本2&#xff0c;尽量不要使用最新版本3。因为会出现无法解决的问题&…

linux c之perror和exit使用总结

一、perror介绍 perror函数用一种简单统一的方式报告错误。例如,一个程序试读一个不存在的磁盘文件,操作系统除了“出错了!”,这时,库函数首先会将代表操作出错的具体原因的错误代码保存到全局整型变量errono(在errno.h中定义),然后它再将错误提示传给用户程序。perror…

autoload.php beanbun_Beanbun: 简单开放的 PHP 爬虫框架

BeanbunBeanbun 是用 PHP 编写的多进程网络爬虫框架&#xff0c;具有良好的开放性、高可扩展性。项目地址&#xff1a;github.com/kiddyuchin.…文档地址&#xff1a;beanbun.org由来我希望有这样一个爬虫框架&#xff1a;在简单需求的情况下&#xff0c;可以用最少的代码快速建…

Andorid Binder进程间通信---总结

一、Server和Service Manager进程间通信 Service Manager进程启动时&#xff0c;已经创建了Service Manager实体对象&#xff0c;没有Service Manager本地对象。 Server首先获取了Server代理对象&#xff0c;句柄值为0。没有Server引用对象。 Server----->Service Manager S…

POJ 2135 最小费用最大流

思路&#xff1a; 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 2010 #def…