Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
.NET(Core)
正文
原创
2021-01-26
浏览 (
10298
)
.NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
在前两篇: [.NET Core部署到linux(CentOS)最全解决方案,常规篇](http://www.guosisoft.com/article/detail/244) [.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)](http://www.guosisoft.com/article/detail/245) 我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.net core应用。 ## 1、使用Jexus作为web服务器 > 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/](https://www.jexus.org/) ### 1.1、Jexus的安装 jexus的安装非常简单,执行如下命令: ```shell curl https://jexus.org/release/x64/install.sh|sudo sh ``` ![Jexus的安装](http://doc.rdiframework.net/rdiblog/20210119152015.png) > 注:运行安装命令,需要操作者有root权限。 ### 1.2、Jexus的配置与使用 安装完成后,切换到/usr/jexus目录,修改/usr/jexus/siteconf目录下的default,内容如下所示: 注:因为在前面的章节用了nginx,使用了80端口,因此这儿我使用8099端口。 ``` port=8099 #端口 hosts=* #域名 AppHost={cmd=dotnet Core50Test.dll; root=/root/app_data/core50test/publish; port=5000} ``` ![Jexus的配置](http://doc.rdiframework.net/rdiblog/20210119152029.png) 接下来,我们重启jexus,执行如下命令: ``` /usr/jexus/jws restart ``` ![重启jexus](http://doc.rdiframework.net/rdiblog/20210119152040.png) 提示Ok后,我们的应用就表示启动起来了。 可以通过执行如下命令,看下执行的结果: ``` ps -aux ``` ![ps](http://doc.rdiframework.net/rdiblog/20210119152052.png) 可以看到我们的应用已经启动起来了,到浏览器使用8099端口浏览看下效果。 ![浏览应用](http://doc.rdiframework.net/rdiblog/20210119152103.png) 关于jexus更详细的使用说明,请参考官方文档。 ### 1.3、Jexus的操作命令 > Jexus包括如下操作命令(首先 cd /usr/jexus): > 启动:sudo ./jws start > 停止:sudo ./jws stop > 重启:sudo ./jws restart ## 2、Docker+Nginx或Jexus部署 在前面的文章介绍中,不管是supervisor+nginx还是jexus,都需要在服务器安装 .NET Core的SDK或者运行时,假如咱们多个应用程序,各应用程序所用.net core版本不一样,上面的做法就需要咱们分别安装对应的SDK或者运行时,对于维护还是比较麻烦的。Docker的出现,可以完美解决上述问题。 ![Docker](http://doc.rdiframework.net/rdiblog/20210119152114.png) ### 2.1、[Docker](https://www.docker.com/)是什么? - docker是一个开源的软件部署解决方案; - docker也是轻量级的应用容器框架; - docker可以打包、发布、运行任何的应用。 **Docker有如下优点:** **1、快速,一致地交付您的应用程序** Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。 容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案: - 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。 - 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。 - 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。 - 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。 **2、响应式部署和扩展** Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。 Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。 **3、在同一硬件上运行更多工作负载** Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。 ### 2.2、docker安装 执行如下命令: ``` 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](http://doc.rdiframework.net/rdiblog/20210119152138.png) ![docker安装2](http://doc.rdiframework.net/rdiblog/20210119152142.png) 安装完成后,执行如下命令设置docker开机启动: ``` systemctl enable docker ``` 执行如下命令启动docker: ``` systemctl start docker ``` 查看docker启动状态: ![查看docker启动状态](http://doc.rdiframework.net/rdiblog/20210119152151.png) > ps:安装过程有问题的话,可能直接运行如命令安装。 > > yum install docker-ce-cli 查看docker版本命令: ![查看docker版本](http://doc.rdiframework.net/rdiblog/20210119152200.png) ### 2.3、.net core docker支持 安装docker之后,我们需要在代码里增加dockerfile文件。 通过Visual Studio可以帮我们自动生成,在解决方案中,右击项目名称,依次选择【添加】->【Docker支持】,如下图所示: ![net core docker支持](http://doc.rdiframework.net/rdiblog/20210119152212.png) 生成的dockerfile文件如下所示: ```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:5.0-buster-slim AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build WORKDIR /src COPY ["Core50Test.csproj", ""] RUN dotnet restore "./Core50Test.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "Core50Test.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Core50Test.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Core50Test.dll"] ``` 将代码推送到git仓库,然后再linux服务器中拉取最新代码。 切换到/root/app_data/source/core50test目录,执行如下命令,拉取最新代码: ``` git pull ``` ![拉取代码](http://doc.rdiframework.net/rdiblog/20210119152238.png) 然后执行如下命令,将代码打包为镜像: ``` docker build -f Dockerfile -t core50test . ``` 首次打包镜像涉及到拉取.NET Core的官方镜像,拉取速度可能较慢,请耐心等待。 ![打包镜像](http://doc.rdiframework.net/rdiblog/20210119152254.png) ![image-20210118173932286](http://doc.rdiframework.net/rdiblog/20210119152302.png) 打包完成后,执行如下命令,可查看当前服务器已存在的镜像: ``` docker images ``` ![查看当前服务器已存在的镜像](http://doc.rdiframework.net/rdiblog/20210119152314.png) 镜像打包完成后,我们就可以执行docker run命令启用我们的应用了: ``` docker run -p 81:80 -dit --restart=always --name core50test core50test ``` 执行结果如下: ![docker run命令启用我们的应用](http://doc.rdiframework.net/rdiblog/20210119152325.png) 通过浏览器访问:[http://ip:81](http://ip:81/)。如无意外,我们可以看到应用已经成功运行。 ![应用成功运行](http://doc.rdiframework.net/rdiblog/20210119152342.png) **docker run :**创建一个新的容器并运行一个命令 ### 语法 ``` 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:** 绑定一个卷 ### 2.4、通过shell脚本实现docker一键更新应用 可以通过编写shell脚本,实现一键更新应用。在/root目录中,创建dockerbuild.sh文件,文件内容如下: ```shell # !/bin/bash cd /root/app_data/source/core50test git pull imtag=$(uuidgen |sed 's/-//g') docker build -f Dockerfile -t core50test:${imtag} . docker stop core50test docker rm core50test docker run -dit --restart=always --name core50test -p 81:80 core50test:${imtag} ``` ![docker一键更新应用shell脚本](http://doc.rdiframework.net/rdiblog/20210119152350.png) 给dockerbuild.sh文件设置执行权限,命令如下: ```shell chmod 777 dockerbuild.sh ``` 当有新代码推送到git仓库时,进入服务器,执行dockerbuild.sh即可快速更新应用程序。 `./dockerbuild.sh` ![执行dockerbuild.sh快速更新应用程序](http://doc.rdiframework.net/rdiblog/20210119152412.png) ![image-20210118175843088](http://doc.rdiframework.net/rdiblog/20210119152420.png) 至此,.net core使用docker方式部署介绍完成。 ### 2.5、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常用命令](http://doc.rdiframework.net/rdiblog/20210119152432.png) 要查看更详细的命令,可以查看官网或者命令帮助 ``` docker --help ``` ## 3、总结 通过前面三篇文章的介绍,我们已经对.net core多方案部署到linux下有了非常全面的认识,小型团队已经足够使用。留心的同学会注意到,虽然目前的方案可以实现一键部署更新,但是还是需要登陆到linux服务器去执行相应的命令。 显示,这不是最优的方案,那么还有没有更好的方案呢?比如:当我们提交给git仓库后,自动出发部署命令是不是就更方便了呢? 答案是肯定的,我们可以借助jenkins来实现。如有兴趣,可以自行研究,或者敬请期待后面的讲解。以及在大型项目中基于k8s实现的devops。其实k8s实现devops的原理以上面的介绍差不多,基于就是借助gitlab的runner或者jenkins,监听git仓库的状态,当发现指定的分支发生变化后,打包镜像,然后通过替换k8s的deployment的镜像来实现自动更新。同时,k8s实现了弹性伸缩、滚动更新等功能。 ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 RDIFramework.NET官方网站:[http://www.rdiframework.net/](http://www.rdiframework.net/) [http://www.guosisoft.com/](http://www.guosisoft.com/) 特别说明,框架相关的技术文章请以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.NET框架官方微信公众号(微信号:**guosisoft**),及时了解最新动态。 使用微信扫描二维码立即关注 ![微信号:**guosisoft**](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NetCore
挨踢业界
RDIF.NET
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)
下一篇
.NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)
Mustache模板技术
微信公众号开发系列-玩转微信开发-目录汇总
SQLServer低版本附加高版本的数据库常用处理方法
史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式
ORACLE常见问题一千问[701至800](不怕学不成、就怕心不诚!)
RDIFramework.NET V3.3 WinForm版新增日程管理功能模块
微信公众号开发C#系列-5、用户和用户组管理-支持同步
MySQL 使用规范
RDIFramework.NET V3.2-> “Tab”标签新增可“最大化”显示功能
书写高质量JavaScript代码的要义(The Essentials of Writing High Quality JavaScript)翻译
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.7 版本发布
史上最全面的SignalR系列教程-1、认识SignalR
盘点WordPress站点维护与加速必备插件及技巧
RDIFramework.NETV2.9版本 Web新增至14套皮肤风格+三套界面组合(共42套皮肤组合)
[特别公告]RDIFramework.NET微信公众号迁移通知
C#实现Hash应用全解
什么是LESSCSS
SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
.NET分离exe和dll在不同的目录让你的程序更整洁
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127