在现有asp.net core docker容器上安装nginx

在现有asp.net core docker容器上安装nginx,docker,nginx,asp.net-core,.net-core,asp.net-core-webapi,Docker,Nginx,Asp.net Core,.net Core,Asp.net Core Webapi,我目前正在为ASP.NET核心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核心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上运行,端口90仅为内部端口,而nginx Web服务器将本地90转发到公共80端口

这可能吗?如果是,我如何实现这样的架构?顺便说一句,我完全知道额外的一层所造成的开销


谢谢

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设置反向代理。

最好在应用程序网关级别(如Kong、Tyk.io、Aws、Azure)设置,而不是在单个服务上设置

例如,使用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配置的更多详细信息,请访问

谢谢。这意味着我必须运行两个不同的容器。有没有一种方法可以将nginx作为正面安装,将IIS/Kestrel作为一个docker上的唯一内部端口安装?这个设置应该扩展,这样我就不想为每个逻辑单元创建两个不同的容器。谢谢。通常Docker方式是每个容器一个应用程序,所以建议按上面的方式运行。我出去吃午饭了,但回来后我会用一个容器的解决方案编辑我的帖子。@NOP-MOV我用一个容器的解决方案编辑了我的帖子。@NOV-MOV在一个容器中运行你的应用程序并不会降低它的可伸缩性,但更易于调试(更容易看出哪个应用程序有问题)和容错性(一个应用程序崩溃不会导致两个应用程序都崩溃)。谢谢,但在这种情况下,我的目标是保护docker本身不受orchestrator的影响。我们还在外部部署WAF。