[英]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.