Docker路由/反向代理问题,不能curl其他容器

我有一个单一的docker主机在单个容器内运行2个Web应用程序。 我有一个nginx容器设置在他们作为一个反向代理作为他们的前面。 有两个DNS条目指向这个单一的主机不同的子域名,所以我可以达到应用程序1与app1.domain.com和app2与app2.domain.com。 这个设置工作正常,每个应用程序都可以访问更广泛的宇宙。

但是,app2也需要能够对由app1提供的web服务进行http调用。 出于某种原因,http : //app1.domain.com的http调用不能从app2容器中parsing。 curl http://app1.domain.com返回Failed to connect to app1.domain.com port 80: No route to host. 奇怪的是,我可以从app2的容器中ping通app1.domain.com,并成功parsing为主机的url。 我已经尝试在docker主机上禁用iptables与service iptables stop ,并导致curl和ping命令只是简单地挂一段时间,最后返回一个关于未知主机的ping错误,无法parsing主机的curl。

最后,我可以使用docker的ip地址和端口从app2的容器curl到app1,尽pipe这不是一个理想的解决scheme,因为它需要改变这个app的部署和configuration方式,以便可以发现这个ip地址和端口。

更新: iptables -n -L -v -x输出

  Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- eth1 * 10.191.192.0/18 0.0.0.0/0 124 6662 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 3 120 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 141668 14710477 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5432 252325 512668022 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 31 2635 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 5496 331240 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 623 37143 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 437791 334335762 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0 438060 347940196 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 680992 61107377 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 356 24168 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 604 packets, 125207 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * eth1 0.0.0.0/0 10.191.192.0/18 124 6662 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 Chain DOCKER (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:81 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:443 2191 156283 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:80 0 0 ACCEPT tcp -- docker0 docker0 172.17.0.60 172.17.0.7 tcp dpt:3000 0 0 ACCEPT tcp -- docker0 docker0 172.17.0.7 172.17.0.60 tcp spt:3000 

app1 docker ip:172.17.0.7 app2 docker ip:172.17.0.60

您可以链接您的docker集装箱,然后使用链接直接与app2内的app1交谈。 这样可以避免DNSparsing,因此会更快。

假设您按以下方式运行容器:

docker run --name app1 app1-image

docker run --name app2 --link app1 app2-image

现在从app2容器中,您可以访问app1的主机名'app1'