正如

前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到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完成通信(请关注后续博文)。

 本次实践将会使用.NET Core CLI 创建默认的web应用

mkdir app

cd app

dotnet new web

dotnet restore

dotnet build

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

 构建镜像

  本次将以 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

 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端口。

 启动脚本

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

#!/bin/bash

service nginx start

dotnet /app/app.dll

 构建镜像

  docker build -t example/hello-nginx .

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

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

 运行镜像

  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 可继续探究)。

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

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

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

Linux中以单容器部署Nginx+ASP.NET Core相关推荐

  1. Elasticsearch在Linux中的单节点部署和集群部署

    目录 一.Elasticsearch简介 二.Linux单节点部署 1.软件下载解压 2.创建用户 3.修改配置文件 4.切换到刚刚创建的用户启动软件 5.测试 三.Linux集群配置 1.拷贝文件 ...

  2. Linux+Nginx+Asp.net Core部署

    上篇<Docker基础入门及示例>文章介绍了Docker部署,以及相关.net core 的打包示例.这篇文章我将以oss.offical.site站点为例,主要介绍下在linux机器下完 ...

  3. suse linux 单用户,如何在 SUSE 12 Linux 中进入单用户模式?

    原标题:如何在 SUSE 12 Linux 中进入单用户模式? 编译自: https://kerneltalks.com/howto/how-to-enter-single-user-mode-in- ...

  4. CentOS中使用Docker来部署Nginx

    场景 CentOS7中Docker的安装与配置: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119028701 在上面安装好D ...

  5. 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json

    这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 -- 如果将包含敏感信息的应用配置文件 appsettings.Production.json ...

  6. docker启动nginx后挂了_Docker容器部署 Nginx服务

    1.查找 Docker Hub 上的 nginx 镜像 [root@localhost ~]# docker search nginx 2.拉取官方的Nginx镜像 [root@localhost ~ ...

  7. Linux环境下安装及部署Nginx教程

    一.安装教程 1.官网下载地址:nginx: download 2.下载教程: 1)选择Stable version版本下载到本地(该版本为Linux版本),下载完成后直接在本地解压后放入linux系 ...

  8. linux 全新编译安装,全新linux中通过编译方式安装nginx

    先去官网下载linux.tar.gz包 http://nginx.org/en/download.html 传到linxu中 解压tar包 在软件包nginx-1.15.9目录下对NGINX进行配置 ...

  9. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期.这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 正文 今 ...

最新文章

  1. Java中的引用类型(强引用、弱引用)和垃圾回收
  2. RabbitMQ消息确认机制
  3. php手册学习怎样,PHP新手之如何学习PHP的讲解
  4. SAP License:SAP概念辨识
  5. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
  6. 走进C++程序世界-----函数相关(全局变量)
  7. 知识管理系统Data Solution研发日记之七 源代码与解决方案
  8. 设置一个类似手机的锁屏界面但又不知道如何操作
  9. 多个项目共用同一个redis_浅谈Redis分布式锁(上)
  10. 分布式服务架构读书笔记-第六章 Java服务的线上应急和技术攻关
  11. python 封包发包_python中封包建立过程实例
  12. 论文笔记1:Fast and Robust Multi-Person 3D Pose Estimation from Multiple Views
  13. LiveGBS国标GB/T28181如何配置按需云端录像(播放时候录像)和一直录像
  14. Web网站模板-餐厅饭店宣传响应式网站模板(HTML+CSS+JavaScript)
  15. 命名空间 namespace
  16. 2020.10.20课堂笔记(java8新特性 lambda表达式)
  17. RationalDMIS 7.1 建立坐标系(3-2-1法)
  18. 淘淘商城第44讲——搭建搜索系统工程
  19. 中国互联网的沧海桑田
  20. 一键修改计算机名和用户名,电脑用户名怎么改_电脑用户名(计算机名)修改方法_牛游戏网...

热门文章

  1. ios12彻底关闭siri_Siri正在iOS 12中获取自定义语音操作
  2. 如何在Android主屏幕上添加热点快捷方式
  3. 把angular(vue等)项目部署在局域网上
  4. css3 伪类选择器
  5. vue经验 - 细节小知识点汇总(更新中...)
  6. piwik抓取用户交互行为
  7. BZOJ4573:[ZJOI2016]大森林——题解
  8. 解决iPhone网络软件在睡眠情况断线问题
  9. QQ旋风爆缓冲区溢出漏洞
  10. Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?| IDCF