2016-03-01 76 views
4

當Web應用程序在Docker中進行集裝箱化後,我無法讓我的ASP.NET Web應用程序獲取到我的瀏覽器。Docker上的ASP.NET無法將Web應用程序服務到瀏覽器

我正在運行Mac,並且我使用Visual Studio代碼創建了一個ASP.NET Web應用程序。這是一個基於yo aspnet「空應用」的簡單,現成的演示。當運行「本機」(Docker之外)時,此應用程序提供「Hello World!」到http://localhost:5000就好了。換句話說,運行dnx web啓動Web服務器(紅隼)和yeilds:

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

這是一件好事。現在進入Docker。我似乎已經成功構建了一個包含Web應用程序的Docker鏡像,當我在Docker中運行容器時,我從Kestrel獲得相同的輸出。還不錯,但是,我不能再加載「Hello World!」在我的瀏覽器頁面http://localhost:5000。相反,我得到一個ERR_CONNECTION_REFUSED。這很明顯,因爲由於Docker「間接」,沒有任何東西直接爲端口5000提供服務。換句話說,我認爲存在不正確的轉發配置,或者我認爲是誤解了尋址。

我相信端口轉發涉及這個過程。在我Dockerfile,我使用的是EXPOSE 5000我本以爲這允許我用這樣的運行命令我本地使用的端口號爲5000的映射到多克爾集裝箱港口5000:

docker run -i -t -p 5000:5000 container_name 

但是,這不是與http://localhost:5000的情況下(ERR_CONNECTION_REFUSED)。所以我發現Docker幾乎肯定不在localhost。當多克的負載,它說我已經注意到:

docker is configured to use the default machine with IP 192.168.99.100 

所以,我想我會嘗試http://192.168.99.100:5000,但同樣(容易混淆?)ERR_CONNECTION_REFUSED。接下來,我讀到一篇有趣的文章here,我能夠從建議的命令

docker inspect container_name | grep IPAddress 

該容器被分配"IPAddress": "172.17.0.2"

那麼確定,我想我會嘗試http://172.17.0.2:5000。而現在我們可能實際上正在某個地方,因爲我沒有使用ERR_CONNECTION_REFUSED,而是得到一個旋轉的沙漏和由此產生的超時。但仍然沒有「Hello World!」

我可能會丟失什麼?

+0

你可以發佈「碼頭端口」或你的容器嗎? – user2915097

+0

ASP是否正在運行並在容器中偵聽? – Auzias

+0

由於帶寬問題,我目前在將圖像上傳到Docker Hub時遇到問題。在回答第二個問題時,是的,Kestrel網絡服務器報告它正在運行並正在偵聽端口5000. – robbpriestley

回答

5

事實證明,如懷疑虛擬機192.168.99.100的IP地址可用的web應用程序172.17.0.2顯然是某種紅鯡魚。

真正的踢球者似乎是容器的默認「內部」 IP是0.0.0.0

this posting的優秀建議,我編輯的Dockerfile並指定了以下內容:

ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:5000"] 

因爲.. 。

這將使我們的web應用服務,從由泊塢窗提供的 端口轉發進來,默認爲0.0.0.0

端口映射請求是至關重要的主機的端口連接到容器的,但EXPOSE命令顯然是多餘的。現在,當我運行

docker run -i -t -p 80:5000 container_name 

我可以簡單地瀏覽到http://192.168.99.100(80端口是隱含的)

和中提琴!有我的「Hello World!」

1

除了使用http://0.0.0.0:5000您可以使用http://*.5000

ENTRYPOINT ["dnx", "web", "--server.urls", "http://*:5000"] 

,也可以包括這對運行時環境

"commands": { 
    "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004" 
}, 
    "web": ...... 

,並在dockerfile入口點可以

ENTRYPOINT ["dnx","-p","project.json","kestrel"] 
+1

事實上,事情已經改變了。你的例子不是最新的。通過對.NET Core 1.0的最新修訂,我們獲得正確設置的URL的方式是在Main()中的WebHostBuilder中指定.UseUrls(「http://0.0.0.0:5000」),然後在Dockerfile中指定I簡單說一下ENTRYPOINT [「dotnet」,「run」]。這顯然是高度縮寫的信息,但這是我在新版本公開發布後如何重新解決相同問題的基礎知識。 – robbpriestley

相關問題