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
清除
問題出在哪裡呢?或者說可能出現在哪裡呢
解決了:
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
再起容器B