.NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

.NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

在前两篇:

.NET Core部署到linux(CentOS)最全解决方案,常规篇

.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)

我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.net core应用。

Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关服务器,以支持ASP.NET、ASP.NET CORE、PHP为特色,同时具备反向代理、入侵检测等重要功能。可以这样说,Jexus是.NET、.NET CORE跨平台的最优秀的宿主服务器,如果我们认为它是Linux平台的IIS,这并不为过,因为,Jexus不但非常快,而且拥有IIS和其它Web服务器所不具备的高度的安全性。同时,Jexus Web Server 是完全由中国人自主开发的的国产软件,真正做到了“安全、可靠、可控”, 具备我国党政机关和重要企事业单位信息化建设所需要的关键品质。

jexus官网:https://www.jexus.org/

jexus的安装非常简单,执行如下命令:

  1. curl https://jexus.org/release/x64/install.sh|sudo sh

Jexus的安装

注:运行安装命令,需要操作者有root权限。

安装完成后,切换到/usr/jexus目录,修改/usr/jexus/siteconf目录下的default,内容如下所示:

注:因为在前面的章节用了nginx,使用了80端口,因此这儿我使用8099端口。

  1. port=8099 #端口
  2. hosts=* #域名
  3. AppHost={cmd=dotnet Core50Test.dll; root=/root/app_data/core50test/publish; port=5000}

Jexus的配置

接下来,我们重启jexus,执行如下命令:

  1. /usr/jexus/jws restart

重启jexus

提示Ok后,我们的应用就表示启动起来了。

可以通过执行如下命令,看下执行的结果:

  1. ps -aux

ps

可以看到我们的应用已经启动起来了,到浏览器使用8099端口浏览看下效果。

浏览应用

关于jexus更详细的使用说明,请参考官方文档。

Jexus包括如下操作命令(首先 cd /usr/jexus):
启动:sudo ./jws start
停止:sudo ./jws stop
重启:sudo ./jws restart

在前面的文章介绍中,不管是supervisor+nginx还是jexus,都需要在服务器安装 .NET Core的SDK或者运行时,假如咱们多个应用程序,各应用程序所用.net core版本不一样,上面的做法就需要咱们分别安装对应的SDK或者运行时,对于维护还是比较麻烦的。Docker的出现,可以完美解决上述问题。

Docker

  • docker是一个开源的软件部署解决方案;
  • docker也是轻量级的应用容器框架;
  • docker可以打包、发布、运行任何的应用。

Docker有如下优点:

1、快速,一致地交付您的应用程序

Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

  • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
  • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
  • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
  • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

2、响应式部署和扩展

Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。

Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

3、在同一硬件上运行更多工作负载

Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

执行如下命令:

  1. sudo yum install docker

PS:

遇报错 Another app is currentlty holding the yum lock ,waiting for it to exit..

解决方法: rm –r /var/run/yum.pid 这个命令 解锁即可

docker安装1

docker安装2

安装完成后,执行如下命令设置docker开机启动:

  1. systemctl enable docker

执行如下命令启动docker:

  1. systemctl start docker

查看docker启动状态:

查看docker启动状态

ps:安装过程有问题的话,可能直接运行如命令安装。

yum install docker-ce-cli

查看docker版本命令:

查看docker版本

安装docker之后,我们需要在代码里增加dockerfile文件。

通过Visual Studio可以帮我们自动生成,在解决方案中,右击项目名称,依次选择【添加】->【Docker支持】,如下图所示:

net core docker支持

生成的dockerfile文件如下所示:

  1. #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
  2.  
  3. FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
  4. WORKDIR /app
  5. EXPOSE 80
  6.  
  7. FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
  8. WORKDIR /src
  9. COPY ["Core50Test.csproj", ""]
  10. RUN dotnet restore "./Core50Test.csproj"
  11. COPY . .
  12. WORKDIR "/src/."
  13. RUN dotnet build "Core50Test.csproj" -c Release -o /app/build
  14.  
  15. FROM build AS publish
  16. RUN dotnet publish "Core50Test.csproj" -c Release -o /app/publish
  17.  
  18. FROM base AS final
  19. WORKDIR /app
  20. COPY --from=publish /app/publish .
  21. ENTRYPOINT ["dotnet", "Core50Test.dll"]

