Для 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
для налаштування та збереження правил брандмауера відповідно.