怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET

Linux 搜搜CMS网 11个月前 (11-26) 327次浏览 0个评论 扫描二维码

推荐在生产环境中运用反向代办效劳器转发要求到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完成通讯(请关注后续博文)。

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 本次实践将会运用.NET Core CLI 竖立默许的web运用

mkdir app
cd app
dotnet new web
dotnet restore
dotnet build

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

相干教程:Linux视频教程

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 构建镜像

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

/usr/share/dotnet/

– 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

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 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端口。

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 启动剧本

  关于Docker容器,只能运用一个CMD(或ENTRYPOINT定义),然则这类反向代办设置须要启动Nginx和Kestrel, 所以我们定义一个剧本去完成这两个使命

#!/bin/bash
service nginx start
dotnet /app/app.dll

相干教程:docker视频教程

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 构建镜像

  docker build -t example/hello-nginx .

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

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

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET 运转镜像

  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

# curl -s -D - localhost:80 -o /dev/null
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

# curl -s -D - localhost:5000 -o /dev/null
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的收集基本知识:

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET

  当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 可继承探讨)。

怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET正如上面所说,ASP.NET Core有两种容器化反向代办布置架构,后续将会实践以自力容器离别布置Nginx、ASP.NET Core。

以上就是怎样在Linux体系中以单容器装置Nginx+ASP.NET Core的细致内容,更多请关注ki4网别的相干文章!


版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:怎样在Linux体系中以单容器装置Nginx+ASP.NET Core【Linux】,Linux,Nginx,ASP.NET
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到