搜尋

首頁  >  問答  >  主體

iptables - docker無法指定容器相連

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清除

問題出在哪裡呢?或者說可能出現在哪裡呢

伊谢尔伦伊谢尔伦2768 天前745

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-27 09:03:47

    解決了:
    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通。

    回覆
    0
  • 滿天的星座

    滿天的星座2017-04-27 09:03:47

    讓這些容器都在同一橋接網路下

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-27 09:03:47

    docker啟動容器時預設為建立獨立網絡,可以透過docker network ls 查看当前的网络。当使用link時,需要將兩者置於同一網路。
    如先起容器A

    docker run A;

    再起容器B

    docker run --link A:a --net A_default B

    回覆
    0
  • 取消回覆