Maintenant, effectuons quelques tests pour voir les différences pratiques entre le réseau de pont et le réseau hôte dans Docker.
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 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 :
- 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.