不能通过IP地址访问docker容器

我正在一个Django的应用程序,我决定把我所有的开发进入docker集装箱。 我有一个小问题:基本上,我有3个容器: – 应用程序(其中包含django代码) – postgres(其中包含数据库) – networking(这是一个nginx转发请求端口80到8000是端口使用的Django)我的问题是,我不能访问我的网站外的“应用程序”容器,我的nginx日志说:

2014/12/21 22:22:35 [error] 9#0: *9 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.59.3, server: _, request: "GET / HTTP/1.1", upstream: "http://172.17.0.62:8000/", host: "192.168.59.103" 

显然,nginx不能转发连接,因为“app”容器(192.168.59.103)不会侦听连接。 但是这不是真的,因为我附加到应用程序容器,我试图做一个curl请求,但: – 如果我curl "localhost:8000" ,它的作品(我得到的django欢迎页面 – 如果我做curl "http://172.17.0.62:8000/"不行的所以,我设法隔离问题并运行”路由“命令,显示我:

 Destination Gateway Genmask Flags Metric Ref Use Iface default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0 

他们,我走在boot2docker的SSH和键入“路线”,这是什么出来的:

 Destination Gateway Genmask Flags Metric Ref Use Iface default 10.0.2.2 0.0.0.0 UG 1 0 0 eth0 10.0.2.0 * 255.255.255.0 U 0 0 0 eth0 127.0.0.1 * 255.255.255.255 UH 0 0 0 lo 172.17.0.0 * 255.255.0.0 U 0 0 0 docker0 192.168.59.0 * 255.255.255.0 U 0 0 0 eth1 

所以显然我没有通往我的容器的好路由,但这很奇怪,因为我没有碰到它的任何configuration。 任何人都有线索?

几点意见:

web(这是一个nginx,将端口80上的请求转发到django使用的端口8000)

如果你只是用nginx从80转发到8080,为什么不用-p 80:8080来运行你的应用程序容器,它们在没有中间容器的情况下效果相同。

如果您希望nginx能够与应用程序容器交谈,则在运行--link APP_CONTAINER:ALIAS for nginx时,应用程序容器必须使用--link APP_CONTAINER:ALIAS开关链接到nginx容器。 然后你可以在nginx容器里查看/ etc / hosts里的ALIAS映射的IP地址。 每个docker集装箱都从docker桥获得自己的IP,并且需要进行链接才能进行通信。

Docker容器间通信使用iptables进行pipe理。 运行iptables -L来查看configuration的路由。 你可能不应该手动搞砸了。 链接容器通常pipe理这些事情相当好。