Назад | Перейти на главную страницу

Маршрутизация между разными сетями докеров на одном хост-компьютере

Я создал две сети докеров.

docker network create --subnet=172.18.0.0/16 Docker_network_1
docker network create --subnet=172.19.0.0/16 Docker_network_2

На каждом из них я запускаю два разных контейнера:

docker run --rm -it --name Container_1 --net Docker_network_1  alpine /bin/sh
docker run --rm -it --name Container_2 --net Docker_network_2  alpine /bin/sh

Контейнер_1 имеет IP 172.18.0.2 тогда как Container_2 имеет IP 172.19.0.2.

Из Контейнера_1 я могу ping IP-адрес интерфейса докера 172.19.0.1 который принадлежит Docker_network_2 но я не могу пинговать Container_2 IP 172.19.0.2.

Я не понимаю, почему, поскольку "маршрутизация" на моем хост-компьютере кажется правильной:

#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    1024   0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-ea28cf2d7108
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-244606ad6705

Следим за ответом @user. Более безопасный способ - добавить правила, позволяющие сетям взаимодействовать друг с другом, вместо того, чтобы сбрасывать все данные.

Вот что сработало для меня:

sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o docker0 -i othernet -j ACCEPT
sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o othernet -i docker0 -j ACCEPT

Мне еще предстоит найти способ сделать это автоматически, без взлома.

Сети Docker не предназначены для маршрутизации между собой, они намеренно изолированы, чтобы вы могли создавать группы приложений, которые могут взаимодействовать только друг с другом. Я подозреваю, что это выполняется в правилах iptables, но не цитируйте меня по этому поводу.

Однако вы можете добавить контейнер в несколько сетей. Вручную это делается с помощью docker network connect Docker_network_2 Container_1 после создания контейнера (вы можете разделить команду запуска на команду создания и запуска, если вам нужно подключиться к сети до запуска точки входа).

Docker compose полезен для соединения нескольких контейнеров в разных сетях. Он позволяет вам определять каждую из сетей, к которой принадлежит каждый контейнер, устраняя необходимость запускать несколько docker network connect команды.

Я решил проблему, удалив DOCKER-ISOLATION цепочка, которую Docker устанавливает в iptables:

# iptables --flush DOCKER-ISOLATION

Я не уверен, что это правильный подход с точки зрения безопасности, но он делает то, что мне нужно.