将代码推送到git仓库,然后再linux服务器中拉取最新代码。

切换到/root/app_data/source/core50test目录,执行如下命令,拉取最新代码:

  1. git pull

拉取代码

然后执行如下命令,将代码打包为镜像:

  1. docker build -f Dockerfile -t core50test .

首次打包镜像涉及到拉取.NET Core的官方镜像,拉取速度可能较慢,请耐心等待。

打包镜像

image-20210118173932286

打包完成后,执行如下命令,可查看当前服务器已存在的镜像:

  1. docker images

查看当前服务器已存在的镜像

镜像打包完成后,我们就可以执行docker run命令启用我们的应用了:

  1. docker run -p 81:80 -dit --restart=always --name core50test core50test

执行结果如下:

docker run命令启用我们的应用

通过浏览器访问:http://ip:81。如无意外,我们可以看到应用已经成功运行。

应用成功运行

docker run :创建一个新的容器并运行一个命令

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • —name=”nginx-lb”: 为容器指定一个名称;
  • —dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • —dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=”ritchie”: 设置环境变量;
  • —env-file=[]: 从指定文件读入环境变量;
  • —cpuset=”0-2” or —cpuset=”0,1,2”: 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • —net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • —link=[]: 添加链接到另一个容器;
  • —expose=[]: 开放一个端口或一组端口;
  • —volume , -v: 绑定一个卷

可以通过编写shell脚本,实现一键更新应用。在/root目录中,创建dockerbuild.sh文件,文件内容如下:

  1. # !/bin/bash
  2.  
  3. cd /root/app_data/source/core50test
  4. git pull
  5. imtag=$(uuidgen |sed 's/-//g')
  6. docker build -f Dockerfile -t core50test:${imtag} .
  7. docker stop core50test
  8. docker rm core50test
  9. docker run -dit --restart=always --name core50test -p 81:80 core50test:${imtag}

docker一键更新应用shell脚本

给dockerbuild.sh文件设置执行权限,命令如下:

  1. chmod 777 dockerbuild.sh

当有新代码推送到git仓库时,进入服务器,执行dockerbuild.sh即可快速更新应用程序。

./dockerbuild.sh

执行dockerbuild.sh快速更新应用程序

image-20210118175843088

至此,.net core使用docker方式部署介绍完成。

Docker常用命令,总的来说分为以下几种:

  • Docker环境信息 — docker [info|version]
  • 容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
  • 容器资源管理 — docker [volume|network]
  • 系统日志信息 — docker [events|history|logs]

从docker命令使用出发,梳理出如下命令结构图:

docker常用命令

要查看更详细的命令,可以查看官网或者命令帮助

  1. docker --help

通过前面三篇文章的介绍,我们已经对.net core多方案部署到linux下有了非常全面的认识,小型团队已经足够使用。留心的同学会注意到,虽然目前的方案可以实现一键部署更新,但是还是需要登陆到linux服务器去执行相应的命令。

显示,这不是最优的方案,那么还有没有更好的方案呢?比如:当我们提交给git仓库后,自动出发部署命令是不是就更方便了呢?

答案是肯定的,我们可以借助jenkins来实现。如有兴趣,可以自行研究,或者敬请期待后面的讲解。以及在大型项目中基于k8s实现的devops。其实k8s实现devops的原理以上面的介绍差不多,基于就是借助gitlab的runner或者jenkins,监听git仓库的状态,当发现指定的分支发生变化后,打包镜像,然后通过替换k8s的deployment的镜像来实现自动更新。同时,k8s实现了弹性伸缩、滚动更新等功能。

 

作者|国思软件

原文链接:https://www.cnblogs.com/88223100/p/The-most-comprehensive-solution-for-deploying-NET-Core-to-Linux-CentOS-Docker_Nginx__Jexus.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) - Python技术站

(0)
上一篇 2023年5月6日
下一篇 2023年5月6日

