Pour que le réseau des containers Docker fonctionne, il faut de la translation d'adresse. Docker fait donc le travail tout seul au lancement ... Cependant si vous avez déjà paramétré iptables sur votre poste, Docker va court-circuiter tout ça sans vous prévenir.

Il faut donc dire a docker de ne pas toucher au firewall.

Pour cela, ajouter dans le fichier /etc/default/docker la ligne :

DOCKER_OPTS="--iptables=false"

Docker ne placera plus de règles iptables lui même. Mais vos containers n'ont plus accès à internet ....

Pour rétablir leur accès, voici ce qu'il faut ajouter deux règles iptables :

la première fait une translation d'adresse sortante, en mappant votre réseau Docker sur votre ip sortante de votre hôte docker, exemple :

-A POSTROUTING -s 172.16.0.0/16 ! -o docker0 -j SNAT --to-source 10.0.0.1

la deuxième règle autorise votre interface docker0 à se connecter à votre réseau local :

-A INPUT -i docker0 -j ACCEPT

Attention au placement de ces règles dans votre firewall, car rappel : la première règle qui correspond est appliquée !

Voila c'est tout ce qu'il faut savoir pour avoir un docker fonctionnel, tout sage qui ne parasite pas son hôte. Bien sur, il faut adapter et étendre ce concept à votre plan ip de containers et même aux différents types de réseaux docker que vous utilisez.