Comment configurer un conteneur Docker pour utiliser le réseau hôte

DockerBeginner
Pratiquer maintenant

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 :

  1. Ouvrez un terminal dans votre environnement LabEx.

  2. 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 conteneurs
  • host : Utilise directement le réseau de l'hôte
  • none : 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 :

  1. 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
  1. 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.

  1. 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 :

  1. Arrêtez et supprimez le précédent conteneur nginx pour libérer le port 80 :
docker stop nginx-bridge
docker rm nginx-bridge
  1. 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.

  1. 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.

  1. 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 :

  1. 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
  2. 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.

  1. Arrêtons et supprimons le précédent conteneur nginx :
docker stop nginx-host
docker rm nginx-host
  1. 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
  1. Créons un autre conteneur avec un réseau hôte :
docker run --name host-test -d --network host nginx:alpine
  1. Utilisons docker exec pour 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 :

  1. 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.

  1. 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.

  1. 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 :

  1. Arrêtez et supprimez tous les conteneurs en cours d'exécution :
docker stop bridge-test host-test
docker rm bridge-test host-test
  1. Démarrez un service sur l'hôte en utilisant le port 8080 :
python3 -m http.server 8080 &
  1. 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.

  1. 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 :

  1. 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.

  2. Outils de surveillance réseau : Les applications qui doivent capturer ou analyser le trafic réseau sur l'hôte.

  3. Applications utilisant plusieurs ports : Lorsque vous avez des services qui utilisent de nombreux ports ou une allocation dynamique de ports.

  4. 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.

  1. 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.

  1. 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.

  1. 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é :

  1. 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.

  2. 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.

  3. 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 :

  1. 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
  1. 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.

  2. 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é.

  3. 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
  1. 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.