【问题标题】:Cannot contact docker container on Windows host无法联系 Windows 主机上的 docker 容器
【发布时间】:2018-05-10 17:58:17
【问题描述】:

tl;dr 问题总结:

  • 应用程序在容器内成功启动,绑定到容器内的 127.0.0.1:8080,并成功处理 Web 请求,但仅限于容器内
  • docker ps -a 确认端口 8080 被暴露
  • 当我请求http://[ContainerIP地址]:8080时,无法使用容器的实际IP地址从主机与应用程序通信
  • 主机运行的是 Windows 10
  • Windows 防火墙已完全禁用以进行故障排除

为了解决问题,我创建了一个在 dockers 容器中运行的最简单的应用程序,一个 F# / Suave 应用程序,如下所示:

open Suave
[<EntryPoint>]
let main args =

    startWebServer defaultConfig (Successful.OK "Hello World!")
    0

效果很好,返回一个简单的“Hello World!”当我在本地运行它时。

要对应用程序进行容器化,我已按照“Dockerize a .NET Core application”处的说明进行操作,该说明指示我像

一样运行容器
$ docker run -d -p 8080:80 --name myapp aspnetapp

我无法连接到http://localhost:80http://localhost:8080 的“网站”,这显然是运行Windows 的Docker 用户的常见问题。 然而,似乎已经为互联网上的所有其他 Windows 用户解决了这个问题的解决方案,正在运行

docker inspect myapp

然后点击生成的 IPAddress,也不起作用。我明白了:

在 Chrome 中同时点击 http://172.17.0.2:80http://172.17.0.2:8080 会提示“无法访问站点。”

另外值得注意的是,当我运行时

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 地址,并通过运行获取该 IP 地址

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp

对我来说,总是产生:

当我运行香草时

docker 检查我的应用程序

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

【问题讨论】:

  • 您的主机上是否启用了防火墙?
  • 根据您的提示,我完全禁用了它,但仍然无法从容器外访问容器内的应用程序。

标签: docker networking windows-10 tcp-ip


【解决方案1】:

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

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

【讨论】:

  • 这似乎无法解决问题。我删除了我的容器并在此处按照您的说明重新运行它,但仍然无法访问 localhost:80 或 :8080 的站点,也无法访问任一端口的 docker inspect-reported IP 地址或 ipconfig-reported IP 地址在任一端口。此外,docker logs myapp 仍然显示应用程序正在正常启动并绑定到容器内的端口 8080。
  • 好吧,你不需要发布端口 80。你的应用程序没有在那个端口上监听。公开 8080 是正确的配置,应用程序应记录更多错误。
  • 如果我的 docker 配置有问题,应用程序将不知道记录有什么问题。
  • 我是说,一旦您将配置更改为 8080:8080,如上所述,您无需在 docker 上做任何其他事情。您已经公开了您的应用程序声称要侦听的端口。为什么它不在那个端口上监听,或者无法为请求提供服务?这是只有您的应用程序才能跟踪的内容。
  • 我可以在容器中连接一个新的 bash 会话,并且该应用程序似乎也可以很好地处理请求 (curl localhost:8080),因此该应用程序似乎可以很好地处理请求 并且 docker 似乎被配置为公开相关端口。我将研究上面的@pankaj-kapare 的防火墙建议。
【解决方案2】:

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

ENV ASPNETCORE_URLS http://+:80 
EXPOSE 80 

参考:https://www.sep.com/sep-blog/2017/02/20/hosting-asp-net-core-docker/

【讨论】:

  • 似乎无法解决问题。我冲入容器并运行printenv 以确保更改生效。
【解决方案3】:

我的容器化应用需要监听/绑定到 0.0.0.0 而不是 127.0.0.1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多