【发布时间】:2016-12-15 18:37:45
【问题描述】:
我真的不明白这里发生了什么。我只是想从一个 docker 容器内部执行一个 http 请求,通过主机,使用 主机的公共 ip,在 发布的端口上执行一个 http 请求。
这是我的设置。我有我的开发机器。我有一个带有两个容器的 docker 主机。 CONT_A 在端口 3000 上侦听并发布 Web 服务。
DEV-MACHINE
HOST (Public IP = 111.222.333.444)
CONT_A (Publish 3000)
CONT_B
在我的开发机器上(完全不同的机器)
我可以毫无问题地卷曲
curl http://111.222.333.444:3000 --> OK
当我通过 SSH 连接到主机时
我可以毫无问题地卷曲
curl http://111.222.333.444:3000 --> OK
当我在 CONT_B 内执行时
不可能,只是超时。 Ping 没问题...
docker exec -it CONT_B bash
$ curl http://111.222.333.444:3000 --> TIMEOUT
$ ping 111.222.333.444 --> OK
为什么?
Ubuntu 16.04、Docker 1.12.3(默认网络设置)
【问题讨论】:
-
我认为这可能是因为 Docker 如何使用 IPTables & Bridge Network 处理网络。我必须查一下,但我猜你提供的 IP 地址可能是从主机看到的 IP 地址,而不是在 docker 网络中分配的“内部 IP”。 ping 可能解析的原因是因为它解析到 docker 主机(而不是容器)。但是 docker 实现这一点的方法是不在容器 A 中发布端口,而是制作一个覆盖网络docs.docker.com/engine/userguide/networking。
-
@RikNauta 我使用的 IP 地址是 公共主机 ip。当然,除非它与内部 docker 网络发生冲突,否则应该始终正确解决。这是一个
104....IP 地址。 -
应该可以。 docker 运行一个用户态代理进程来监听主机并将 tcp 连接转发到容器中。在 Docker 1.11 中是否同样有效?您是否在 docker 守护程序上将
userland-proxy设置为 false? -
@Matt 我还没有测试过 Docker 1.11,我不确定 userland-proxy。我没有碰过它,所以我假设它是默认的。有趣的是,当我用谷歌搜索“userland-proxy”时,我发现了这个github.com/docker/docker/issues/21860
-
很确定这一直是容器无法与自己主机上的暴露端口通信的情况。如果 iptables、nat/mangle 规则或 docker-proxy 未配置为开箱即用地支持这一点,也不会感到惊讶。因为你可以直接从容器到容器,所以这对我来说从来都不是一个值得调试的问题。
标签: docker