无法通过IP地址访问docker容器

时间:2014-12-21 22:31:32

标签: routes containers docker

我正在开发一个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

显然我没有通往我的容器的良好路线,但这很奇怪,因为我没有触及它的任何配置。有人有线索吗?

1 个答案:

答案 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来查看配置的路由。你可能不应该手动搞乱这个。链接容器通常可以很好地管理这些事情。