我目前正在为ASP.NET Core WebAPI项目运行一个docker容器。 该Web服务当前在端口80上公开。
我的dockerfile看起来像这样:
FROM microsoft/dotnet:2.1-aspnetcore-runtime
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "testapi.dll"]
我想在服务和公开的公共网络之间安装nginx作为层。
最终结果应该是ASP.NET运行在仅内部端口90上,并且nginx Web服务器将本地90转发到公共80端口。
这可能吗?如果是这样,我如何实现这种架构?顺便说一句,我完全知道由额外的层引起的开销。
谢谢!
答案 0 :(得分:6)
Docker的实现方式是为两个服务提供两个容器。 Docker-compose是帮助管理多容器应用程序的工具。
以下docker-compose.yml应该为您工作:
version: '3'
services:
app:
build:
context: ./dotnet
dockerfile: Dockerfile
expose:
- "80"
proxy:
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- "80:80"
links:
- app
基本上,我们为您的应用程序公开端口,以便Nginx容器可以访问它,然后将Nginx容器上的端口绑定到主机上的端口。
您将Dockerfile和应用程序放置在“ dotnet”文件夹中,并将您的NginX逻辑放置在/ nginx / Dockerfile文件中。
编辑:如果您真的想将两个服务都放在一个容器中,则可以使用以下命令:
FROM microsoft/dotnet:2.1-aspnetcore-runtime
ENV ASPNETCORE_URLS https://*:8080
RUN apt update && \
apt install nginx
ADD nginx-website.conf /etc/nginx/sites-enabled
RUN service nginx restart
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "testapi.dll"]
这时,您只需要创建Nginx配置文件“ nginx-website.conf”并为端口80到8080设置反向代理。
答案 1 :(得分:0)
最好在应用程序网关级别(例如Kong,Tyk.io,Aws,Azure)进行设置,而不是在单个服务上进行设置。
例如,Kong使用nginx,您可以配置nginx进行响应压缩。设置以下环境变量
- KONG_NGINX_HTTP_GZIP="on"
- KONG_NGINX_HTTP_GZIP_TYPES="*" # for all requests, you can add specific mime-type as you want.
- KONG_NGINX_HTTP_GZIP_PROXIED="any"
- KONG_NGINX_HTTP_GZIP_MIN_LENGTH="1000"
您可以在以下位置找到有关kong / nginx配置的更多详细信息 https://docs.konghq.com/1.0.x/configuration/#injecting-nginx-directives http://nginx.org/en/docs/http/ngx_http_gzip_module.html