2017-05-11 61 views
3

此問題與Windows網絡主題上的其他人類似,以及它們如何與Docker容器相關,但似乎無法找到解決我的確切問題的解決方案。無法訪問Docker Nanoserver容器Web應用程序

我正在爲一個新的預生成預發佈的.NET Core 1.1應用程序設置一個Docker容器。我有一個Dockerfile,它將應用程序構建到啓用了nanoserver/.NET Core 1.1的映像中,但我無法從Windows主機訪問正在運行的應用程序。

在由macOS/vmWare Fusion 8.5.1託管的Windows 10 Pro VM上使用:Docker for Windows 17.0.31-ce-win10(11972)。

鑑於以下Dockerfile

FROM microsoft/dotnet:1.1-runtime-nanoserver WORKDIR \app COPY \out . EXPOSE 80 EXPOSE 5000 ENTRYPOINT ["dotnet", "WebApi.dll"]

如果我使用命令docker run {image} -P 5000:5000我得到下面的輸出(從.NET 1.1核心的Hello World應用程序):

Hosting environment: Production Content root path: C:\app Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.

然後,在另一個終端窗口中,我發出以下命令:

docker inspect {container-name}在那裏我得到這個顯着的輸出:

"Networks": { "nat": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "246469d0fe2936d87c5a923 "EndpointID": "2401e38f20539ac9fe562e "Gateway": "172.20.64.1", "IPAddress": "172.20.76.30", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "00:15:5d:33:3e:7a" } }

我不能使用以下位置來訪問Web應用程序:

localhost:5000172.20.76.30:80172.20.76.30:5000

然而奇怪的是,如果我docker run microsoft/iis我可以訪問{container's IP}:80

鑑於上述情況,我做錯了什麼導致我的Web應用程序容器無法訪問Windows VM主機?我能夠得到ping 172.20.76.30的結果,而且我的容器能夠以ping 172.20.64.1(它的網關IP與Windows VM主機相對應),但就我已經能夠確認兩臺網絡主機之間的路徑而言,這是可行的。

最後,我會以觀察到的結果得出結論:應用程序在Windows VM上運行得非常好。我可以直接發佈完全相同的命令dotnet WebApi.dll,並在Chrome中使用localhost:5000訪問該網站。

+0

「nat」網絡使用什麼驅動程序?橋?主辦?空值? –

+0

nat網絡作爲內部網絡在Hyper-V中設置。請讓我知道,如果你正在尋找比這更詳細的信息(以及我可以找到它的地方)。感謝您的詢問! –

+0

好吧,docker虛擬局域網應該是內部的。如果你從終端執行'docker network ls'命令並查看你的「nat」網絡名稱下列出了哪個驅動程序。我相信你想被使用'bridge'司機 –

回答

0

找出解決方案。我將Dockerfile的基本圖像從FROM microsoft/dotnet:1.1-runtime-nanoserver更換爲FROM microsoft/aspnetcore:1.1.2-nanoserver,突然間一切正常。

我有點驚訝這個作品,因爲我可以從本地機器運行dotnet WebApi.dll沒有問題,但我很高興我找到了一個可以工作的圖像/標籤!

0

編輯

肯定是目前與Windows中的一個限制。

根據博客鏈接看起來像它的壞消息:Docker Loop Back For Windows Containers

目前,窗口容器只能通過其虛擬IP地址進行訪問。環回訪問尚不受支持。

+0

其實,根據您在我的OP中提供的輸出,NAT網絡正在使用「nat」驅動程序。當我發出'docker network rm nat'時,我得到'來自守護進程的錯誤響應:沒有一個是預定義的網絡並且不能被移除。' –

+0

當我嘗試創建一個新網絡時(例如'g'docker network create net1' )我得到'來自守護進程的錯誤響應:沒有找到插件' –

+0

我現在要運行這個dockerfile,看看我是否有同樣的問題。創建網絡之前,我還沒有看到過這個錯誤。 –

2

如果它開始工作,因爲你切換到aspnetcore圖像,那麼它可能是一個端口映射問題,而不是網絡。 aspnetcore基礎鏡像設置ASP.NET Core環境變量,它告訴Kestrel在端口80上偵聽,而不綁定到localhost:5000。最後一條語句的關鍵是localhost,除非你說別的,否則Kestrel只適用於本地流量。來自主機的流量不是本地的,所以它不會起作用。

如果你想使用dotnet圖像,而不是aspnetcore一個出於某種原因,那麼你可以設置ASPNETCORE_URL環境變量類似http://+:5000或任何與你想要的。

+0

Thanks for知識。我沒有意識到Kestrel只爲本地流量工作 - 這解釋了爲什麼它不起作用,儘管我的Dockerfile中有端口映射。 –

相關問題