ASP.net 在 Docker 容器中 运行 时,核心 Web 应用程序未收到请求

ASP.net Core Web App not receiving requests when running in Docker container

我想要 dockerize 一个简单的 ASP.net 核心 Web 应用程序,它使用 Kestrel 托管 REST API。

正如您在控制台输出中看到的那样,当我在本地计算机上 运行 应用程序运行良好时。 我看到了它正在侦听的 URL以及我调用以确保它 运行 正确的端点:

> dotnet DockerTest.dll
> Hosting environment: Production
> Now listening on: https://localhost:5001
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.
> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
...

现在进入 docker 部分:

我的 Dockerfile 非常简单。我拉取 ASP.net 核心基础映像,从 dotnet publish "DockerTest.csproj" -c Release -o ./output 复制输出并执行它,就像我在本地机器上执行它一样:

Docker 文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY ./output .
ENTRYPOINT ["dotnet", "DockerTest.dll"]

使用 docker build -t dockertest . 构建映像后,我使用端口绑定以及 ASPNETCORE_URLS 环境变量让它 运行 在 http://localhost:5000 上类似于我的本地设置:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://localhost:5000" dockertest

容器的输出表明应用正在侦听 http://localhost:5000:

> Hosting environment: Production
> Content root path: C:\app
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.

但是当我尝试访问端点时,我得到一个超时并且容器从未收到请求!

您的问题是由您指定 ASPNETCORE_URLS 的方式引起的。您应该侦听所有网络接口,而不是绑定到 localhost,以便接收来自容器外部的请求。

这可以通过侦听 0.0.0.0 而不是本地主机来完成,或者使用 通配符 ,例如:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://+:5000"

如果支持 HTTP 和 HTTPS:

docker run -p 5000:5000 -p 5001:5001 -e ASPNETCORE_URLS="http://+:5000;https://+:5001"

或者使用默认端口时:

docker run -p 5000:80 -p 5001:443 -e ASPNETCORE_URLS="https://+;http://+"

我的首选方法是使用通配符 URL 并在必要时通过显式环境变量覆盖端口,例如:

-p 5000:80 -p 5001:5001 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=5001