[英]Docker routing/reverse proxy issue, can't curl other container
我有一个docker主机在各个容器中运行2个web应用程序。 我在它们前面都有一个nginx容器设置作为反向代理。 对于指向此单个主机的不同子域,有两个dns条目,因此我可以通过app1.domain.com访问app 1,使用app2.domain.com访问app2。 此设置工作正常,每个应用程序都可以访问更广泛的世界。
但是,app2还需要能够对app1提供的webservices进行http调用。 出于某种原因,无法从app2容器中解析对http://app1.domain.com的http调用。 curl http://app1.domain.com
返回Failed to connect to app1.domain.com port 80: No route to host.
奇怪的是,我可以从app2的容器中ping app1.domain.com并成功解析为主机url。 我已经尝试在docker主机上使用service iptables stop
禁用iptables,这导致curl和ping命令简单地挂起一段时间,然后最终返回有关ping的未知主机的错误,并且无法解析curl的主机。
最后,我可以使用docker ip地址和端口从app2的容器卷曲到app1,虽然这不是一个理想的解决方案,因为它需要更改此应用程序的部署和配置方式,以便可以发现此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对话。 通过这种方式,您可以避免dns解析,因此会更快。
假设您以下列方式运行容器:
docker run --name app1 app1-image
docker run --name app2 --link app1 app2-image
现在,从app2容器中,您可以使用主机名'app1'访问app1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.