iptables - docker无法指定容器相连
伊谢尔伦
伊谢尔伦 2017-04-27 09:01:47
0
3
692

docker配置:

root@ubuntu> ps -ef | grep docker
root xxxxx /usr/bin/dockerd -H fd:// -b=br0 --icc=false --iptables=true

先起一个web主机:
docker run -d --name web -p 8080:80 php-fpm:5.4

再起一个test主机测试连接:
docker run -dit --name test --link web:web blackhole/ubuntu:0.1 bash

查看iptables filter的表:

root@ubuntu> sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (0 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            192.168.100.2        tcp dpt:80
ACCEPT     tcp  --  192.168.100.3        192.168.100.2        tcp dpt:80
ACCEPT     tcp  --  192.168.100.2        192.168.100.3        tcp spt:80
ACCEPT     tcp  --  192.168.100.3        192.168.100.2        tcp dpt:443
ACCEPT     tcp  --  192.168.100.2        192.168.100.3        tcp spt:443
ACCEPT     tcp  --  192.168.100.3        192.168.100.2        tcp dpt:22
ACCEPT     tcp  --  192.168.100.2        192.168.100.3        tcp spt:22

进入test容器内部:

sudo docker exec -it test bash
root@00585b9efea8:/# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
192.168.100.2    web 2cec3235f5fa
192.168.100.3    00585b9efea8
root@00585b9efea8:/# ping web
PING web (192.168.100.2): 56 data bytes
^C--- web ping statistics ---
12 packets transmitted, 0 packets received, 100% packet loss
root@00585b9efea8:/# ping 192.168.100.2
PING 192.168.100.2 (192.168.100.2): 56 data bytes
^C--- 192.168.100.2 ping statistics ---
12 packets transmitted, 0 packets received, 100% packet loss
root@00585b9efea8:/# curl web
^C
root@00585b9efea8:/# curl http://192.168.100.2:80
^C

指定容器相连的三个条件:--icc=fasle --iptables=true --link上面都已经满足了。为了防止意外,再第一步之前还执行了iptables -F清除

问题出在哪里呢?或者说可能出现在哪里呢

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(3)
洪涛

解决了:
docker的link参数的本质是在iptables和容器的hosts添加规则,从上面可以看到规则已经添加进去了,但是为什么不行呢。因为之前的我,在写Dockerfile的时候忘记加EXPOSE参数(因为我一直觉得这个命令没用),实际上,EXPOSE是会开放端口的,他不是单纯的方便-P命令的使用及给开发人员看的。iptables的ACCEPT规则是基于端口的,而我在EXPOSE里没有写,会导致link没有任何用处。而一般的web容器或者db容器开放的端口是3306和80还有443端口,可是一个都没开放,导致link连接后无法ping、curl通,而且ping走的也不是80、3306、443端口。所以即使成功了,也不会ping通。

滿天的星座

让这些容器都在同一桥接网络下

大家讲道理

docker启动容器时默认为其创建独立网络,可以通过docker network ls 查看当前的网络。当使用link时,需要将两者置于同一网络。
如先起容器A

docker run A;

再起容器B

docker run --link A:a --net A_default B
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!