【发布时间】: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:80 或http://localhost:8080 的“网站”,这显然是运行Windows 的Docker 用户的常见问题。 然而,似乎已经为互联网上的所有其他 Windows 用户解决了这个问题的解决方案,正在运行
docker inspect myapp
然后点击生成的 IPAddress,也不起作用。我明白了:
在 Chrome 中同时点击 http://172.17.0.2:80 和 http://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