찾다

 >  Q&A  >  본문

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일 전746

모든 응답(3)나는 대답할 것이다

  • PHP中文网

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

    해결책:
    docker의 링크 매개변수의 핵심은 iptables와 컨테이너의 호스트에 규칙을 추가하는 것입니다. 위에서 보면 규칙이 추가된 것을 볼 수 있는데 왜 안 됩니까? 이전에는 Dockerfile을 작성할 때 EXPOSE 매개변수를 추가하는 것을 잊어버렸습니다.(항상 이 명령이 쓸모없다고 생각했기 때문입니다.) 실제로 EXPOSE는 -P 명령을 사용하여 개발자에게 표시하는 것이 단순히 편리하지는 않습니다. . 의. iptables의 ACCEPT 규칙은 포트를 기반으로 하지만 EXPOSE에 작성하지 않았으므로 링크가 쓸모 없게 됩니다. 일반 웹컨테이너나 DB컨테이너가 열어놓은 포트는 3306, 80, 443인데 모두 열려있지 않아서 링크 연결 후 ping과 컬이 통하지 않고, 80번 포트를 통해서도 ping이 되지 않습니다. 3306, 443. 따라서 성공하더라도 ping이 발생하지 않습니다.

    회신하다
    0
  • 滿天的星座

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

    이러한 컨테이너를 동일한 브리지 네트워크에 두세요

    회신하다
    0
  • 大家讲道理

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

    Docker가 컨테이너를 시작하면 기본적으로 독립적인 네트워크가 생성됩니다. docker network ls을 통해 현재 네트워크를 볼 수 있습니다. link을 사용하는 경우 둘 다 동일한 네트워크에 배치되어야 합니다.
    컨테이너 A가 먼저 시작되는 경우

    으아악

    컨테이너 B 다시 시작

    으아악

    회신하다
    0
  • 취소회신하다