Maintenant qu’on a vu les bases de Docker on va s’attarder sur la partie réseau de docker, le docker network.
Lorsque l’on installe docker, l’interface réseau docker0 est crée sur la machine hôte avec l’adresse IP 172.17.0.1/16, cette carte sert d’interface entre les conteneurs et la machine hôte.
La configuration réseau des conteneurs par défaut :
- sur le réseau 172.17.0.0/16
- avec une adresse IP non fixe (elle peut changer lors du redémarrage du conteneur)
- inter-joignable entre conteneurs
- En bridge (sur l’interface docker0)
Heureusement il est possible de modifier cela en créant ses propres docker network et/ou en utilisant certains paramètre lors de la création du conteneur.
Les commandes docker network
Dans un premier temps, on va voir ensemble ce que l’on peut faire avec les commandes docker network.
On peut lister les différents réseau avec la commande :
docker network ls
NETWORK ID NAME DRIVER SCOPE
9bd1ec6cf3a3 bridge bridge local
c17e3ce70088 host host local
6041bf4244c9 none null local
On remarque que par défaut 3 réseaux sont présent :
- le bridge que l’on a vu précédemment
- host : réplique la configuration exact de la machine hôte.
- none : aucune interface réseau, le conteneur est totalement isolé du réseau.
On réalise également que chaque réseau à un identifiant et un nom.
Jusque là on a simplement admiré la configuration réseau docker de base.
On va maintenant passé à la création.
Pour créer un réseau docker :
docker network create -d bridge --subnet 172.50.0.0/16 monnouveaureseau
Ici j’ai donc créé un nouveau réseau bridge (-d bridge) sur le réseau 172.50.0.0/16 avec comme nom « monnouveaureseau« , dans le futur on utilisera le nom « monnouveaureseau » pour faire référence à ce réseau.
Mais il faut savoir que cette création de réseau bridge à eu comme conséquence logique, la création d’une nouvelle interface réseau sur ma machine hôte lié à ce réseau.
Sur ma machine hôte :
9: br-dfe7499aa2c4: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a2:54:00:1c brd ff:ff:ff:ff:ff:ff
inet 172.50.0.1/16 brd 172.50.255.255 scope global br-dfe7499aa2c4
valid_lft forever preferred_lft forever
C’est cette carte qui servira d’interface entre ma machine et les conteneurs du réseau « monnouveaureseau« .
On peut voir afficher notre réseau « monnouveaureseau » en relançant la commande :
docker network ls
NETWORK ID NAME DRIVER SCOPE
9bd1ec6cf3a3 bridge bridge local
c17e3ce70088 host host local
dfe7499aa2c4 monnouveaureseau bridge local
6041bf4244c9 none null local
Tout comme pour les conteneurs et les images on peut inspecter les réseaux pour connaître toutes ses subtilités avec la commande :
docker inspect monnouveaureseau
[
{
"Name": "monnouveaureseau",
"Id": "dfe7499aa2c48bf2edc026d3d34432dbbbf82544054b308ae84074885db4fbbb",
"Created": "2021-03-04T20:36:12.22277833+01:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.50.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Ensuite si l’on souhaite supprimer notre nouveau réseau :
docker network rm monnouveaureseau
Et si l’on veut supprimer tous nos réseaux docker non utilisé :
docker network prune
Si l’on souhaite connecter un réseau à un conteneur en cours sans le recréer :
docker network connect monnouveaureseau alpine
Ici j’ai ajouté le réseau « monnouveaureseau » à mon conteneur alpine.
Pour vérifier que notre commande à bien fonctionner, on peut lancer :
docker exec -ti alpine ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
27: eth1@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:32:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.50.0.2/16 brd 172.50.255.255 scope global eth1
valid_lft forever preferred_lft forever
Une nouvelle carte réseau a été généré et configurée sur notre réseau « monnouveaureseau« .
À contrario pour déconnecter un réseau de notre conteneur on utilise :
docker network disconnect monnouveaureseau alpine
options réseau lors de la création d’un conteneur
On va maintenant s’attarder aux différentes options de docker run pour modifier la configuration de notre conteneur.
Les différentes options dont je vais te parler maintenant s’utilise lors de la création d’un conteneur avec la commande docker run.
Pour attribuer notre conteneur à notre réseau « monnouveaureseau » :
–network monnouveaureseau :
docker run -tid --name debian --network monnouveaureseau debian
Ajouter un hostname à notre conteneur :
--hostname nom_host
Pour attribuer une IPv4 :
--ip 172.50.0.10
on peut l’utiliser avec ou sans l’option –network, il faut juste s’assurer d’être dans la plage ip du réseau sélectionner.
Attribuer une IPv6 :
--ip6 2001:db8::33
Lier un conteneur à un autre :
--link nom_du_conteneur
Cette commande ajoute le conteneur dans /etc/hosts, le conteneur peut alors communiquer avec l’autre conteneur en passant par le nom du conteneur.
Il recommandé de passer par les noms de conteneur plutôt que par leurs adresses IP.
Cette commande est très utile si on a besoin de faire communiquer nos différents conteneurs entre eux.
Ajouter des hosts dans /etc/hosts (autre que des conteneurs):
--add-host nom_host:@ip
Ajouter le dns au conteneur :
--dns @ip_dns
Avec tout ça, je pense que tu es prêt à configurer tes propres docker network et tes conteneurs sur le réseau, si tu veux en savoir plus voici la documentation officielle de docker network.