Contactez-nous

Gérer les réseaux Docker (docker network create, ls, inspect, rm, connect, disconnect)

Maîtrisez la gestion des réseaux Docker avec les commandes CLI : création, inspection, connexion/déconnexion de conteneurs et suppression de réseaux.

Introduction à la gestion des réseaux Docker via la CLI

Si les réseaux par défaut (`bridge`, `host`, `none`) couvrent certains besoins, la véritable puissance du système réseau de Docker réside dans la capacité à créer et gérer des réseaux personnalisés, dits "définis par l'utilisateur" (user-defined networks). Ces réseaux offrent une meilleure isolation, une découverte de services intégrée par nom de conteneur, et un contrôle plus fin sur la topologie réseau. Pour interagir avec ces réseaux ainsi qu'avec les réseaux par défaut, Docker fournit une suite de commandes regroupées sous `docker network`.

Maîtriser ces commandes est indispensable pour configurer la connectivité de vos applications multi-conteneurs, pour dépanner des problèmes réseau, ou simplement pour maintenir un environnement Docker propre et organisé. Nous allons explorer les commandes les plus importantes : `ls` pour lister, `create` pour créer, `inspect` pour examiner, `rm` pour supprimer, `connect` pour attacher un conteneur existant, `disconnect` pour le détacher, et `prune` pour le nettoyage.

Lister les réseaux disponibles : `docker network ls`

La première étape pour comprendre l'état actuel de votre environnement réseau Docker est de lister les réseaux existants. La commande `docker network ls` (ou sa forme longue `docker network list`) affiche tous les réseaux présents sur l'hôte Docker, y compris les réseaux par défaut créés lors de l'installation et ceux que vous avez créés.

L'exécution simple de la commande affiche généralement l'identifiant du réseau (NETWORK ID), son nom (NAME), le pilote réseau utilisé (DRIVER), et sa portée (SCOPE, indiquant généralement `local` pour les réseaux `bridge` ou `host` sur un seul hôte, ou `swarm` pour les réseaux `overlay`).

docker network ls

NETWORK ID     NAME              DRIVER    SCOPE
1a2b3c4d5e6f   bridge            bridge    local
7g8h9i0j1k2l   host              host      local
3m4n5o6p7q8r   my_custom_net     bridge    local
9s0t1u2v3w4x   none              null      local
...

Cette commande fournit un aperçu rapide mais essentiel. Vous pouvez utiliser des filtres avec l'option `-f` ou `--filter` pour affiner la liste, par exemple, en ne montrant que les réseaux utilisant un pilote spécifique (`--filter driver=bridge`) ou créés après une certaine date.

Créer des réseaux personnalisés : `docker network create`

La commande `docker network create` est fondamentale pour établir des environnements réseau isolés et configurés selon vos besoins. Par défaut, si aucun pilote n'est spécifié, elle crée un réseau de type `bridge`.

La syntaxe de base est simplement `docker network create `. Par exemple, pour créer un réseau bridge nommé `app-network` :

docker network create app-network

Vous pouvez spécifier explicitement le pilote avec l'option `-d` ou `--driver`. Ceci est nécessaire pour créer des réseaux d'autres types, comme `overlay` pour Swarm :

# Crée un réseau overlay pour Docker Swarm (nécessite d'être en mode Swarm)
docker network create --driver overlay my-overlay-net

Pour les réseaux `bridge` et `overlay`, vous pouvez exercer un contrôle plus fin sur l'adressage IP en utilisant des options comme :

  • `--subnet`: Définit le sous-réseau CIDR pour le réseau (ex: `--subnet=172.20.0.0/16`).
  • `--gateway`: Spécifie l'adresse IP de la passerelle pour ce sous-réseau (ex: `--gateway=172.20.0.1`).
  • `--ip-range`: Définit une plage d'adresses IP à allouer aux conteneurs au sein du sous-réseau (ex: `--ip-range=172.20.10.0/24`).
  • `--aux-address`: Permet de réserver des adresses IP spécifiques au sein du réseau.

Exemple de création d'un réseau bridge avec configuration IP personnalisée :

docker network create \
  --driver bridge \
  --subnet=192.168.42.0/24 \
  --gateway=192.168.42.1 \
  backend-net

Des options spécifiques au pilote peuvent être passées avec `-o` ou `--option`, par exemple pour activer le chiffrement sur un réseau `overlay` (`--opt encrypted`).

