Docker - 无法在端口 80 上公开

时间:2021-01-24 18:52:47

标签: docker .net-core

我在 Docker 上公开我的 .Net Core 应用程序时遇到问题。

我的 Dockerfile 就是这样开始的

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /src

我构建并运行:

docker run -d -p 8080:80 --name test testapp

容器启动但我无法访问端口 8080 上的应用

在容器日志中我可以看到

warn: Microsoft.AspNetCore.Server.Kestrel[0]

Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.

info: Microsoft.Hosting.Lifetime[0]

Now listening on: http://localhost:5000

但我期待:

Now listening on: http://[::]:80

为什么不明白为什么这不是 80 并且我无法从外部访问我的应用程序,即使使用 8080:5000 运行它

从容器内部到 loclalhost:5000 的 CURL 返回正确的 HTML

3 个答案:

答案 0 :(得分:0)

应用程序在端口 5000 上运行,而您正在尝试公开 80。因此更改您的 Dockerfile 并公开 5000

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /src

现在通过暴露 5000 端口来运行镜像

docker run -d -p 8080:5000 --name test testapp

答案 1 :(得分:0)

您可以使用 ASPNETCORE_URLS 环境变量告诉 Kestrel 侦听不同于 localhost:5000 的主机/端口。

docker run -d -p 8080:80 -e ASPNETCORE_URLS=http://+:80 --name test testapp

the docs中有更多信息。

现在,根据我的经验,如果我有我的入口点/cmd 来执行 dotnet run,我需要设置这个环境变量。另一方面,如果我将它设置为使用 DLL,即 CMD ["dotnet", "testapp.dll"],它会监听 默认为 0.0.0.0:80,这意味着我不必设置 ASPNETCORE_URLS 变量。

所以你也可以玩一下你的入口点/cmd。我找不到这部分文档,所以不确定它是如何工作的...

答案 2 :(得分:0)

您使用的是哪个操作系统?我在使用 Fedora 时遇到了完全相同的问题。如果您使用的是 Fedora 或 RHEL,Docker 网络需要额外的配置才能工作。

https://fedoramagazine.org/docker-and-fedora-32/

(我没有足够的声誉发表评论,所以我正在回答)。