Linux中以单容器部署Nginx+ASP.NET Core


  正如

前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。


Nginx->ASP.NET Coe部署架构容器化

  在Docker中部署Nginx--->ASP.NETCore 有两种选择, 第一种是在单容器内部署Nginx+ASP.NET Core, 这是本文着重要讲述的,另外一种是以独立容器分别部署Nginx和ASP.NET Core,容器之间通过Docker内建的network bridge完成通信(请关注后续博文)。

640?wx_fmt=gif 本次实践将会使用.NET Core CLI 创建默认的web应用


mkdir app

cd app

dotnet new web

dotnet restore

dotnet build

  之后将项目发布到指定目录(dotnet publish), 发布产生的文件将会用于镜像打包。

 

640?wx_fmt=gif 构建镜像

  本次将以 ASP.NETCore Runtime Image【mcr.microsoft.com/dotnet/core/aspnet:2.2】 作为基础镜像, 该镜像包含.NET Core Runtime、ASP.NET Core框架组件、依赖项, 该镜像为生产部署做了一些优化。

坑1:本次部署的是web app,不要使用【mcr.microsoft.com/dotnet/core/runtime:2.2】作为基础镜像,启动容器会报错:

It was not possible to find any compatible framework version

The specified framework 'Microsoft.AspNetCore.App', version '2.2.0' was not found.

- Check application dependencies and target a framework version installed at:

- Installing .NET Core prerequisites might help resolve this problem:

https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

- The .NET Core framework and SDK can be installed from:

https://aka.ms/dotnet-download

因为该基础镜像不包含ASP.NET Core框架组件。

  本次Dokefile的定义将会包含nginx,在容器内启用Nginx标准配置代理请求到Kestrel:


FROM mcr.microsoft.com/dotnet/core/aspnet:2.2

RUN apt-get update

RUN apt-get install -y nginx

WORKDIR /app

COPY bin/Debug/netcoreapp2.2/publish .

COPY ./startup.sh .

RUN chmod 755 /app/startup.sh

RUN rm /etc/nginx/nginx.conf

COPY nginx.conf /etc/nginx

ENV ASPNETCORE_URLS http://+:5000

EXPOSE 5000 80

CMD ["sh""/app/startup.sh"]

  Line 1        指定基础镜像

  Line 3-4     从Debian package management store安装Nginx

  Line 6-7     设置工作目录,放置ASP.NET Core WebApp部署包

  Line 9-10   设置启动脚本

  Line 12-13 设置nginx配置文件

  Line 15-16 设置ASP.NETCore Kestrel在5000端口上监听, 暴露5000,80 端口给容器外部

  Line 18 稍后给出启动脚本

tip: 需要理解容器内是一个独立的linux环境,Dockfile中EXPOSE用于指示容器打算暴露的端口。 

        这里可只暴露80端口给外部,但是必须给ASPNETCORE_URLS定义一个非80端口,作为容器内kestrel监听端口。

    最终(tree -L 1)输出的app目录结构如下


.

├── app.csproj

├── appsettings.Development.json

├── appsettings.json

├── bin

├── Dockerfile

├── nginx.conf

├── obj

├── Program.cs

├── Properties

├── Startup.cs

└── startup.sh

640?wx_fmt=gif Nginx配置

  创建以上Dockerfile中需要的nginx配置文件,在同一目录,vim nginx.conf 创建文件:


worker_processes 4;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream app_servers {

        server 127.0.0.1:5000;

    }

    server {

        listen 80;

        location / {

            proxy_pass         http://app_servers;

            proxy_redirect     off;

            proxy_set_header   Host $host;

            proxy_set_header   X-Real-IP $remote_addr;

            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header   X-Forwarded-Host $server_name;

        }

    }

}

  Line 8-10    定义一组服务器(这里只有webapp), 资源名称(app_servers)可用在本文件任意位置。  

  Line 13       通知Nginx在80端口监听

  Line 15-22  指示所有的请求都需要被代理到app_servers

  总之,这个文件定义了Nginx在80端口监听外部请求,并将请求转发给同一容器的5000端口。

640?wx_fmt=gif 启动脚本

  对于Docker容器,只能使用一个CMD(或ENTRYPOINT定义),但是这种反向代理配置需要启动Nginx和Kestrel, 所以我们定义一个脚本去完成这两个任务


#!/bin/bash

service nginx start

dotnet /app/app.dll

640?wx_fmt=gif 构建镜像

  docker build -t example/hello-nginx .

  该镜像名称为 example/hello-nginx  观察输出,会看到Dockerfile 中定义的每一步输出。

  该镜像构建Dockerfile与vs docker tool生成的dockerfile进行对比,该文件生成的镜像更小,充分利用了镜像分层的理念。

 

