【问题标题】:Docker dotnet run port not mapping, windows 10 host, linux containerDocker dotnet 运行端口未映射,Windows 10 主机,Linux 容器
【发布时间】:2019-05-15 16:41:00
【问题描述】:

我正在关注 https://app.pluralsight.com/library/courses/docker-web-development/table-of-contents,它使用较旧的 microsoft/aspnetcore-build 映像,但我运行的是 core 2.1,所以我使用的是 microsoft/dotnet:2.1-sdk 代替。

我正在运行的命令是:

docker run -it -p 8080:5001 -v ${pwd}:/app -w "/app" microsoft/dotnet:2.1-sdk

然后一旦进入 TTY,我会执行 dotnet 运行,它会给出以下输出:

使用 /app/Properties/launchSettings.json 中的启动设置...

信息: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]

用户个人资料可用。使用“/root/.aspnet/DataProtection-Keys” 作为密钥存储库;密钥不会被静态加密。

信息: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[58]

使用创建日期创建密钥 {5445e854-c1d9-4261-82f4-0fc3a7543e0a} 2018-12-14 10:41:13Z,激活日期 2018-12-14 10:41:13Z,和 到期日期 2019-03-14 10:41:13Z。

警告: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]

未配置 XML 加密器。钥匙 {5445e854-c1d9-4261-82f4-0fc3a7543e0a} 可能被持久化存储在 未加密的形式。

信息: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[39]

将数据写入文件 '/root/.aspnet/DataProtection-Keys/key-5445e854-c1d9-4261-82f4-0fc3a7543e0a.xml'。

警告:Microsoft.AspNetCore.Server.Kestrel[0]

无法在 IPv6 环回上绑定到 https://localhost:5001 interface: '无法分配请求的地址'.

警告:Microsoft.AspNetCore.Server.Kestrel[0]

无法在 IPv6 环回上绑定到 http://localhost:5000 interface: '无法分配请求的地址'.

托管环境:开发

内容根路径:/app

现在收听:https://localhost:5001

现在收听:http://localhost:5000

应用程序已启动。按 Ctrl+C 关闭。

然后,当我在主机上打开浏览器并导航到 http://localhost:8080 时,我收到“此页面无法正常工作”“本地主机未发送任何数据”“ERR_EMPTY_RESPONSE”

我也尝试了几个不同的端口组合,结果相同。

谁能发现我哪里出错了?或者有什么想法/建议?

【问题讨论】:

  • 您是否尝试访问 https 端点:localhost:8080
  • 您正在映射8080:5001 这是https端口,您需要按照Michael的建议访问https。如果不起作用,您能否与我们分享重现问题的详细步骤?似乎与无法绑定到 5001 的错误有关。您是否启动了多个应用程序?尝试更改一个新端口,例如5002
  • @Michael 是的,我做了同样的事情
  • @TaoZhou 我实际上同时映射到 http(5000) 和 http(5001)。 http和https都试过了,效果略有不同,这次得到ERR_CONNECTION_CLOSED。也在端口 8082 上尝试过
  • 是否有任何演示和详细步骤可以重现您的问题?

标签: powershell docker asp.net-core .net-core .net-core-2.1


【解决方案1】:

不确定这个问题是否仍然与您相关,但我也遇到了这个问题,并将我的解决方案留给其他人。我在下一个 docker 命令中使用了 PowerShell(与您的命令几乎相同,只是使用了内部端口 90 而不是 5000 并使用了 --rm退出时会自动移除容器的开关):

docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" microsoft/dotnet /bin/bash

之后,我得到了交互式 bash shell,当输入 dotnet run 时,我得到了与你相同的输出,并且无法通过 localhost:8080 访问我在容器中的站点。

我通过使用UseUrls 方法或--urls 命令行参数解决了它。它们(UseUrls 方法或 --urls 命令行参数)指示服务器应侦听请求的 IP 地址或主机地址以及端口和协议。以下是对我有用的解决方案的描述:

  1. Program.cs 中编辑 CreateWebHostBuildermethod,如下所示:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                   .UseUrls("http://+:90") //for your case you should use 5000 instead of 90
                    .UseStartup<Startup>();

如果需要,您可以使用以下语法.UseUrls("http://+:90;http://+:5000")指定多个端口
使用这种方法,您只需在 bash shell 中键入 dotnet run,然后您的容器就可以通过 localhost:8080 访问。

  1. 但是使用以前的方法,您会更改源代码的默认行为,您可能会忘记这些行为,然后可能应该在将来进行调试和修复。
    所以我更喜欢第二种方法而不更改源代码。在输入 docker 命令并获得交互式 bash shell 而不仅仅是 dotnet run 后,使用--urls 参数输入它,如下所示(在您的情况下使用端口 5000 而不是 90):

    dotnet run --urls="http://+:90"

  2. the documentation 中还有第三种方法,您可以使用ASPNETCORE_URLS 环境变量,但这种方法对我不起作用。我使用了下一个命令(带有 -e 开关):

docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" -e "ASPNETCORE_URLS=http://+:90" microsoft/dotnet /bin/bash

如果您在 bash 中键入 printenv,您会看到 ASPNETCORE_URLS 环境变量已传递给容器,但由于某种原因 dotnet run 忽略了它。

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2014-09-01
    • 1970-01-01
    • 2022-10-06
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多