# Réseau Docker Un **réseau Docker** permet aux conteneurs de communiquer entre eux et avec l’extérieur (hôte ou Internet). Docker crée et gère certains réseaux automatiquement, mais il est aussi possible d’en définir de nouveaux pour contrôler l’isolation et la connectivité. --- ## Types de réseaux par défaut Docker installe trois réseaux de base : | Réseau | Description | |---------------|-----------------------------------------------------------------------------| | **bridge** | Réseau privé interne par défaut. Les conteneurs connectés peuvent communiquer entre eux. | | **host** | Le conteneur partage directement la pile réseau de l’hôte (pas de NAT). | | **none** | Le conteneur n’a aucune interface réseau. | Exemple : ```bash docker network ls ``` --- ## Réseau *bridge* - Réseau local interne créé automatiquement par Docker. - Les conteneurs obtiennent une adresse IP privée et peuvent communiquer via cette passerelle. - Par défaut, ils ne se résolvent pas par nom → il faut créer un **réseau bridge personnalisé** pour que la résolution DNS fonctionne. Exemple : ```bash docker run -d --name web --network bridge nginx ``` --- ## Réseau *host* - Le conteneur partage **exactement le réseau de la machine hôte**. - Pas d’isolation réseau, pas de NAT. - Avantage : performance (moins de latence). - Inconvénient : moins de sécurité et risque de conflit de ports. Exemple : ```bash docker run -d --network host nginx ``` --- ## Réseau *none* - Le conteneur est totalement isolé du réseau. - Seul `lo` (localhost) est présent. - Utile pour des traitements 100% hors ligne. Exemple : ```bash docker run -d --network none alpine sleep 3600 ``` --- ## Réseaux personnalisés (bridge) On peut créer ses propres réseaux pour améliorer l’organisation et la communication entre services. ```bash docker network create monreseau docker run -d --name db --network monreseau mysql docker run -d --name web --network monreseau nginx ``` ![image](images/docker_network_bridge.png) > Les conteneurs `db` et `web` peuvent communiquer entre eux par leur **nom** grâce au DNS intégré de Docker. --- ## Réseaux overlay Un **réseau overlay** permet de connecter des conteneurs situés sur **plusieurs hôtes différents**. Il repose sur une surcouche réseau (VXLAN) qui encapsule le trafic entre machines. ![image](images/docker_network_overlay.png) - Nécessite **Docker Swarm** ou un autre orchestrateur (ex. Kubernetes avec CNI). - Les conteneurs connectés à un overlay se voient comme s’ils étaient sur le même LAN, même s’ils tournent sur des hôtes différents. - Géré automatiquement par Swarm pour les services distribués. Exemple (avec Swarm actif) : ```bash docker network create -d overlay monreseau_overlay docker service create --name web --network monreseau_overlay nginx docker service create --name db --network monreseau_overlay mysql ``` --- ## Commandes essentielles ```bash # Lister les réseaux docker network ls # Inspecter un réseau docker network inspect monreseau # Connecter un conteneur à un réseau existant docker network connect monreseau web # Déconnecter un conteneur docker network disconnect monreseau web ``` --- ## Bonnes pratiques - Utiliser des **réseaux bridge personnalisés** pour bénéficier de la résolution DNS. - Séparer les réseaux front-end (web) et back-end (base de données) pour limiter la surface d’exposition. - Préférer `bridge` plutôt que `host`, sauf besoin spécifique de performance. - Documenter les ports exposés pour éviter les conflits. - Pour un déploiement multi-hôtes, utiliser **overlay** avec un orchestrateur. - Tester l’isolation réseau (`ping`, `curl`) pour valider la configuration.