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完成通信(请关注后续博文)。
?
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框架组件、依赖项, 该镜像为生产部署做了一些优化。
本次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 稍后给出启动脚本
? ? 最终(tree -L 1)输出的app目录结构如下 . ├── app.csproj ├── appsettings.Development.json ├── appsettings.json ├── bin ├── Dockerfile ├── nginx.conf ├── obj ├── Program.cs ├── Properties ├── Startup.cs └── startup.sh
创建以上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
?
了解一下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 } }
时间:2019-04-29 12:45:17
阅读(16)
最新文章
更多
1
BM凌晨3点的喊单:All in ram!
2019-05-31
2
Jenkins持续集成实战
2019-06-01
3
SCRUM起源
2019-06-01
4
SCRUM术语
2019-06-01
5
SCRUM团队的三个角色
2019-06-01
6
经验性过程
2019-06-01
7
实例解读什么是Redis缓存穿透、缓存雪崩和缓存击穿
2019-06-01
8
康少带你玩转JavaScript
2019-06-01
9
微信公众号开发:用户管理
2019-05-31
10
使用Redis分布式锁处理并发,解决超卖问题
2019-06-01
最新资讯
更多
1
汇通达的全局思维:从“赋能乡镇店”到“服务全产业链”
2019-05-31
2
透过潮流达人看时尚,这个夏天“赤茶橘”绝对是你不可缺少的颜色
2019-05-31
3
从技术信仰到价值输出 的卢深视获TopDigital创新金奖
2019-05-31
4
传亚马逊或收购美两家运营商部分业务 以及频谱资源
2019-05-31
5
研究人员发现能逃避杀毒软件检测的 Linux 后门
2019-05-31
6
韦伯望远镜通过了最后的热真空测试
2019-06-01
7
美国禁令下的压强测试:华为手机中国市场成为反弹变量
2019-05-31
8
IDC:2019年Q1中国平板电脑出货531万台 同比增4.5%
2019-05-31
9
“贩卖焦虑”失效!你还在为“知识付费”买单吗?
2019-05-31
10
华为健康使用手机功能 让学习更高效生活更健康
2019-05-31
联系我们 -
留言反馈
? 2017 版权所有 鲁ICP备17052893号
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |