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

NOP*_*MOV 2 nginx docker .net-core asp.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"]
Run Code Online (Sandbox Code Playgroud)

我想将Nginx安装为服务和公开的公共网络之间的一层。

最终结果应该是在仅内部端口90上运行的ASP.NET,以及将本地90转发到公共80端口的Nginx Web服务器。

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

谢谢!

Nee*_*koy 8

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
Run Code Online (Sandbox Code Playgroud)

基本上,我们公开应用程序的端口,以便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"]
Run Code Online (Sandbox Code Playgroud)

此时,您只需要创建Nginx配置文件“ nginx-website.conf”并为端口80至8080设置反向代理。

  • 谢谢。这意味着我必须运行两个不同的容器。有没有一种方法可以将 nginx 安装为前端,将 IIS/Kestrel 安装为单个 docker 上的内部端口?这一设置应该进行扩展,因此我不想为每个逻辑单元创建两个不同的容器。谢谢。 (2认同)
  • @ NOP-MOV我用一个容器的解决方案编辑了我的帖子。 (2认同)