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:://*.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"]