Кто-нибудь знает, как докер решает, какая сетевая карта будет работать с сетью docker0? У меня есть узел с двумя интерфейсами (eth0 и ens34), однако только запросы, которые проходят через eth0, перенаправляются в контейнер.Как настроить Docker для работы с моим сетевым интерфейсом ens34 (вместо eth0)?
Когда моя виртуальная машина была предоставлена, а Docker был установлен, я начал очень глупый тест: я создал centos vm, установил netcat на него и зафиксировал изображение. Затем я начал контейнер демон прослушивает порт 8080. Я использовал:
docker -it -p 8080:8080 --name nc-server nc-server nc -vv -l 8080
Так что я попытался подключиться к контейнеру на порту 8080 с другого узла в одной и той же сети (в том же IP-адрес в качестве интерфейса ens34). Это не работает.
Принимая во внимание, что когда я отправил запрос с другого компьютера на IP-адрес из eth0, я увидел некоторую реакцию в контейнере (связь работала). Я «хвостовой» свою продукцию с:
docker logs -ft nc-server
Моим вывод с этим экспериментом: есть какая-то таинственная связь между eth0 (первичным NIC) и docker0 и запросами, посылаемыми в ens34 (10. ) интерфейс никогда не пересылаются в интерфейсы veth/docker0, только запросы, которые проходят через eth0 (9. *). Почему это?
Кроме того, я знаю, что могу сделать все работоспособным, если я использую --net = host, но я не хочу использовать это ... он не так или иначе чувствует себя, это стандартная практика использования Режим HOST в контейнерах Docker? Какие-либо оговорки по этому поводу?
-
UPDATE: мне удалось заставить его работать после отключения IPTables:
service iptables stop
Однако, я до сих пор не понимаю, что происходит. Информация ниже должна быть актуальной, чтобы понять, что происходит:
IFCONFIG
[[email protected] myuser]# ifconfig | grep -A 1 flags
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
--
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.21.18 netmask 255.255.255.0 broadcast 10.1.21.255
--
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 9.32.145.99 netmask 255.255.255.0 broadcast 9.32.148.255
--
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
--
veth8dbab2f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::3815:67ff:fe9b:88e9 prefixlen 64 scopeid 0x20<link>
--
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
NETSTAT
[[email protected] myuser]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 9.32.145.1 0.0.0.0 UG 0 0 0 eth0
9.32.145.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.1.21.0 0.0.0.0 255.255.255.0 U 0 0 0 ens34
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens34
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
фильтры
[[email protected] myuser]# iptables -t filter -vS
-P INPUT ACCEPT -c 169 106311
-P FORWARD ACCEPT -c 0 0
-P OUTPUT ACCEPT -c 110 13426
-N DOCKER
-N DOCKER-ISOLATION
-A FORWARD -c 0 0 -j DOCKER-ISOLATION
-A FORWARD -o docker0 -c 0 0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -c 0 0 -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -m physdev --physdev-is-bridged -c 0 0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -c 0 0 -j ACCEPT
-A DOCKER-ISOLATION -c 0 0 -j RETURN
физ
[[email protected] myuser]# iptables -t nat -vS
-P PREROUTING ACCEPT -c 28 4818
-P INPUT ACCEPT -c 28 4818
-P OUTPUT ACCEPT -c 8 572
-P POSTROUTING ACCEPT -c 8 572
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -c 2 98 -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -c 0 0 -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 8080 -c 0 0 -j MASQUERADE
-A DOCKER -i docker0 -c 0 0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -c 0 0 -j DNAT --to-destination 172.17.0.2:8080
Мысли?
Я перезапустил iptables, и теперь все работает. Но весь этот процесс до сих пор не ясен ... Я продолжу свои эксперименты. – theMarceloR
Он работает после запуска 'service iptables stop' :(то, что здесь происходит! – theMarceloR
Это указывает на правило брандмауэра (iptables), которое необходимо изменить/добавить. Попробуйте обновить свой вопрос с помощью вывода netstat - nr и две команды iptables выше, и я могу попытаться быть более конкретными. – BMitch