Docker Network

docker network

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.

Laisser un commentaire