我正在开发一个django应用程序,我决定将所有开发人员移动到docker容器中。我有一个小问题: 基本上,我有3个容器: - app(持有django代码) - postgres(包含数据库) - web(这是一个nginx,它将来自端口80的请求转发到8000,这是django使用的端口) 我的问题是我无法从“app”容器外部访问我的网站,我的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)不会监听连接。但那不是真的,因为我附加到app容器并尝试发出curl请求,但是:
- 如果我curl "localhost:8000"
,它可以工作(我得到了django欢迎页面
- 如果我curl "http://172.17.0.62:8000/"
它不起作用
所以,我设法隔离了问题,并运行“route”命令向我显示:
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并键入“route”,这就是出现的结果:
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
显然我没有通往我的容器的良好路线,但这很奇怪,因为我没有触及它的任何配置。有人有线索吗?
答案 0 :(得分:-1)
一些评论:
web(这是一个nginx,它将来自端口80的请求转发到8000,这是django使用的端口)
如果您使用nginx只是为了从80转到8080,为什么不用-p 80:8080来运行您的app容器,它们在没有中间容器的情况下具有相同的效果。
如果您希望nginx能够与应用容器对话,则在运行针对nginx的docker run时,必须使用--link APP_CONTAINER:ALIAS
开关将应用容器链接到nginx容器。然后,您可以查看nginx容器中的/ etc / hosts以查找ALIAS映射的IP。每个docker容器从docker bridge获取自己的IP,并且需要链接以便进行通信。
使用iptables管理Docker容器间通信。运行iptables -L来查看配置的路由。你可能不应该手动搞乱这个。链接容器通常可以很好地管理这些事情。