Retour au cours

réseaux docker : communication interconteneurs

Objectifs

  • Comprendre les concepts de base du réseau dans Docker pour l’isolation et la communication.
  • Connaître les principaux types de réseaux (drivers) : bridge, host et none.
  • Créer et gérer un réseau “bridge” personnalisé pour faire communiquer des conteneurs.
  • Connecter des conteneurs à un réseau et vérifier leur communication par nom.

L’isolation réseau par défaut

Par défaut, Docker fournit une isolation réseau forte. Un conteneur ne peut pas communiquer avec un autre conteneur, ni avec la machine hôte, sauf si vous l’y autorisez explicitement. Cette isolation est une fonctionnalité de sécurité clé.

Les principaux drivers réseau

1. bridge (le pont)

C’est le driver par défaut. Docker crée un réseau privé virtuel sur votre machine. Chaque conteneur attaché à ce réseau obtient sa propre adresse IP interne.

  • Réseau bridge par défaut : Si vous lancez des conteneurs sans spécifier de réseau, ils sont attachés à un réseau bridge par défaut. La communication entre eux est possible mais déconseillée (via leur IP interne qui peut changer).
  • Réseau bridge personnalisé : C’est la bonne pratique. En créant votre propre réseau, vous obtenez une meilleure isolation et, surtout, un service de découverte par nom (DNS). Les conteneurs sur le même réseau personnalisé peuvent se “trouver” et communiquer en utilisant simplement leur nom.

2. host (l’hôte)

Avec ce driver, le conteneur partage directement l’interface réseau de la machine hôte. Il n’y a plus d’isolation réseau.

  • Avantage : Performance maximale (pas de couche de virtualisation réseau).
  • Inconvénient : Moins de sécurité. Le conteneur peut accéder à tous les services tournant sur localhost de l’hôte. À utiliser avec précaution.

3. none (aucun)

Le conteneur est complètement isolé du réseau. Il a une interface de “loopback” (lo) mais aucune interface externe. C’est utile pour des conteneurs qui effectuent des tâches de traitement en batch et n’ont pas besoin de communiquer.

Utiliser les réseaux personnalisés

C’est ce que vous ferez le plus souvent (et c’est ce que docker-compose fait pour vous automatiquement).

Étape 1 : Créer un réseau

docker network create mon_super_reseau

Étape 2 : Lancer des conteneurs sur ce réseau

# On lance un premier conteneur (une base de données)
docker run -d --name ma_db --network mon_super_reseau postgres:15-alpine

# On lance un deuxième conteneur (une application)
docker run -it --name mon_app --network mon_super_reseau bash

Étape 3 : Vérifier la communication

Vous êtes maintenant dans le shell du conteneur mon_app. Vous pouvez communiquer avec le conteneur ma_db en utilisant son nom.

# À l'intérieur du conteneur 'mon_app'
# On peut "pinger" le service 'ma_db' par son nom
ping ma_db
# PING ma_db (172.19.0.2): 56 data bytes
# 64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.082 ms

La résolution DNS a fonctionné !

Commandes utiles

  • docker network ls : Lister tous les réseaux Docker sur votre machine.
  • docker network create <nom_reseau> : Créer un nouveau réseau (de type bridge par défaut).
  • docker network inspect <nom_reseau> : Afficher des informations détaillées sur un réseau, y compris les conteneurs qui y sont connectés.
  • docker network rm <nom_reseau> : Supprimer un réseau.
  • docker network connect <reseau> <conteneur> : Connecter un conteneur en cours d’exécution à un réseau supplémentaire.
  • docker network disconnect <reseau> <conteneur> : Le déconnecter.

Bonnes pratiques

  • Créez toujours un réseau bridge personnalisé pour votre application. Ne vous fiez pas au réseau par défaut. Cela garantit une meilleure isolation et la découverte par nom.
  • Utilisez docker-compose pour vos projets multi-conteneurs ; il gère la création du réseau pour vous.
  • N’exposez publiquement (-p) que les ports qui doivent être accessibles de l’extérieur (ex: le port de votre serveur web). Les communications entre services (ex: entre le web et la base de données) doivent rester sur le réseau privé Docker.

Exercices

  1. Créez et inspectez :

    • Créez un nouveau réseau nommé test-net.
    • Utilisez docker network ls pour vérifier qu’il est bien créé.
    • Utilisez docker network inspect test-net pour voir ses détails.
  2. Lancez deux conteneurs :

    • Lancez un conteneur Nginx nommé web1 sur le réseau test-net.
    • Lancez un conteneur busybox en mode interactif (-it) nommé debug sur le même réseau. docker run -it --name debug --network test-net busybox sh
  3. Testez la communication :

    • Depuis le shell du conteneur debug, exécutez ping web1. Vous devriez voir que la communication fonctionne.
    • Essayez d’exécuter wget -O - http://web1. Vous devriez recevoir le code HTML de la page d’accueil de Nginx.
  4. Nettoyez :

    • Quittez le conteneur debug (exit).
    • Arrêtez et supprimez les deux conteneurs (web1 et debug).
    • Supprimez le réseau test-net.