Для docker-composeиспользования моста сети для создания частной сети между контейнерами Принятым решения с использованием docker0не работает , потому что интерфейс выхода из контейнеров не , docker0но вместо этого он случайно сгенерированный идентификатора интерфейса, такие как:
$ ifconfig
br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.1 netmask 255.255.240.0 broadcast 192.168.47.255
К сожалению, этот случайный идентификатор не предсказуем и будет меняться каждый раз, когда compose должен воссоздавать сеть (например, при перезагрузке хоста). Мое решение состоит в том, чтобы создать частную сеть в известной подсети и настроить iptablesдля принятия этого диапазона:
Создать файл сниппета:
version: "3.7"
services:
mongodb:
image: mongo:4.2.2
networks:
- mynet
# rest of service config and other services removed for clarity
networks:
mynet:
name: mynet
ipam:
driver: default
config:
- subnet: "192.168.32.0/20"
Вы можете изменить подсеть, если этого требует ваша среда. Я произвольно выбрал 192.168.32.0/20с помощьюdocker network inspect чтобы увидеть, что было создано по умолчанию.
Настройте iptablesна хосте, чтобы разрешить частную подсеть в качестве источника:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Это самое простое из возможных iptablesправил. Вы можете добавить другие ограничения, например, по порту назначения. Не забывайте сохранять свои правила iptables, когда вы счастливы, что они работают.
Преимущество этого подхода в том, что он повторяется и, следовательно, автоматизирован. Я использую анзибль - х templateмодуль для развертывания моего файла с созданием сообщения подстановки переменной , а затем использовать iptablesи shellмодули для настройки и сохраняются правила брандмауэра, соответственно.