当网络应用程序在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: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
。接下来,我阅读了一篇有趣的文章here,我可以从建议的命令
docker inspect container_name | grep IPAddress
为容器分配了"IPAddress": "172.17.0.2"
所以,我想我会尝试http://172.17.0.2:5000。现在我们可能实际上到了某个地方,因为而不是ERR_CONNECTION_REFUSED
,而是我得到一个旋转的沙漏和一个结果超时。但仍然没有#34; Hello World!"
我可能会遗失什么?
答案 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"]