Après l'installation du docker, vous disposez de 3 réseaux par défaut:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
J'essaie de garder cela simple. Donc, si vous démarrez un conteneur par défaut, il sera créé à l'intérieur du réseau du pont (docker0).
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
Dans le fichier docker de jenkins, les ports 8080
et 50000
sont exposés. Ces ports sont ouverts pour le conteneur sur son réseau de pont. Ainsi, tout ce qui se trouve à l'intérieur de ce réseau de pont peut accéder au conteneur sur le port 8080
et 50000
. Tout dans le réseau de pont est dans la plage privée de "Subnet": "172.17.0.0/16",
Si vous souhaitez y accéder de l'extérieur, vous devez mapper les ports avec -p 8080:8080
. Cela mappera le port de votre conteneur sur le port de votre serveur réel (le réseau hôte). Ainsi, accéder à votre serveur sur 8080
sera acheminé vers votre réseau de ponts sur le port 8080
.
Maintenant, vous avez également votre réseau hôte. Ce qui ne conteneurise pas la mise en réseau des conteneurs. Donc, si vous démarrez un conteneur dans le réseau hôte, il ressemblera à ceci (c'est le premier):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
La différence est avec les ports. Votre conteneur est maintenant à l'intérieur de votre réseau hôte. Donc, si vous ouvrez le port 8080
sur votre hôte, vous accéderez immédiatement au conteneur.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
J'ai ouvert le port 8080
dans mon pare-feu et quand j'accède maintenant à mon serveur sur le port, 8080
j'accède à mes jenkins. Je pense que ce blog est également utile pour mieux le comprendre.
--net=host
dans un Dockerfile?