Lors de l’installation de Docker, trois réseaux sont automatiquement créés :
Il est possible de les voir en utilisant la commande « docker network ls »
Le réseau Bridge est présent sur tous les hôtes Docker.
Par exemple, nous allons créer un conteneur de manière interactive sans spécifier de réseau particulier.
Affichons maintenant sa configuration réseau
Le conteneur a bien une carte réseau et une configuration réseau.
En effet, à chaque fois que l’on va créer un conteneur une adresse IP lui sera attribuée via DHCP et si lors de sa création on ne spécifie pas un réseau particulier, il sera connecté par défaut et automatiquement au Bridge de l’hôte.
On pourra constater dans la configuration de l’hôte le réseau « Docker0 » qui correspond au réseau « Bridge » de Docker avec comme adresse de réseau 172.17.0.1/16.
On constate également la création d’un « Network Namespace » appelé ici « vethle87a66 » permettant de faire le lien entre le conteneur et le Bridge de Docker « Docker0 »
Si l’on créé un nouveau conteneur, un autre « Network Namespace » sera créé pour ce nouveau conteneur, lui aussi permettant de faire le lien avec le Bridge Docker0 (toujours si aucun réseau n’est indiqué lors de la création du conteneur)
En utilisant le réseau Bridge de Docker, les conteneurs pourront avoir un accès vers l’extérieur.
En effet, si l’on effectue un ping sur 8.8.8.8 cela fonctionnera.
Mais pourquoi les conteneurs ont-ils un accès réseau externe ?
Si on tape la commande suivante
iptables -t nat -L
On verra que du NAT par MASQUERADE est mis en place automatiquement et par défaut pour le réseau 172.17.0.1/16, permettant aux différents conteneur de sortir.
Cependant le NAT effectué ne permettra pas aux conteneurs d’être contactés depuis l’extérieur.
Dans ce cas, comment se connecter sur les conteneur depuis l’extérieur ?
Prenons par exemple la création d’un conteneur nginx permettant la mise en place d’un serveur Web.
Comme nous l’avions vu précédemment dans cette documentation , il faudra simplement se connecter à l’adresse IP de l’hôte en précisant le port 8080 que nous avons indiqué lors de la création du conteneur.
En effectuant cette commande et en faisant un mappage de port, en réalité il est mis en place une redirection dans la configuration d’Iptables que nous pouvons à présent retrouver en tapant les commandes :
iptables -L
et
iptables -t nat -L
Pour conclure, par défaut les différents conteneurs qui sont créés sans configuration réseau spécifique sont tous sur le réseau Bridge de Docker et peuvent communiquer à l’aide de NAT.
Si vous utilisez le réseau « host » pour un conteneur, la pile réseau de ce conteneur ne sera pas isolée de celle de l’hôte Docker et le conteneur ne se verra pas attribuer sa propre adresse IP. En effet, le conteneur utilisera la carte réseau de l’hôte ce qui signifie que la configuration réseau du conteneur sera identique à celle de l’hôte.
Pour configurer le type de réseau d’un conteneur, il faudra ajouter à la commande « docker run » l’option « --network nom_du_réseau ».
Prenons par exemple la création d’un conteneur dont le réseau sera « host »
Vérifions sa configuration réseau
Nous sommes dans la configuration réseau du conteneur et pourtant nous pouvons voir qu’il possède l’adresse IP que l’hôte mais également le réseau « Docker0 » ainsi que les différents « Network Namespace » des autres conteneurs.
La configuration réseau est donc parfaitement identique à celle de l’hôte.
Comme le nom l’indique, le réseau « none » permettra à un conteneur d’être dépourvue d'interface réseau.
Ce conteneur ne comporte qu’une interface de bouclage local, c’est-à-dire aucune interface réseau externe.
En plus des 3 types de réseaux par défaut, il est possible de créer nos propres réseaux pour Docker ou d’interagir avec eux.
En effet, la commande « docker network » propose différentes options particulièrement intéressantes :
Pour créer un réseau il faudra utiliser cette commande :
docker network create "nom_du_réseau"
Attention : par défaut le type de réseau qui sera créé sera de type « Bridge ». De plus, lors de la création d’un réseau, celui-ci sera totalement indépendant des autres réseaux et son adresse sera incrémentée de 1 au niveau du deuxième octet (172.17.0.0/16 puis 172.18.0.0/16 etc.)
Pour chaque création d’un nouveau réseau de type « Bridge », on retrouvera un nouveau qui sera créé dans la configuration réseau de l’hôte.
Attention : Il ne sera cependant pas possible de créer un réseau de type « host » car une seule instance de ces types de réseaux est autorisé. Les commandes « docker network create --driver null NOM » et « docker network create --driver host NOM » ne fonctionneront pas
Comme nous l’avons vu précédemment pour lister les réseaux il faudra utiliser la commande
docker network ls
On remarquera la présence des différents réseau que nous venons de créer
Pour supprimer un réseau la commande à utiliser sera celle-ci :
docker network rm "nom_du_réseau"
Il ne sera plus présent dans la liste des réseaux disponibles
Ni même dans la configuration réseau de l’hôte
Il est également possible de connecter un conteneur à un réseau ciblé.
Avant de commencer vérifions les conteneurs que nous avons à disposition
Nous allons prendre par exemple le conteneur « web_serveur » qui se trouve par défaut dans le réseau appelé « bridge ».
Pour connecter ce conteneur à un autre réseau la commande à entrer sera celle-ci :
docker network connect "nom_du_réseau" "nom_du_conteneur"
Attention : cette commande ajout le conteneur dans un réseau, elle ne supprime pas les autres réseaux du conteneur. Le conteneur « web_serveur » sera donc dans deux réseaux : « bridge » ET « LAB »
De la même manière que nous avons connecté un conteneur à un réseau il sera possible de déconnecter un conteneur du réseau auquel il appartient.
La commande est celle-ci :
docker network disconnect "nom_du_réseau" "nom_du_conteneur"
Attention : cette commande déconnecte le conteneur d’un réseau. S’il s’agit du seul réseau auquel appartenait le conteneur, ce dernier n’appartiendra plus à aucun des réseaux disponibles. Il faudra impérativement le reconnecter à un réseau
Pour avoir les informations de configuration d’un réseau, il faudra utiliser la commande suivante
docker network inspect "nom_du_réseau"
Toutes les informations concernant ce réseau seront alors listées
Par exemple l’adresse du réseau et de la passerelle
Mais également tous les conteneurs qui appartiennent à ce réseau avec leurs adresses IP, etc.
Pour supprimer automatiquement tous les réseaux qui ne sont pas utilisés par au moins un conteneur la commande sera la suivante :
Docker network prune
Une confirmation sera demandée avant la suppression des réseaux.