Docker dotnet运行端口未映射,Windows 10主机,Linux容器

时间:2018-12-14 11:50:45

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

我正在跟踪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   界面:“无法分配请求的地址”。

     

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

     

在IPv6环回上无法绑定到http://localhost:5000   界面:“无法分配请求的地址”。

     

托管环境:开发

     

内容根路径:/ app

     

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

     

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

     

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

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

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

有人可以发现我出了错吗?或有什么想法/建议?

1 个答案:

答案 0 :(得分:2)

不确定该问题是否仍然与您相关,但是我也遇到了此问题,因此将解决方案留给了其他人。我在下一个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 中编辑CreateWebHostBuilder方法,如下所示:
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 之后,使用--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环境变量已传递到容器,但由于某些原因 runnet 忽略了它。