W przypadku docker-compose
użycia sieci mostowej do utworzenia sieci prywatnej między kontenerami przyjęte rozwiązanie docker0
nie działa, ponieważ interfejs wyjściowy z kontenerów nie jest, docker0
ale jest to losowo generowany identyfikator interfejsu, taki jak:
$ 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
Niestety losowy identyfikator nie jest przewidywalny i będzie się zmieniał za każdym razem, gdy komponowanie musi odtworzyć sieć (np. Przy ponownym uruchomieniu hosta). Moim rozwiązaniem jest utworzenie sieci prywatnej w znanej podsieci i skonfigurowanie iptables
akceptacji tego zakresu:
Utwórz fragment pliku:
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"
Możesz zmienić podsieć, jeśli wymaga tego twoje środowisko. Dowolnie wybrałem 192.168.32.0/20
za pomocą, docker network inspect
aby zobaczyć, co było tworzone domyślnie.
Skonfiguruj iptables
na hoście, aby zezwalał na prywatną podsieć jako źródło:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
To najprostsza możliwa iptables
reguła. Możesz dodać inne ograniczenia, na przykład według portu docelowego. Nie zapomnij zachować reguł iptables, gdy będziesz zadowolony, że działają.
Zaletą tego podejścia jest powtarzalność, a zatem automatyzacja. Korzystam z template
modułu ansible, aby wdrożyć mój plik tworzenia z podstawieniem zmiennych, a następnie używam modułów iptables
i shell
, aby odpowiednio skonfigurować i zachować reguły zapory.