在同一个宿主机器上的两个容器如何可以访问到?


在一台host机器上(10.200.187.22)上有容器A(Web应用)、容器B(MySQL)。容器A的IP地址172.17.0.6 容器B的IP地址 172.17.0.7。

我需要在容器A启动的时候去访问容器B的数据库。我指定的jdbc url是10.200.187.22:49306 每次都是No route to host。我在容器A里面用telnet 10.200.187.22 49306 也是出现No route to host。如果用telnet 172.17.0.7 3306 是可以访问的。但是我们都知道的是每次容器启动的时候,容器的ip是随机分配的。

我想问的是,为什么我这样的写法,容器A里访问不了容器B?

--- PS ---
我在其他host机器上 mysql -h 10.200.187.22 -P 49306 是可以访问的。Docker版本是1.3.2。
已邀请:

samung8888

赞同来自:


谢谢大家 问题已经找到了~ 是host机器的防火墙的问题,关闭防火墙就好了

shlallen - DaoCloud软件工程师,合伙人

赞同来自: 田浩浩


用fig的话,有一些注意的地方,容器依赖关系。

一个mysql容器启动的过程主要包括两个步骤:安装mysql,启动mysql,两者加起来的时间接近10s,甚至不止,不同环境区别挺大;

而此时如果你的应用程序容器尝试去连接mysql的话,肯定会出错。

如果你真是这种情况的话,下面的链接可能对你有用

https://github.com/docker/fig/issues/899

萧遥吟 - 80后IT技术男

赞同来自:


你应该是没有开启icc功能吧

icebolt - Docker爱好者暗黑

赞同来自:


经测试,容器访问宿主开放的端口,是可以的。

容器的ip每次启动是会变更,你可以利用link的方式,直接打通容器访问。

samung8888

赞同来自:


<pre>
$ telnet 10.200.187.22 49306

Trying 10.200.187.22...
telnet: Unable to connect to remote host: No route to host
$ telnet 172.17.0.5 3306

Trying 172.17.0.5...
Connected to 172.17.0.5.
</pre>

shlallen - DaoCloud软件工程师,合伙人

赞同来自:


icc默认是开启的,而且你也是开启了,否则容器A使用172.17.0.7:3306是不能访问B的。

会不会是你把宿主机的网络配置得比较乱?

No route to host主要是网关,路由等内容配置有问题。

你首先尝试一下,使用你的A容器访问一下外网,确保你的容器A可以与外网联通。如果不行的话,说明很有可能你docker0与eth0(on the host)之间的iptables配置比较混乱。

samung8888

赞同来自:


在/etc/sysconfig/docker的内容

<pre>

Modify these options if you want to change the way the docker daemon runs

OPTIONS=--selinux-enabled -H tcp://0.0.0.0:4243 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry docker.cn --ip-forward=true
</pre>

samung8888

赞同来自:


我的fig.yml配置内容:

<pre>
db:
image: shuyun_dev/mysql:5.5
environment:
MYSQL_DATABASE: dockerize_ccms
MYSQL_USER: ccms
MYSQL_PASSWORD: ccms
ports:
- "49306:3306"
- "49353:22"

web:
build: ccms-source/.
ports:
- "49153:22"
- "49154:8181"
- "49155:5005"
links:
- db
</pre>

田浩浩 - wizmacau developer

赞同来自:


可以参考这篇文章(http://dockerone.com/article/137)

icebolt - Docker爱好者暗黑

赞同来自:


已经link了,可以直接用mysql的hostname进行连接。

samung8888

赞同来自:


容器访问外部已经设置了 --ip-forward=true的 在docker启动项上。

<pre>

sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1
</pre>

lyndon - Docker爱好者

赞同来自:


我感觉你关防火墙并不是真正的把问题解决了。你关了防火墙,你怎么再docker run或者其它操作。

要回复问题请先登录注册