Docker上的ASP.NET不提供Web应用程序到浏览器

当Web应用程序在Docker中进行容器化时,我无法让我的ASP.NET Web应用程序获取到我的浏览器。

我正在运行Mac,并使用Visual Studio代码创buildASP.NET Web应用程序。 这是一个简单的,现成的演示,它基于yo aspnet “Empty Application”。 当运行“本机”(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。 我似乎已经成功地构build了一个包含Web应用程序的Docker镜像,当我在Docker中运行容器时,我得到了Kestrel的相同输出。 也不错,但是,我不能再加载“Hello World!” 页面在我的浏览器在http:// localhost:5000 。 相反,我得到一个ERR_CONNECTION_REFUSED 。 这相当明显,因为由于Docker“间接”,没有任何东西直接用于端口5000了。 换句话说,我认为有一个不正确的转发configuration,或者我认为是误解了寻址。

我相信端口转发涉及到这个过程。 在我的Dockerfile中,我正在使用一个EXPOSE 5000 ,我认为它允许我使用如下的运行命令将本地端口5000的使用映射到Docker容器的端口5000:

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

但是, http:// localhost:5000 ( ERR_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 。 接下来,我在这里阅读了一篇有趣的文章,我可以从build议的命令中确定

 docker inspect container_name | grep IPAddress 

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

所以,我想我会尝试http://172.17.0.2:5000 。 而现在,我们可能实际上正在某个地方,因为而不是一个ERR_CONNECTION_REFUSED ,我得到一个旋转沙漏和由此产生的超时。 但仍然没有“Hello World!”

我可能会错过什么?

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

真正的kicker似乎是容器的默认“内部”IP为0.0.0.0

遵循这篇文章的出色build议,我编辑了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!”

除了使用http://0.0.0.0:5000,你可以使用http&#xFF1A://*.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"]