Для 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
модули для настройки и сохраняются правила брандмауэра, соответственно.