Introduction
Les conteneurs Docker sont des environnements isolés qui exécutent des applications sans interférer avec le système hôte. Par défaut, Docker crée des réseaux virtuels pour isoler le trafic des conteneurs, mais parfois, vous pouvez souhaiter que votre conteneur utilise directement le réseau de l'hôte.
Dans ce lab (atelier), vous apprendrez à configurer les conteneurs Docker pour qu'ils utilisent le réseau hôte. Vous explorerez les différences entre le réseau de pont par défaut et le réseau hôte, comprendrez quand utiliser le réseau hôte et mettrez en œuvre des exemples pratiques pour constater les avantages par vous-même.
Comprendre les types de réseaux Docker
Avant de configurer les conteneurs pour qu'ils utilisent le réseau hôte, explorons les différents types de réseaux disponibles dans Docker et comprenons leur utilité.
Vérifier les réseaux Docker disponibles
Commençons par examiner les réseaux Docker par défaut sur votre système :
Ouvrez un terminal dans votre environnement LabEx.
Exécutez la commande suivante pour lister tous les réseaux Docker :
docker network ls
Vous devriez voir une sortie similaire à celle-ci :
NETWORK ID NAME DRIVER SCOPE
1234567890ab bridge bridge local
0987654321cd host host local
abcdef123456 none null local
Docker propose trois réseaux par défaut :
bridge: Le réseau par défaut pour les conteneurshost: Utilise directement le réseau de l'hôtenone: Aucun réseau (les conteneurs sont isolés)
Comprendre le réseau de pont par défaut
Lorsque vous exécutez un conteneur sans spécifier de réseau, Docker le connecte au réseau de pont par défaut. Cela crée une interface réseau virtuelle pour chaque conteneur et permet aux conteneurs de communiquer entre eux et avec le réseau externe.
Voyons cela en action :
- Exécutez un simple conteneur nginx avec le réseau de pont par défaut :
docker run --name nginx-bridge -d -p 8080:80 nginx:alpine
- Vérifiez les paramètres réseau du conteneur :
docker inspect nginx-bridge --format '{{json .NetworkSettings.Networks}}' | jq
Vous devriez voir une sortie indiquant que le conteneur est connecté au réseau de pont et a son propre adresse IP.
- Vérifiez que le conteneur est accessible depuis l'hôte en effectuant une requête sur le port mappé :
curl http://localhost:8080
Vous devriez voir le contenu HTML de la page de bienvenue de nginx.
Cela montre comment fonctionne le réseau de pont - le conteneur a son propre adresse IP, et le port 80 du conteneur est mappé sur le port 8080 de l'hôte.
Exécuter un conteneur en mode réseau hôte
Maintenant, explorons comment exécuter un conteneur en utilisant le réseau hôte et comprenons en quoi cela diffère du réseau de pont.
Utilisation du réseau hôte
Lorsque vous utilisez le mode réseau hôte, le conteneur partage directement l'espace de noms réseau de l'hôte. Cela signifie :
- Le conteneur utilise l'adresse IP de l'hôte
- Aucun mappage de ports n'est nécessaire
- Le conteneur peut accéder à toutes les interfaces réseau de l'hôte
- Des conflits de ports peuvent survenir si le conteneur tente d'utiliser des ports déjà utilisés sur l'hôte
Exécutons un conteneur avec le réseau hôte :
- Arrêtez et supprimez le précédent conteneur nginx pour libérer le port 80 :
docker stop nginx-bridge
docker rm nginx-bridge
- Exécutez maintenant un nouveau conteneur nginx en utilisant le réseau hôte :
docker run --name nginx-host --network host -d nginx:alpine
Notez que nous n'avons pas besoin de spécifier le flag -p pour le mappage de ports, car le conteneur utilisera directement la pile réseau de l'hôte.
- Vérifiez les paramètres réseau du conteneur :
docker inspect nginx-host --format '{{json .NetworkSettings.Networks}}' | jq
Vous verrez que le conteneur est connecté au réseau hôte.
- Accédez directement au serveur nginx sur le port 80 de l'hôte :
curl http://localhost:80
Vous devriez voir le contenu HTML de la page de bienvenue de nginx.
Comprendre les différences
Comparons les deux approches :
Avec le réseau de pont (par défaut) :
- Le conteneur a son propre adresse IP
- Un mappage de ports est requis pour accéder aux services du conteneur
- Une couche réseau supplémentaire pour l'isolation
- Plus sécurisé en raison de l'isolation
Avec le réseau hôte :
- Le conteneur utilise l'adresse IP de l'hôte
- Aucun mappage de ports n'est nécessaire
- Accès direct aux interfaces réseau de l'hôte
- Meilleures performances réseau
- Moins d'isolation entre le conteneur et l'hôte
Comparaison des performances et du comportement des réseaux
Maintenant, effectuons quelques tests pour voir les différences pratiques entre le réseau de pont et le réseau hôte dans Docker.
Test des performances réseau
Tout d'abord, créons un conteneur avec un réseau de pont et un autre avec un réseau hôte, puis comparons leurs performances.
- Arrêtons et supprimons le précédent conteneur nginx :
docker stop nginx-host
docker rm nginx-host
- Créons un nouveau conteneur avec un réseau de pont pour tester les performances :
docker run --name bridge-test -d --network bridge nginx:alpine
- Créons un autre conteneur avec un réseau hôte :
docker run --name host-test -d --network host nginx:alpine
- Utilisons
docker execpour exécuter un simple test réseau dans chaque conteneur :
Pour le conteneur avec le réseau de pont :
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
Pour le conteneur avec le réseau hôte :
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
Comparez les temps d'exécution. En général, le conteneur avec le réseau hôte aura des performances légèrement meilleures car il évite la couche réseau supplémentaire.
Examen des interfaces réseau
Examinons les interfaces réseau dans les deux conteneurs :
- Pour le conteneur avec le réseau de pont :
docker exec bridge-test ip addr show
Vous verrez que ce conteneur a ses propres interfaces réseau, isolées de l'hôte.
- Pour le conteneur avec le réseau hôte :
docker exec host-test ip addr show
Vous remarquerez que ce conteneur a exactement les mêmes interfaces réseau que le système hôte, y compris toutes les interfaces réseau physiques.
- Comparez avec les interfaces réseau de l'hôte :
ip addr show
Les interfaces du conteneur avec le réseau hôte devraient correspondre à celles du système hôte.
Compréhension des conflits de ports
Lorsque vous utilisez le réseau hôte, des conflits de ports peuvent survenir si le conteneur tente d'utiliser des ports déjà utilisés sur l'hôte :
- Arrêtez et supprimez tous les conteneurs en cours d'exécution :
docker stop bridge-test host-test
docker rm bridge-test host-test
- Démarrez un service sur l'hôte en utilisant le port 8080 :
python3 -m http.server 8080 &
- Essayez maintenant d'exécuter un conteneur avec le réseau hôte qui souhaite également utiliser le port 8080 :
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
Vous devriez voir une erreur car le port 8080 est déjà utilisé sur l'hôte.
- Nettoyez le serveur HTTP Python :
kill %1
Cela démontre un inconvénient potentiel du réseau hôte - vous devez être attentif aux conflits de ports avec l'hôte.
Cas d'utilisation pratiques du réseau hôte
Maintenant, explorons quelques cas d'utilisation pratiques où le réseau hôte est avantageux, et mettons en œuvre un exemple concret.
Quand utiliser le réseau hôte
Le réseau hôte est particulièrement utile dans les scénarios suivants :
Applications critiques en termes de performances : Lorsque les performances réseau sont cruciales et que vous souhaitez éviter la surcharge du réseau de pont.
Outils de surveillance réseau : Les applications qui doivent capturer ou analyser le trafic réseau sur l'hôte.
Applications utilisant plusieurs ports : Lorsque vous avez des services qui utilisent de nombreux ports ou une allocation dynamique de ports.
Accès aux interfaces réseau matérielles : Lorsque les conteneurs ont besoin d'un accès direct aux interfaces réseau physiques.
Mise en œuvre d'un outil de surveillance réseau avec le réseau hôte
Mettons en œuvre un exemple pratique : un simple conteneur de surveillance réseau qui a besoin d'accéder aux interfaces réseau de l'hôte.
- Tout d'abord, exécutons un outil de surveillance réseau en utilisant le réseau hôte :
docker run --name netmon --network host -d alpine:latest sleep infinity
Ce conteneur s'exécutera indéfiniment, nous permettant d'exécuter des commandes à l'intérieur.
- Maintenant, capturons un peu de trafic réseau à l'intérieur du conteneur :
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 10 -i any -n"
La commande ci-dessus :
- Installe l'outil tcpdump dans le conteneur
- Capture 10 paquets depuis n'importe quelle interface
- Affiche la sortie numérique (pas de résolution de noms d'hôtes)
Étant donné que nous utilisons le réseau hôte, le conteneur peut accéder directement à toutes les interfaces réseau de l'hôte.
- Vérifions si nous pouvons capturer le trafic vers un service hôte spécifique :
## Ouvrez une nouvelle fenêtre de terminal et générez un peu de trafic
curl http://localhost:80 &
## Dans le terminal d'origine, exécutez :
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 5 -i any port 80 -n"
Vous devriez voir le conteneur capturer le trafic HTTP sur le port 80.
Cela démontre comment le réseau hôte permet au conteneur d'accéder aux interfaces réseau de l'hôte et de capturer le trafic, ce qui serait plus difficile avec le réseau de pont.
Utilisation du réseau hôte dans un fichier Docker Compose
Pour ceux qui utilisent Docker Compose, vous pouvez configurer un service pour utiliser le réseau hôte dans votre fichier docker-compose.yml :
version: "3"
services:
web:
image: nginx:alpine
network_mode: "host"
Cette configuration ferait en sorte que le service web utilise la pile réseau de l'hôte.
Considérations de sécurité et meilleures pratiques
Lorsque vous utilisez le réseau hôte avec des conteneurs Docker, il est important de comprendre les implications en matière de sécurité et de suivre les meilleures pratiques.
Implications de sécurité du réseau hôte
L'utilisation du réseau hôte réduit l'isolement entre le conteneur et le système hôte. Cela a plusieurs implications en matière de sécurité :
Isolement réseau réduit : Les conteneurs avec un réseau hôte peuvent accéder à toutes les interfaces réseau et ports de l'hôte.
Conflits de ports potentiels : Les services dans le conteneur peuvent entrer en conflit avec les services en cours d'exécution sur l'hôte.
Surface d'attaque accrue : Si un conteneur est compromis, l'attaquant peut avoir un accès plus direct au réseau hôte.
Meilleures pratiques pour l'utilisation du réseau hôte
Suivez ces meilleures pratiques lorsque vous utilisez le réseau hôte :
- Limitez les privilèges du conteneur : Même lorsque vous utilisez le réseau hôte, suivez le principe du moindre privilège :
## Run a container with host networking but drop capabilities
docker run --name secure-host-net --network host --cap-drop ALL --cap-add NET_ADMIN -d alpine:latest sleep infinity
N'utilisez le réseau hôte que lorsque cela est nécessaire : Utilisez le réseau hôte uniquement pour les conteneurs qui en ont vraiment besoin, et non comme un choix par défaut.
Audits de sécurité réguliers : Surveillez plus attentivement les conteneurs utilisant le réseau hôte pour détecter les problèmes potentiels de sécurité.
Utilisez des systèmes de fichiers en lecture seule lorsque cela est possible :
## Run a container with host networking and read-only filesystem
docker run --name readonly-host-net --network host --read-only -d alpine:latest sleep infinity
- Nettoyez les conteneurs inutilisés :
## Remove all stopped containers (cleanup)
docker container prune -f
Nettoyage de votre environnement de laboratoire
Nettoyons tous les conteneurs que nous avons créés lors de ce laboratoire :
## List all containers
docker ps -a
## Stop all running containers
docker stop $(docker ps -q) 2> /dev/null || true
## Remove all containers
docker rm $(docker ps -a -q) 2> /dev/null || true
## Verify all containers are removed
docker ps -a
Vous ne devriez voir aucun conteneur répertorié après avoir exécuté ces commandes.
Quand choisir le réseau de pont ou le réseau hôte
Pour résumer quand utiliser chaque type de réseau :
Utilisez le réseau de pont (par défaut) lorsque :
- Vous avez besoin d'isolement entre les conteneurs
- Vous avez besoin d'un contrôle précis de la mise en correspondance des ports
- Votre application n'a pas besoin d'un accès direct aux interfaces réseau de l'hôte
- La sécurité est une priorité absolue
Utilisez le réseau hôte lorsque :
- Les performances réseau sont critiques
- Vous avez besoin d'un accès direct aux interfaces réseau de l'hôte
- Votre conteneur doit utiliser de nombreux ports ou une allocation dynamique de ports
- Vous avez besoin de surveiller le trafic réseau
- Le conteneur doit apparaître comme ayant la même adresse IP que l'hôte
Résumé
Dans ce laboratoire, vous avez appris :
- Les différences entre le réseau de pont Docker et le réseau hôte
- Comment exécuter des conteneurs Docker avec le réseau hôte en utilisant le flag
--network host - Les avantages en termes de performances du réseau hôte par rapport au réseau de pont
- Les cas d'utilisation pratiques où le réseau hôte est avantageux
- Les considérations de sécurité et les meilleures pratiques lors de l'utilisation du réseau hôte
Le réseau hôte supprime l'isolement réseau entre le conteneur et l'hôte, permettant au conteneur d'accéder directement aux interfaces réseau de l'hôte. Cela peut améliorer les performances, simplifier la configuration et permettre à certains types d'applications, comme les outils de surveillance réseau, de fonctionner correctement.
N'oubliez pas que si le réseau hôte offre certains avantages, il réduit également l'isolement et peut introduire des problèmes de sécurité. Suivez toujours les meilleures pratiques et n'utilisez le réseau hôte que lorsque votre cas d'utilisation l'exige.



