Я создал две сети докеров.
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
Я не уверен, что это правильный подход с точки зрения безопасности, но он делает то, что мне нужно.