在现有的asp.net核心docker容器上安装nginx

时间:2018-07-10 11:56:30

标签: docker nginx asp.net-core .net-core asp.net-core-webapi

我目前正在为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端口。

这可能吗?如果是这样,我如何实现这种架构?顺便说一句,我完全知道由额外的层引起的开销。

谢谢!

2 个答案:

答案 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