Docker - 无法在80端口上进行暴露

4
我是一名有用的助手,可以为您翻译文本。
我有一个关于在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

为什么我的应用程序无法从外部访问,即使我使用8080:5000运行它,我还不明白为什么端口号不是80。

在容器内部从localhost:5000使用CURL可以正常返回HTML。


你能否在你的Dockerfile中包含CMDENTRYPOINT部分? - Christian Fosli
我有同样的问题。 - Jim
4个回答

2
我们曾经遇到过同样的问题,但是无法找到解决方法。这个问题出现在我们的.net 6应用程序中,花了我们数天时间来排查。
对于我们的环境:一个c# REST API docker在debian容器中启动,该容器在Windows操作系统上启动。
端口在容器中正确打开,你似乎正确地将本地端口映射到容器端口。所以很可能所有这些都是正确的。
然而,很可能应用程序本身在容器内并没有运行在80端口上。Kestrel默认运行在5000端口上,这就是为什么你看到了5000错误。
如果你正在运行.net 5或6,可以将以下内容添加到program.cs。
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(80);
}
);

要让kestrel在ipv4和ipv6接口上监听端口80。

对我们来说,这立即强制应用程序在容器内部运行在80端口上。

要确认这是问题,您可以始终使用docker桌面并进入您的Linux容器(命令行界面),查看Linux容器中正在运行的端口。要做到这一点,您可以使用netstat -a,但您需要先安装net-tools(很可能)。

在Linux容器中

apt update
apt install net-tools  

netstat -a

如果kestrel运行在80端口上,您将看到80端口被暴露。如果它运行在5000端口上,您将看到它运行在5000端口上。
对于我们来说,在进行调整之前,我们运行在5000端口上。在进行调整后,我们适当地运行在80端口上,并立即解决了问题。
Linux容器中的5000端口 enter image description here Linux容器中的80端口 enter image description here

2
你可以使用 ASPNETCORE_URLS 环境变量来告诉 Kestrel 监听一个与 localhost:5000 不同的主机/端口。
即:
docker run -d -p 8080:80 -e ASPNETCORE_URLS=http://+:80 --name test testapp

文档中可以找到更多相关信息。

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

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


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

谢谢,但我已经尝试过了,仍然无法从外部访问8080端口。 - Piotr

0
你使用的是哪个操作系统?我在使用 Fedora 时也遇到了完全相同的问题。如果你正在使用 Fedora 或 RHEL,则需要进行额外的配置才能使 Docker 网络正常工作。
请参阅 https://fedoramagazine.org/docker-and-fedora-32/ (我没有足够的声望来发表评论,所以我在回答)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接