相关文章

  • Unity实现桌面反弹的示例代码

    下面是Unity实现桌面反弹的完整攻略及示例代码。 桌面反弹的实现过程 首先,我们需要创建一个3D球体作为桌球,并且给它添加物理组件,如刚体和碰撞体,以便后面更好地实现球的反弹。 接着,我们需要创建多个3D立方体作为障碍物,并给它们添加物理组件,如刚体和碰撞体。这种障碍物的数量和形状将会对球的运动轨迹产生影响。 在程序中,我们需要创建OnCollisionE…

    C# 2023年5月15日
    00
  • 基于C# winform实现图片上传功能的方法

    下面是“基于C# Winform实现图片上传功能的方法”的完整攻略: 一、准备工作 首先,我们需要将Winform应用程序的工具箱中添加一个OpenFileDialog控件,用于选择要上传的图片;还需要添加一个PictureBox控件,用于展示已经选择好的图片。 二、上传图片的流程 获得待上传的图片的本地路径 使用OpenFileDialog控件的ShowD…

    C# 2023年6月2日
    00
  • .NET6+Quartz实现定时任务的示例详解

    下面是针对“.NET6+Quartz实现定时任务的示例详解”的完整攻略: 1. 环境要求 在实现定时任务前需要安装以下环境: .NET 6 Quartz.NET 可以通过如下命令在 Visual Studio 中安装 Quartz.NET: Install-Package Quartz 2. 创建Console应用程序 首先,需要创建一个.NET类库项目(可…

    C# 2023年5月31日
    00
  • C#实现实体类和XML相互转换

    让我来为大家详细讲解C#实现实体类和XML相互转换的完整攻略。 1. 为什么要进行实体类和XML转换 在许多实际开发中,我们需要将对象或实体类转换成XML格式,或者将XML转换成相应的对象或实体类。常见的场景包括将数据存储到XML文件中,或者将XML文件序列化为对象,以便于进行数据传输、存储和处理等操作。 2. 实现实体类和XML相互转换的核心模块 C#中提…

    C# 2023年6月8日
    00
  • c#二叉树存储介绍

    下面是“c#二叉树存储介绍”的详细攻略。 1. 什么是二叉树 二叉树是一种非常常见的数据结构,它由若干个节点构成,每个节点最多只有两个子节点,由此得名。二叉树有很多种形态,比如完全二叉树、满二叉树、平衡二叉树等等。 2. 二叉树的存储方式 二叉树有两种常见的存储方式:链式存储和数组存储。链式存储是指用指针来表示二叉树中的节点之间的关系,它比较灵活,但是需要额…

    C# 2023年6月7日
    00
  • C#实现日历效果

    C#实现日历效果的攻略如下: 1. 了解日历的逻辑 在实现日历之前,我们需要了解日历的逻辑。日历的最小单位是日(day),每个月的天数不同,最长可达31天,最短只有28天,还有2月特殊,平年28天,闰年29天。 2. 设计数据结构和算法 在了解日历逻辑后,我们可以开始设计数据结构和算法了。常见的日历视图,可以使用一个二维数组表示,存储天数和日期信息。同时,我…

    C# 2023年6月6日
    00
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    实现只运行单个实例应用程序的方法,在C#中可以通过使用Mutex实现。Mutex是一种用于互斥访问共享资源的同步基元。在应用程序的运行过程中,只允许存在一个互斥体。如果进程试图创建同名的互斥体,则只能打开已存在的同名互斥体,而不是创建一个新的互斥体。 下面是实现只运行单个实例应用程序的方法的代码片段: using System.Threading; // 定…

    C# 2023年6月3日
    00
  • C#设计模式之观察者模式实例讲解

    C#设计模式之观察者模式实例讲解 概念介绍 观察者模式(Observer Pattern)是软件设计模式之一,它定义了对象之间的一种一对多的依赖关系,让多个观察者(Observers)对象同时监听某一个主题(Subject)对象。当这个主题对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新。 观察者模式中有两个重要的部分:Subject 主题和 …

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部