Для 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
На жаль, випадковий ідентифікатор не передбачуваний і змінюватиметься кожного разу, коли композиція повинна відтворити мережу (наприклад, при перезавантаженні хоста). Моє рішення для цього - створити приватну мережу у відомій підмережі та налаштувати 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модуль ansible для розгортання мого композиційного файлу зі змінною підміною, а потім використовую модулі iptablesта shellдля налаштування та збереження правил брандмауера відповідно.