无法联系 Windows 主机上的 docker 容器
Cannot contact docker container on Windows host
tl;dr 问题总结:
- 应用程序在容器内成功启动,绑定到容器内的 127.0.0.1:8080,并成功为 Web 请求提供服务,但仅限于容器内
- docker ps -a 确认8080端口被暴露
- 当我请求 http://[Container IP 地址时,我无法使用容器的实际 IP 地址从主机与应用程序通信]:8080
- 主持人是运行宁Windows10
- 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 nor http://localhost:8080 的 "website",这显然是 Docker 用户 运行 宁 Windows 的常见问题。 然而,解决方案似乎已经为互联网上的所有其他 Windows 用户解决了这个问题,运行ning
docker inspect myapp
然后点击生成的 IP 地址,也不起作用。 我得到:
在 Chrome 中同时击中 http://172.17.0.2:80 and http://172.17.0.2:8080 会得到 "Site can't be reached."
同样值得注意的是,当我 运行
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 地址,并通过 [=105= 获取该 IP 地址]宁
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp
对我来说,总是会产生:
当我 运行 香草
docker 检查 myapp
生成的 JSON 与推荐查询的结构不完全相同。我得到一个 bridge 节点,但没有 nat 节点:
你的应用说它绑定到 localhost:8080,但你正在发布端口 80。停止容器,然后重新运行:
docker run -d -p 8080:8080 --name myapp aspnetapp
尝试在 docker 文件
中添加以下行
ENV ASPNETCORE_URLS http://+:80
EXPOSE 80
参考:https://www.sep.com/sep-blog/2017/02/20/hosting-asp-net-core-docker/
我的容器化应用程序需要 listen/bind 到 0.0.0.0 而不是 127.0.0.1。
tl;dr 问题总结:
- 应用程序在容器内成功启动,绑定到容器内的 127.0.0.1:8080,并成功为 Web 请求提供服务,但仅限于容器内
- docker ps -a 确认8080端口被暴露
- 当我请求 http://[Container IP 地址时,我无法使用容器的实际 IP 地址从主机与应用程序通信]:8080
- 主持人是运行宁Windows10
- 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 nor http://localhost:8080 的 "website",这显然是 Docker 用户 运行 宁 Windows 的常见问题。 然而,解决方案似乎已经为互联网上的所有其他 Windows 用户解决了这个问题,运行ning
docker inspect myapp
然后点击生成的 IP 地址,也不起作用。 我得到:
在 Chrome 中同时击中 http://172.17.0.2:80 and http://172.17.0.2:8080 会得到 "Site can't be reached."
同样值得注意的是,当我 运行
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 地址,并通过 [=105= 获取该 IP 地址]宁
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp
对我来说,总是会产生:
当我 运行 香草
docker 检查 myapp
生成的 JSON 与推荐查询的结构不完全相同。我得到一个 bridge 节点,但没有 nat 节点:
你的应用说它绑定到 localhost:8080,但你正在发布端口 80。停止容器,然后重新运行:
docker run -d -p 8080:8080 --name myapp aspnetapp
尝试在 docker 文件
中添加以下行ENV ASPNETCORE_URLS http://+:80
EXPOSE 80
参考:https://www.sep.com/sep-blog/2017/02/20/hosting-asp-net-core-docker/
我的容器化应用程序需要 listen/bind 到 0.0.0.0 而不是 127.0.0.1。