640?wx_fmt=gif 运行镜像

  docker run --name test -it -d -p 8080:80 example/test

  该容器名称为test, 现在可从 http://localhost:8080 端口访问webapp, 通过curl -s -D - localhost:8080 -o /dev/null 验证

  通过shell终端进入容器内部, 可进一步分别探究Nginx和Kestrel服务:

  docker exec -it test bash


HTTP/1.1 200 OK

Server: nginx/1.6.2

Date: Fri, 24 Feb 2017 14:45:03 GMT

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

HTTP/1.1 200 OK

Date: Fri, 24 Feb 2017 14:45:53 GMT

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8

Server: Kestrel

tip:对于正在运行的容器,可使用docker exec -it  [container_id] [command]  进入容器内部探究容器

  对于启动失败的容器,可使用docker logs [container_id]  查看容器输出日志

了解一下docker的网络基础知识:

  当Docker守护进程以其默认的配置参数在宿主机启动时,会创建一个名为docker0的Linux网桥设备, 该网桥会自动分配满足标准的私有IP段的随机IP直至和子网, 该子网决定了所有新创建容器将被分配的容器IP地址所属网段。

可使用 docker inspect [container_id] 查看network部分配置:


---- 截取自 docker inspect [container_id]的输出---

"Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID""a74331df40dc8c94483115256538304f1cbefe9f65034f20780a27271e6db606",

                    "EndpointID""4f35ea62c1715bd9f6855bc82ada06e1bf5e58291dabb42e92ebc9552c6f017b",

                    "Gateway""172.17.0.1",

                    "IPAddress""172.17.0.3",

                    "IPPrefixLen": 16,

                    "IPv6Gateway""",

                    "GlobalIPv6Address""",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress""02:42:ac:11:00:03",

                    "DriverOpts": null

                }

            }

  其中列出的NetworkID 正是 docker network ls 名为bridge的网桥, 这便是默认建立的docker0 网桥(docker inspect networkid 可继续探究)。

640?wx_fmt=gif正如上面所说,ASP.NET Core有两种容器化反向代理部署架构,后续将会实践以独立容器分别部署Nginx、ASP.NET Core。 

原文地址:https://www.cnblogs.com/mi12205599/p/10789202.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

计算几何专题

选自计算几何专题 二维: 一。点,线,面,形基本关系,点积叉积的理解 POJ 2318 POJ 2398 POJ 1269 POJ 1556 POJ 2653 POJ 1066 POJ 1410 POJ 1696 POJ 3347 POJ 2826 POJ 1039 POJ 3449 POJ 1584 POJ 2074 二。凸包问…

领域驱动设计学习之路—DDD的原则与实践

本文是我学习Scott Millett & Nick Tune编著的《领域驱动设计模式、原理与实践》一书的学习笔记,一共会分为4个部分如下,此文为第1部分:领域驱动设计的原则与实践战略模式:在有界上下文之间通信战术模式:创建有效的…

Xor HDU - 6899

Xor HDU - 6899 题意&#xff1a; 给你A&#xff0c;B&#xff0c;K&#xff0c;W&#xff0c;问现在有多少个(x,y)满足下列形式&#xff1f; x,y都是整数x∈[0,A],y∈[0,B]|x-y|<kx xor y<W 题解&#xff1a; 数位dp 对于第1&#xff0c;2&#xff0c;4都是经典的数…

.NET Core中使用Dapper操作Oracle存储过程最佳实践

为什么说是最佳实践呢&#xff1f;因为在实际开发中踩坑了&#xff0c;而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为OracleDbType.RefCursor&#xff0c;输出为&#xff1a;ParameterDirection.Output数据的时候。网上千篇一律的说写一个Ora…

Sum of Log(2020上海C)

Sum of Log 题意&#xff1a; 求∑i0X∑j[i0]Y[i&j0]⌊log2(ij)1⌋\sum_{i0}^{X}\sum_{j[i0]}^{Y}[i\&j0]\lfloor log_{2}(ij)1\rfloor∑i0X​∑j[i0]Y​[i&j0]⌊log2​(ij)1⌋ 题解&#xff1a; 数位dp 如果式子想有意义&#xff0c;i&j就要等于0&#xf…

CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB

一、多样输出支持CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件&#xff0c;它可以随着ASP.NET Core实例的启动而启动&#xff0c;目前采用轮询的方式对Canal Server进行监听&#xff0c;获得MySql行更改&#xff08;RowChange&#xff09…

CF1039C Network Safety

CF1039C Network Safety 题意&#xff1a; 题解&#xff1a; 如果我们同时选中a&#xff0c;b两个点&#xff0c;无论异或什么值&#xff0c;都不会影响图的安全性&#xff0c;因为图本来就是安全的 破坏图的安全性只有一种情况&#xff0c;那就是选了a&#xff0c;没选b&…

使用Jenkins来实现内部的持续集成流程(下)

