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

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伐。

répondre à tous(3)
洪涛

Solution :
L'essence du paramètre de lien de docker est d'ajouter des règles à iptables et aux hôtes du conteneur. D'après ce qui précède, vous pouvez voir que les règles ont été ajoutées, mais pourquoi pas. Parce qu'avant, j'avais oublié d'ajouter le paramètre EXPOSE lors de l'écriture du Dockerfile (car j'ai toujours pensé que cette commande était inutile). En fait, EXPOSE ouvrira le port ce n'est pas simplement pratique pour utiliser la commande -P et la montrer aux développeurs. . de. Les règles ACCEPT d'iptables sont basées sur les ports, mais je ne les ai pas écrites dans EXPOSE, ce qui rendra le lien inutile. Les ports ouverts par les conteneurs Web généraux ou les conteneurs de base de données sont 3306, 80 et 443, mais aucun d'entre eux n'est ouvert. Par conséquent, ping et curl ne peuvent pas être transmis une fois le lien connecté, et le ping ne passe pas par les ports 80. 3306 et 443. Ainsi, même s’il réussit, il n’y aura pas de ping.

滿天的星座

Que ces conteneurs soient sous le même réseau de ponts

大家讲道理

Lorsque Docker démarre un conteneur, il crée par défaut un réseau indépendant pour celui-ci. Vous pouvez afficher le réseau actuel via docker network ls. Lorsque vous utilisez link, les deux doivent être placés sur le même réseau.
Si le conteneur A est démarré en premier

docker run A;

Redémarrer le conteneur B

docker run --link A:a --net A_default B
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal