Pour docker-compose
utiliser la mise en réseau de ponts pour créer un réseau privé entre les conteneurs, la solution acceptée docker0
ne fonctionne pas car l'interface de sortie des conteneurs ne l'est pas, docker0
mais c'est plutôt un identifiant d'interface généré de manière aléatoire, tel que:
$ 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
Malheureusement, cet identifiant aléatoire n'est pas prévisible et changera à chaque fois que la composition doit recréer le réseau (par exemple lors d'un redémarrage de l'hôte). Ma solution consiste à créer le réseau privé dans un sous-réseau connu et à configurer iptables
pour accepter cette plage:
Composez l'extrait de fichier:
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"
Vous pouvez modifier le sous-réseau si votre environnement l'exige. J'ai arbitrairement sélectionné 192.168.32.0/20
en utilisant docker network inspect
pour voir ce qui était créé par défaut.
Configurer iptables
sur l'hôte pour autoriser le sous-réseau privé comme source:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
C'est le plus simple possible iptables
règle . Vous pouvez souhaiter ajouter d'autres restrictions, par exemple par port de destination. N'oubliez pas de conserver vos règles iptables lorsque vous êtes satisfait qu'ils fonctionnent.
Cette approche a l'avantage d'être répétable et donc automatisable. J'utilise le template
module ansible pour déployer mon fichier de composition avec substitution de variables, puis j'utilise les modules iptables
et shell
pour configurer et conserver les règles de pare-feu, respectivement.