关键词:
引言
Nginx->ASP.NET Coe部署架构容器化
本次实践将会使用.NET Core CLI 创建默认的web应用
mkdir app cd app dotnet new web dotnet restore dotnet build
之后将项目发布到指定目录(dotnet publish), 发布产生的文件将会用于镜像打包。
构建镜像
坑1:本次部署的是web app,不要使用【mcr.microsoft.com/dotnet/core/runtime:2.2】作为基础镜像,启动容器会报错:It was not possible to find any compatible framework versionThe 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框架组件。
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
# 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守护进程以其默认的配置参数在宿主机启动时,会创建一个名为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
在 ASP.NET 中以 PDF 格式呈现 s-s-rS 报告
】在ASP.NET中以PDF格式呈现s-s-rS报告【英文标题】:Renders-s-rSreportinPDFformatinASP.NET【发布时间】:2015-05-0112:25:17【问题描述】:我在服务器上部署了一些s-s-rS报告。现在我正在从我的ASP.NET应用程序访问这些报告。经过一番研究,... 查看详情
在 Linux 上部署 ASP.NET MVC:最佳实践、工具和惊喜
】在Linux上部署ASP.NETMVC:最佳实践、工具和惊喜【英文标题】:DeployASP.NETMVConLinux:BestPractices,Tools&Surprises【发布时间】:2010-11-1310:23:16【问题描述】:我想知道开发ASP.NETMVC应用程序的最佳实践,可以选择在Linux上部署。如果您... 查看详情
ASP.NET 网站在部署时看起来不同
...计和ASP.NET的乐趣,以及试图让事物在IE和所有其他浏览器中以相同方式显示的噩梦。我在VS2010中工作并使用IE 查看详情
部署应用程序后 ASP.NET Core 2.2 身份验证不起作用 - 具有多个应用程序的 Nginx
】部署应用程序后ASP.NETCore2.2身份验证不起作用-具有多个应用程序的Nginx【英文标题】:ASP.NETCore2.2Authenticationnotworkingafterdeployingtheapp-Nginxwithmutlipleapps【发布时间】:2020-07-2705:06:11【问题描述】:我正在尝试使用Nginx将我的应用程... 查看详情
如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?
】如何使用VisualStudio2019在Docker容器中运行ASP.NETCore3.1项目?【英文标题】:HowtorunanASP.NETCore3.1projectinaDockercontainerwithVisualStudio2019?【发布时间】:2020-04-2114:35:36【问题描述】:我创建了一个基于ASP.NETCore3.1框架的WebAPI项目。后来,... 查看详情
如何在 ASP.NET 中以 'YYYY-MM-DD' 格式获取当前日期?
】如何在ASP.NET中以\\\'YYYY-MM-DD\\\'格式获取当前日期?【英文标题】:Howtogetcurrentdatein\'YYYY-MM-DD\'formatinASP.NET?如何在ASP.NET中以\'YYYY-MM-DD\'格式获取当前日期?【发布时间】:2011-06-2902:20:06【问题描述】:如何在ASP.NET中以\'YYYY-MM-DD\... 查看详情
在 Asp.Net 中以编程方式添加样式表
】在Asp.Net中以编程方式添加样式表【英文标题】:AddingStyleSheetsProgrammaticallyinAsp.Net【发布时间】:2011-02-2522:44:57【问题描述】:我想以编程方式在head部分添加样式表,但我看到的一个示例似乎需要很多行代码才能添加一个样式... 查看详情
在 ASP.NET 中以不同用户身份启动进程
】在ASP.NET中以不同用户身份启动进程【英文标题】:StartingaProcessasaDifferentUserinASP.NET【发布时间】:2009-10-1318:17:15【问题描述】:我有一个ASP.NETMVCWeb应用程序,并且我想在其中一个控制器操作中启动进程(exe文件)。该进程需... 查看详情
简单描述在docker上部署nginx应用和在集群中部署的区
参考技术A项目部署到Linux环境的Docker容器中。在docker上部署nginx应用和在集群中部署的区,可以简单的描述为把NetCore项目部署到Linux环境的Docker容器中,基于Nginx形成一个小小集群。 查看详情
在 datalist 中以字节为单位显示默认图像或图像 - asp.net
】在datalist中以字节为单位显示默认图像或图像-asp.net【英文标题】:Displaydefaultimageorimageinbytesindatalist-asp.net【发布时间】:2021-12-1507:15:57【问题描述】:我目前从数据库中检索数据并将其存储在数据列表中。其中一项是用于显... 查看详情
如何在 ASP.NET MVC 中以 JSON 格式返回 500 错误?
】如何在ASP.NETMVC中以JSON格式返回500错误?【英文标题】:HowcanIreturn500errorinJSONformatinASP.NETMVC?【发布时间】:2011-08-1509:29:30【问题描述】:当ASP.NETMVC抛出异常时,它会返回响应类型为text/html的500错误——当然,这是无效的JSON。... 查看详情
在 ASP.Net (Visual Studio 2013) 中以结构格式解析 Json 数据
】在ASP.Net(VisualStudio2013)中以结构格式解析Json数据【英文标题】:ParseJsonDatainStructureformatinASP.Net(VisualStudio2013)【发布时间】:2019-07-2511:27:34【问题描述】:我只希望JSON数据以特定格式返回,例如所有细节之上的一个数组。请浏览... 查看详情
Asp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] 放入Docker容器后是不是真的自包含
】Asp.NetCoreWebAPI[dotnetpublish--self-contained-rlinux-64]放入Docker容器后是不是真的自包含【英文标题】:Asp.NetCoreWebAPI[dotnetpublish--self-contained-rlinux-64]isitreallyself-containedafterputtingintoDockercontainerAsp.NetCoreWebAPI[dotn 查看详情
在变量中有一个 Json 数据,并希望在 asp.net 中以表格形式显示该数据
】在变量中有一个Json数据,并希望在asp.net中以表格形式显示该数据【英文标题】:HaveaJsondatainavariableandwanttodisplaythatdatainTabularforminasp.net【发布时间】:2020-04-1505:05:31【问题描述】:我想使用ASP.NET将其转换为表格格式responsebody=[... 查看详情
asp.net项目能部署到ubuntu云服务器么?
...里有一个腾迅云的Ubuntu云服务器想把我写好的asp.net项目部署上去但是我不知道能不能部署?也不会。敢问哪位大神会指点一下小弟!域名也是有的!如果Ubuntu云服务器不能部署有其他的部署方式么?本地的部署我试了失败了........ 查看详情
在 Javascript 中以自然方式添加后,我无法在 asp.net 中获取 Listbox 的值
】在Javascript中以自然方式添加后,我无法在asp.net中获取Listbox的值【英文标题】:Ican\'tgetvaluesofListboxinasp.netafteritwasdaynamicallyaddedinJavascript【发布时间】:2021-05-0516:01:48【问题描述】:我每天在javascript中创建选择选项,然后单击... 查看详情
docker asp.net 核心容器在 mysql 容器之后启动
】dockerasp.net核心容器在mysql容器之后启动【英文标题】:dockerasp.netcorecontainerstartingafteramysqlcontainer【发布时间】:2018-12-2321:17:01【问题描述】:我有一个带有asp.net核心的docker容器和一个带有mysql的容器。现在我需要等待asp.net核... 查看详情
如何在 ASP.NET Core 的 .json 配置文件中以跨平台方式存储文件路径?
】如何在ASP.NETCore的.json配置文件中以跨平台方式存储文件路径?【英文标题】:Howtostorefilepathsinacrossplatformwayina.jsonconfigurationfileinASP.NETCore?【发布时间】:2020-09-0706:51:56【问题描述】:如何在ASP.NETCore的.json配置文件中跨平台存... 查看详情