无法联系Windows主机上的docker容器

无法联系Windows主机上的docker容器,docker,networking,windows-10,tcp-ip,Docker,Networking,Windows 10,Tcp Ip,tl;dr问题摘要: 应用程序在容器内成功启动,绑定到容器内的127.0.0.1:8080,并成功服务web请求,但仅在容器内 docker ps-a确认端口8080已暴露 当我请求IP地址(8080)时,我无法使用容器的实际IP地址从主机与应用程序通信 主机正在运行Windows 10 Windows防火墙已完全禁用以进行故障排除 为了进行故障排除,我创建了一个在dockers容器中运行的最简单的应用程序,一个F#/Suave应用程序,如下所示: open Suave [<Entry

tl;dr问题摘要:

  • 应用程序在容器内成功启动,绑定到容器内的127.0.0.1:8080,并成功服务web请求,但仅在容器内
  • docker ps-a确认端口8080已暴露
  • 当我请求IP地址(8080)时,我无法使用容器的实际IP地址从主机与应用程序通信
  • 主机正在运行Windows 10
  • Windows防火墙已完全禁用以进行故障排除
为了进行故障排除,我创建了一个在dockers容器中运行的最简单的应用程序,一个F#/Suave应用程序,如下所示:

open Suave
[<EntryPoint>]
let main args =

    startWebServer defaultConfig (Successful.OK "Hello World!")
    0
我无法连接到nor的“网站”,这显然是运行Windows的Docker用户的常见问题但是,解决方案似乎解决了internet上所有其他Windows用户的此问题,运行

docker inspect myapp
然后点击生成的IP地址,也不起作用。我得到:

在Chrome中同时点击和会让我“无法访问网站”

同样值得注意的是,当我跑步时

docker logs myapp
唯一的线路是

[17:43:21 INF] Smooth! Suave listener started in 73.476ms with binding 127.0.0.1:8080
作为猜测,我也尝试过

ipconfig

然后点击Docker NAT适配器的IP地址,但这也会导致无法访问站点

更新

另一个可能相关也可能不相关的观察结果是:许多在线教程建议,在Windows下,您需要直接连接到容器的IP地址,并通过运行

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp
这对我来说,总是产生:

当我开香草的时候

docker检查myapp

结果JSON的结构与推荐的查询不完全相同。我得到一个网桥节点,但没有nat节点:


您的应用程序说它已绑定到localhost:8080,但您正在发布端口80。停止容器,然后使用以下命令重新运行:

docker run -d -p 8080:8080 --name myapp aspnetapp

尝试在docker文件中添加以下行

ENV ASPNETCORE_URLS http://+:80 
EXPOSE 80 

参考资料:

我的集装箱应用程序需要侦听/绑定到0.0.0.0而不是127.0.0.1。

这似乎无法解决问题。我删除了我的容器,并在此处按照您的指示重新运行它,但仍然无法访问localhost:80或:8080上的站点,也无法访问
docker inspect
-报告的任一端口的IP地址,或
ipconfig
-报告的任一端口的IP地址。另外,
docker logs myapp
仍然显示应用程序正在正常启动,并绑定到容器中的端口8080。您不需要发布端口80。您的应用程序未在该端口上侦听。公开8080是正确的配置,应用程序应该记录更多的错误。如果我对docker配置做了一些错误,应用程序将不知道有什么错误需要记录。我是说,一旦您将配置更改为上面提到的8080:8080,您就不需要在docker上做任何其他事情了。您已经公开了应用程序声称要侦听的端口。为什么它不在该端口上侦听,或者无法为请求提供服务?这是只有您的应用程序才能跟踪的。我可以在容器中连接一个新的bash会话,并且该应用程序似乎也可以很好地为请求提供服务(
curl localhost:8080
),因此该应用程序似乎可以很好地为请求提供服务,docker似乎配置为公开相关端口。我将研究上面@pankaj kapare的防火墙建议。您的主机上是否启用了防火墙?我完全禁用了防火墙以响应您的提示,但仍然无法从容器外部访问容器内的应用程序。似乎无法解决问题。我打开容器并运行
printenv
,以确保更改生效。
ENV ASPNETCORE_URLS http://+:80 
EXPOSE 80