Examiner les détails d'un réseau : `docker network inspect`

Une fois un réseau créé ou pour comprendre la configuration d'un réseau existant, la commande `docker network inspect` est votre outil principal. Elle fournit une sortie détaillée au format JSON contenant toutes les informations de configuration et l'état actuel du réseau spécifié.

La syntaxe est `docker network inspect [...]`. Par exemple, pour inspecter notre réseau `app-network` :

docker network inspect app-network

La sortie JSON contiendra des informations cruciales :

  • `Name`: Le nom du réseau.
  • `Id`: L'identifiant unique.
  • `Driver`: Le pilote utilisé.
  • `Scope`: La portée (local, swarm).
  • `IPAM` (IP Address Management): Détails sur la configuration IP (Driver, Subnet, Gateway, IP Range, etc.).
  • `Containers`: Une liste des conteneurs actuellement connectés à ce réseau, avec leurs adresses IP et MAC respectives sur ce réseau.
  • `Options`: Les options spécifiques au pilote configurées.
  • `Labels`: Les éventuels labels associés au réseau.

L'inspection est indispensable pour le débogage, pour vérifier quels conteneurs sont connectés, ou pour comprendre la configuration IP d'un réseau avant d'y connecter de nouveaux services.

Connecter/Déconnecter un conteneur en cours : `connect` et `disconnect`

Il est possible de connecter ou déconnecter un conteneur déjà en cours d'exécution à un ou plusieurs réseaux Docker (à l'exception du réseau `host`). Ceci est utile pour ajouter dynamiquement une connectivité à un service ou pour l'isoler temporairement.

Pour connecter un conteneur, utilisez `docker network connect `. Le conteneur obtiendra une nouvelle interface réseau et une adresse IP sur ce réseau.

# Connecte le conteneur 'web-server' au réseau 'backend-net'
docker network connect backend-net web-server

Vous pouvez spécifier une adresse IP fixe pour le conteneur sur ce réseau avec `--ip ` ou lui donner un alias DNS spécifique sur ce réseau avec `--alias `.

Inversement, pour déconnecter un conteneur d'un réseau, utilisez `docker network disconnect `. L'interface réseau correspondante et l'adresse IP seront retirées du conteneur.

# Déconnecte 'web-server' du réseau 'backend-net'
docker network disconnect backend-net web-server

Un conteneur doit être connecté à au moins un réseau pour pouvoir communiquer (sauf s'il utilise le pilote `host` ou `none`). Vous ne pouvez pas déconnecter un conteneur de son dernier réseau sans l'arrêter.

Supprimer des réseaux : `docker network rm`

Lorsque vous n'avez plus besoin d'un réseau défini par l'utilisateur, vous pouvez le supprimer avec la commande `docker network rm` (ou `docker network remove`). Cela permet de garder votre environnement Docker propre.

La syntaxe est `docker network rm [...]`.

# Supprime les réseaux 'app-network' et 'old-test-net'
docker network rm app-network old-test-net

Une contrainte importante : Docker vous empêchera de supprimer un réseau si un conteneur (même arrêté) ou un service Swarm y est toujours connecté. Vous devez d'abord déconnecter ou supprimer tous les points d'extrémité (endpoints) attachés à ce réseau avant de pouvoir le supprimer. Cela évite de laisser des conteneurs dans un état réseau invalide.

Notez également que vous ne pouvez pas supprimer les réseaux prédéfinis (`bridge`, `host`, `none`).

Nettoyage des réseaux orphelins : `docker network prune`

Au fil du temps, notamment lors de tests ou de déploiements/suppressions fréquents, vous pouvez accumuler des réseaux définis par l'utilisateur qui ne sont plus utilisés par aucun conteneur. La commande `docker network prune` est un raccourci pratique pour supprimer tous les réseaux locaux non utilisés.

L'exécution de `docker network prune` vous demandera une confirmation avant de procéder, car l'opération est irréversible.

docker network prune

WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y

Deleted Networks:
network1
network2
...

Utilisez cette commande avec prudence, mais elle est très utile pour libérer des ressources et maintenir la clarté de votre configuration réseau. Vous pouvez utiliser l'option `--filter` pour affiner le nettoyage, par exemple en ne supprimant que les réseaux inutilisés créés avant une certaine date (`--filter "until=24h"`).