Docker上的ASP.NET没有将Web应用程序提供给浏览器

时间:2016-03-01 19:18:20

标签: asp.net http docker port

当网络应用程序在Docker中容器化时,我无法将我的ASP.NET Web应用程序提供给我的浏览器。

我正在运行Mac,并且我已经使用Visual Studio Code创建了一个ASP.NET Web应用程序。它是一个基于yo aspnet"空应用程序的简单,开箱即用的演示。"当奔跑"本地" (在Docker之外),这个应用程序服务于" Hello World!"到http://localhost:5000就好了。换句话说,运行dnx web启动Web服务器(Kestrel)和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的本地使用映射到Docker容器的端口5000:

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

http://localhost:5000ERR_CONNECTION_REFUSED)并非如此。所以我想到Docker几乎肯定不在localhost。我注意到Docker加载时,它说:

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,而是我得到一个旋转的沙漏和一个结果超时。但仍然没有#34; Hello World!"

我可能会遗失什么?

2 个答案:

答案 0 :(得分:5)

事实证明,Web应用程序 在虚拟机192.168.99.100的IP地址处可用。 172.17.0.2显然是某种红鲱鱼。

真正的踢球者似乎是容器的默认"内部" IP为0.0.0.0

根据this posting的优秀建议,我编辑了Dockerfile并指定了以下内容:

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

因为......

  

这将允许我们的Web应用程序提供来自的请求   Docker提供的端口转发,默认为0.0.0.0

端口映射对于将主机端口链接到容器是至关重要的,但EXPOSE命令显然是多余的。现在,当我跑

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

我可以简单地浏览到http://192.168.99.100(端口80是隐含的)

中提琴!那是我的" Hello World!"

答案 1 :(得分: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"]