Vergleich von Netzwerkleistung und -Verhalten
Jetzt führen wir einige Tests durch, um die praktischen Unterschiede zwischen Bridge- und Host-Netzwerken in Docker zu verstehen.
Testen der Netzwerkleistung
Zunächst erstellen wir einen Container mit Bridge-Netzwerk und einen anderen mit Host-Netzwerk und vergleichen dann deren Leistung.
- Stoppen und entfernen wir den vorherigen nginx-Container:
docker stop nginx-host
docker rm nginx-host
- Erstellen wir einen neuen Container mit Bridge-Netzwerk, um die Leistung zu testen:
docker run --name bridge-test -d --network bridge nginx:alpine
- Erstellen wir einen anderen Container mit Host-Netzwerk:
docker run --name host-test -d --network host nginx:alpine
- Verwenden wir
docker exec, um in jedem Container einen einfachen Netzwerk-Test auszuführen:
Für den Container mit Bridge-Netzwerk:
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
Für den Container mit Host-Netzwerk:
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
Vergleichen Sie die Ausführungszeiten. Typischerweise hat der Container mit Host-Netzwerk eine etwas bessere Leistung, da er die zusätzliche Netzwerkschicht vermeidet.
Untersuchung der Netzwerkschnittstellen
Untersuchen wir die Netzwerkschnittstellen in beiden Containern:
- Für den Container mit Bridge-Netzwerk:
docker exec bridge-test ip addr show
Sie werden sehen, dass dieser Container seine eigenen Netzwerkschnittstellen hat, die vom Host isoliert sind.
- Für den Container mit Host-Netzwerk:
docker exec host-test ip addr show
Sie werden feststellen, dass dieser Container genau die gleichen Netzwerkschnittstellen wie das Host-System hat, einschließlich aller physischen Netzwerkschnittstellen.
- Vergleichen wir mit den Netzwerkschnittstellen des Hosts:
ip addr show
Die Schnittstellen des Containers mit Host-Netzwerk sollten denen des Host-Systems entsprechen.
Verständnis von Portkonflikten
Beim Verwenden des Host-Netzwerks können Portkonflikte auftreten, wenn der Container versucht, Ports zu verwenden, die bereits auf dem Host belegt sind:
- Stoppen und entfernen wir alle laufenden Container:
docker stop bridge-test host-test
docker rm bridge-test host-test
- Starten wir einen Dienst auf dem Host, der Port 8080 verwendet:
python3 -m http.server 8080 &
- Versuchen wir nun, einen Container mit Host-Netzwerk auszuführen, der ebenfalls Port 8080 verwenden möchte:
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
Sie sollten eine Fehlermeldung sehen, da Port 8080 auf dem Host bereits belegt ist.
- Beenden wir den Python-HTTP-Server:
kill %1
Dies zeigt einen möglichen Nachteil des Host-Netzwerks - Sie müssen sich der Portkonflikte mit dem Host bewusst sein.