簡體   English   中英

Docker dotnet運行端口未映射,Windows 10主機,Linux容器

[英]Docker dotnet run port not mapping, windows 10 host, linux container

我正在使用https://app.pluralsight.com/library/courses/docker-web-development/table-of-contents ,它使用較舊的microsoft / aspnetcore-build映像,但是我正在運行core 2.1,因此我m使用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]

使用創建日期2018-12-14 10:41:13Z,激活日期2018-12-14 10:41:13Z和到期日期2019-03-14 10創建密鑰{5445e854-c1d9-4261-82f4-0fc3a7543e0a} 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”

我也嘗試了幾種不同的端口組合,但結果相同。

誰能發現我出了錯? 或有什么想法/建議?

不知道這個問題是否仍然與您相關,但是我也遇到了這個問題,因此將我的解決方案留給了其他人。 我在下一個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 ,然后您的容器即可通過localhost:8080進行訪問。

  1. 但是使用以前的方法,您可以更改源代碼的默認行為,您可以將其忘記,然后在將來進行調試和修復。
    因此,我更喜歡第二種方法而不更改源代碼。 在鍵入docker命令並獲取交互式bash shell而不是dotnet run之后 ,請使用--urls參數鍵入以下內容(在您的情況下,使用端口5000而不是90):

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

  2. 文檔中,還有第三種方法,您可以使用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運行忽略了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM