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

2023-11-05 19:48

本文主要是介绍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

这篇关于Asp.Net Core部署:早知道,还是docker!以及一点碎碎念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352098

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架