我在 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
答案 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/
(我没有足够的声誉发表评论,所以我正在回答)。