目录配置项目构建添加任务添加源代码地址和登录凭据添加构建触发器 TFS添加WebHook 添加构建步骤后端UI API端 配置项目构建1添加任务2添加源代码地址和登录凭据添加源代码地址和登录凭证此图没有填写凭证时显示的错误点击Credential后面的添加 填写能访问源代码的用户名和密码…

Visible Trees HDU - 2841(容斥)

Visible Trees HDU - 2841 题意&#xff1a; 大概就是有个m*n个点的矩形从(1,1)到(m,n)&#xff0c;问从(0,0)出发直线看过去最多能看到几个点。 题解&#xff1a; 容斥做法参考 这个题和AcWing 201. 可见的点一样的&#xff0c;但是这里介绍不同的做法&#xff0c;用容斥做…

.NET和Docker ,比翼双飞

DockerCon 2019本周将在旧金山举行 &#xff0c;DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团队博客发布了《一起使用.NET和Docker - DockerCon 2019更新》&#xff1a;https://devblogs.microsoft.com/dotnet/using-net-…

Visible Lattice Points SPOJ - VLATTICE

Visible Lattice Points SPOJ - VLATTICE 题意&#xff1a; 有一个n∗n∗n的三维直角坐标空间&#xff0c;问从(0,0,0)看能看到几个点。 题解&#xff1a; 本题是二维的一个升级版&#xff0c;升级成三维 用莫比乌斯反演来做 代码&#xff1a; #include <bits/stdc.h…

使用ASP.NET Core开发GraphQL服务器 -- 极简预备知识(上)

为了介绍使用ASP.NET Core构建GraphQL服务器&#xff0c;本文需要介绍一下GraphQL&#xff0c;其实看官网的文档就行。什么是GraphQL&#xff1f;GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描…

GCD HDU - 1695

GCD HDU - 1695 题意&#xff1a; 给出a,b,c,d,k,求出a<x<b, c<y<d 且gcd(x,y) k 的&#xff08;x,y&#xff09;的对数。 求的是不同数量对的总数 题解&#xff1a; 和这个题一样P3455 [POI2007]ZAP-Queries&#xff0c;但是本题要求求不同数量对的总数&…

使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试

如果你是开发个人项目&#xff0c;那就直接用 Visual Studio Community 版本吧&#xff0c;对个人免费&#xff0c;对小团体免费&#xff0c;不需要这么折腾。如果你是 Mac / Linux 用户&#xff0c;不想用 Visual Studio for Mac 版&#xff1b;或者不想用 Visual Studio for …

J Red-Black Paths(ICPC网络赛第一场)

J Red-Black Paths(ICPC网络赛第一场) 题意&#xff1a; 有n个点&#xff0c;m次操作&#xff0c;有三种操作&#xff1a; 1 u v&#xff1a;从u向v建一个有向边 2 u&#xff1a;将点u染成红色 3 u: 将点u染成黑色 4 查询最新生成的红黑边的异或值 红黑边的值为&#xff1a;∑…

亲儿子 | Azure SignalR 服务现在支持 ASP.NET

点击上方蓝字关注“汪宇杰博客”文 / Zhidi译 / Edi Wang我们刚刚发布了支持ASP.NET的正式版 SignalR 服务 SDKMicrosoft.Azure.SignalR.AspNet v1.0.0Azure SignalR 服务是一种完全托管的用于实时消息传递的 Azure 服务。它是扩展 ASP.NET Core SignalR 应用程序的首选方法。但…

VS Code Remote 发布!开启远程开发新时代

今天&#xff08; 北京时间 2019 年 5 月 3 日 &#xff09;&#xff0c;在 PyCon 2019 大会上&#xff0c;微软发布了 VS Code Remote&#xff0c;开启了远程开发的新时代&#xff01;这次发布包含了三款核心的全新插件&#xff0c;它们可以帮助开发者在容器&#xff0c;物理或…

The 2019 ICPC Asia Shanghai Regional Contest

The 2019 ICPC Asia Shanghai Regional Contest 题号题目知识点AMr. Panda and DominoesBPrefix CodeCMazeDSpanning Tree RemovalECave EscapeFA Simple Problem On A TreeGPlay the game SETHTree PartitionIPortalJBob’s Poor MathKColor GraphLLight It DownMBlood Press…

使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下)

上一篇&#xff1a;使用ASP.NET Core开发GraphQL服务器 -- 极简预备知识(上)处理数据嵌套字段看例子&#xff1a;我想查看viewer下的repositories。注意里面的edges&#xff0c;一旦看到这个词&#xff0c;通常就表示有连接到某个数组的数据。在这里就是一个集合的repository。…

icpc网络赛第二场K Meal

icpc网络赛第二场K Meal 题意&#xff1a; 有n个人&#xff0c;n个菜&#xff0c; 现在n个人轮流吃菜&#xff0c;起初S中有n个菜&#xff0c;第i个人会在还没拿走的菜中随机选一个&#xff0c;拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{i,j}}{\sum_{k∈S}a_{i,k}}∑k∈S​…