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

news2024/9/21 12:43:36

强烈推荐在生产环境中使用反向代理服务器转发请求到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), 发布产生的文件将会用于镜像打包。

 1. 编写Dockerfile

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

因为该基础镜像是.NetCore 运行时镜像,但不包含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

2. 构建镜像

docker build -t example/hello-nginx .

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

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

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

3. 运行镜像

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的网络基础知识:

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

docker network ls 列出所有网络:

docker inspect [network_id] 查看默认网络的详细信息,其中【Container】包含刚刚建立的容器 xenodochial_mahavira 

[root@gs-server-5809 ~]$ docker  inspect a74331df40dc
[
    {
        "Name": "bridge",
        "Id": "a74331df40dc8c94483115256538304f1cbefe9f65034f20780a27271e6db606",
        "Created": "2018-12-28T17:05:33.100125947+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3482bffb690c8a83c675ebd1d9bdcd149fc790ac8719bf447afae77e4cecbd7d": {
                "Name": "xenodochial_mahavira",
                "EndpointID": "1fe8569c3806b4b2bc032f54162a809ea3e18fd8e4ea41d68ed1a9e4f233eb17",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "510f41b1e39e983fbc7a75d235078d642c385f08a42e34bcfd5df14a07e3700c": {
                "Name": "gitlab-runner",
                "EndpointID": "ff9d8ac9ab9fbbf37be93f03bdc0fb3e7db803c1e0a5d0e0c533caf8de1cc0da",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

上面显示默认的容器都会加入名为“bridge”的网络,该网络以bridge形式,利用的是docker0网桥设备,

可使用 ip addr 确认系统已经存在 docker0网桥设备, 使用 brctl show 查看网桥连接哪些接口。

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

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

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

相关文章

【Java】解析方法的调用关系

目录 一、方法的定义二、方法的声明格式三、方法的调用四、特殊方法:程序入口main方法五、方法的局部变量六、类的静态变量七、类的静态方法八、方法的传参九、方法的重载 一、方法的定义 方法就是 将功能重复的代码封装成一段独立的代码,通过调用方法的…

Element Plus的el-carousel走马灯平铺多张图片

效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…

「VLM」CLIP 文本与图像的桥梁

github&#xff1a;https://github.com/OpenAI/CLIP paper&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP全称&#xff1a;Contrastive Language-Imge Pre-training&#xff0c;即对比语言-图像预训练。 对比学习是一种更关注于学习…

SD卡无法读取怎么办?4个修复方法千万别错过

SD卡是我们生活中常见的存储设备之一&#xff0c;它小巧方便&#xff0c;容量适中&#xff0c;被广泛应用于数码相机、手机、平板等设备中&#xff0c;随着时间的增长&#xff0c;有时会遇到突然无法读取的问题&#xff0c;这不仅会影响我们的数据访问&#xff0c;还可能造成数…

idea 中的properties文件中文乱码

如遇到以下类似的问题&#xff1a; 配置setting中-》Editor-》File Encodings 中&#xff0c;将以下三处位置的编码格式进行修改 Global Encoding GBK Project Encoding GBK Default encoding for properties files UTF-8 修改之后文件的中文显示正常

MySQl 中对数据表的增删改查(基础)

MySQl 中对数据表的增删改查&#xff08;基础&#xff09; 新增演示插入一条数据插入多条数据 查询全列查询部分列查询查询关于列名的表达式查询时用别名查询去重后的结果查询排序后的结果条件查询比较运算符和逻辑运算符 分页查询 修改删除 黑白图是在命令行里的&#xff0c;彩…

【题解】【枚举】—— [NOIP1997 普及组] 棋盘问题

【题解】【枚举】—— [NOIP1997 普及组] 棋盘问题 [NOIP1997 普及组] 棋盘问题题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 解法1解法2 [NOIP1997 普及组] 棋盘问题 戳我查看题目&#xff08;洛谷&#xff09; 题目背景 NOIP1997 普及组第一题 题目描述 …

Java基础 文字小游戏

souf System.out.printf("你好啊%s","张三") 输出你好啊张三 System.out.printn()放在中间可以换行 System.out.printf("%s你好啊%s","张三","李四") 输出 张三你好啊李四 只有输出没有换行效果。 制作一个文字小游戏…

每期一个小窍门: Goland 配置跳板机登陆

写简单点 先说下大概流程 本地 访问 localhost:6000 --> 转发到跳板机:22 --> 再转发到指定内网地址 本机 .ssh/config Host *ControlPersist yesControlMaster autoControlPath ~/.ssh/%n:%p本机公钥 copy 到跳板机 和内网被跳机 本机命令 ssh -N -f -L 6000:<内…

Linux基础入门---安装vmware

&#x1f600;前言 本篇博文是关于Linux基础入门和vmwarel5.5下载&#xff0c;希望你能够喜欢。 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

告别繁琐ppt制作,用这5款AI工具,一键生成轻松搞定!

在云办公逐渐成为主流的当下&#xff0c;许多职场人士在办公时会首选各类在线应用&#xff0c;最常见的就是在线制作PPT、在线编辑文档、在线编辑表格或智能表格&#xff0c;除此之外&#xff0c;这两年AI人工智能技术的发展&#xff0c;也诞生了许多能一键生成PPT的AI工具。 …

队列的实现及循环队列

一、队列的概念及结构 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO&#xff08;Fist In First Out&#xff09;。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的一端称为…

nestjs 大笔记(连载中)

安装 npm i -g nestjs/cli nest new project-name快捷指令 nest g mo xxx # 生成 Module nest g co xxx # 生成 Controller nest g s xxx # 生成 Service nest g resource xxx # 生成一套Restful风格接口

PCIe板卡辅助信号解析

1.简介 PCIe Add-in卡借助PCIe插槽上的辅助信号&#xff0c;实现了很多系统级的功能&#xff0c;比如唤醒、复位、调试、热插拔等功能。具体的辅助信号有REFCLK-/REFCLK、PERST#、WAKE#、SMBCLK、SMBDAT、JTAG、CLKREQ#及PRSNT1#和PRSNT2#等&#xff0c;具体的作用如下&#x…

Facebook国内企业户、海外户、国内二不限户以及三不限户区别何在?

Facebook广告账户的类型和设置对于企业在不同市场中的广告活动至关重要。了解国内企业户、海外企业户&#xff0c;以及国内二不限户和三不限户的区别&#xff0c;可以帮助你更好地选择和管理广告账户。以下是对这些账户类型的详细解析。 一、Facebook海外企业广告账户 海外企业…

kettle的Javascript组件获取T-1天和T+1天

// 获取T-1的时间 var currentDate new Date(); currentDate.setDate(currentDate.getDate() - 1); var currentYear currentDate.getFullYear(); var currentMonth (0 (currentDate.getMonth() 1)).slice(-2); var currentDay (0 currentDate.getDate()).slice(-2); va…

每日OJ_牛客HJ52计算字符串的编辑距离(dp)

目录 牛客HJ52计算字符串的编辑距离&#xff08;dp&#xff09; 解析代码 牛客HJ52计算字符串的编辑距离&#xff08;dp&#xff09; 计算字符串的编辑距离_牛客题霸_牛客网 解析代码 计算字符串的编辑距离&#xff08;也称为Levenshtein距离&#xff09;是一个经典的动态规…

java SE--Lambda表达式和Stream流

一.Lambda表达式 1.Lambda表达式的简介 Lambda表达式是 jdk1.8 引入的一个新特性&#xff0c;它是函数式编程在Java中的一种体现。也是jdk1.8最值得学习的新特性&#xff0c;另一个就是流式编程。 1.Lambda表达式的引入简化了匿名内部类的语法&#xff0c;让代码更加简洁明了…

4.3.2 图像去畸变

4.3.2 图像去畸变 参考教程&#xff1a; 相机标定&#xff08;4&#xff09; 矫正畸变 undistort()和initUndistortRectifyMap()-CSDN博客 学习笔记 – opencv图像去畸变_opencv 畸变参数-CSDN博客 下面我们将演示图像去畸变的过程&#xff0c;在OpenCV中提供了一个函数cv:…

买新能源怕自燃?法院这判决我举双手赞成

文 | AUTO芯球 作者 | 雷慢 大快人心&#xff01;终于有法院为新能源车主做主了&#xff0c; 你们看啊&#xff0c;某新能源车主开车半路自燃&#xff0c;报了保险&#xff0c; 保险公司赔了18万&#xff0c;转身又去告汽车公司&#xff0c; 汽车公司又被法院判决赔偿保险…