docker配置:
root@ubuntu> ps -ef | grep docker
root xxxxx /usr/bin/dockerd -H fd:// -b=br0 --icc=false --iptables=true
先起一個(gè)web主機(jī):docker run -d --name web -p 8080:80 php-fpm:5.4
再起一個(gè)test主機(jī)測試連接: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
進(jìn)入test容器內(nèi)部:
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
指定容器相連的三個(gè)條件:--icc=fasle --iptables=true --link上面都已經(jīng)滿足了。為了防止意外,再第一步之前還執(zhí)行了iptables -F
清除
問題出在哪里呢?或者說可能出現(xiàn)在哪里呢
小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。
解決了:
docker的link參數(shù)的本質(zhì)是在iptables和容器的hosts添加規(guī)則,從上面可以看到規(guī)則已經(jīng)添加進(jìn)去了,但是為什么不行呢。因?yàn)橹暗奈?,在寫Dockerfile的時(shí)候忘記加EXPOSE參數(shù)(因?yàn)槲乙恢庇X得這個(gè)命令沒用),實(shí)際上,EXPOSE是會開放端口的,他不是單純的方便-P命令的使用及給開發(fā)人員看的。iptables的ACCEPT規(guī)則是基于端口的,而我在EXPOSE里沒有寫,會導(dǎo)致link沒有任何用處。而一般的web容器或者db容器開放的端口是3306和80還有443端口,可是一個(gè)都沒開放,導(dǎo)致link連接后無法ping、curl通,而且ping走的也不是80、3306、443端口。所以即使成功了,也不會ping通。
docker啟動容器時(shí)默認(rèn)為其創(chuàng)建獨(dú)立網(wǎng)絡(luò),可以通過docker network ls
查看當(dāng)前的網(wǎng)絡(luò)。當(dāng)使用link
時(shí),需要將兩者置于同一網(wǎng)絡(luò)。
如先起容器A
docker run A;
再起容器B
docker run --link A:a --net A_default B