So konfigurieren Sie einen Docker-Container für die Verwendung des Host-Netzwerks

DockerBeginner
Jetzt üben

Einführung

Docker-Container sind isolierte Umgebungen, die Anwendungen ausführen, ohne das Host-System zu beeinträchtigen. Standardmäßig erstellt Docker virtuelle Netzwerke, um den Container-Verkehr zu isolieren. Manchmal möchten Sie jedoch, dass Ihr Container direkt das Netzwerk des Hosts verwendet.

In diesem Lab (Übungsumgebung) lernen Sie, wie Sie Docker-Container so konfigurieren, dass sie das Host-Netzwerk nutzen. Sie werden die Unterschiede zwischen dem Standard-Bridge-Netzwerk und dem Host-Netzwerk untersuchen, verstehen, wann Sie das Host-Netzwerk einsetzen sollten, und praktische Beispiele implementieren, um die Vorteile direkt zu erleben.

Grundlegendes zu Docker-Netzwerktypen

Bevor wir Container so konfigurieren, dass sie das Host-Netzwerk nutzen, lassen Sie uns die verschiedenen Netzwerktypen in Docker untersuchen und deren Zwecke verstehen.

Überprüfen der verfügbaren Docker-Netzwerke

Beginnen wir damit, die Standard-Docker-Netzwerke auf Ihrem System zu untersuchen:

  1. Öffnen Sie ein Terminal in Ihrer LabEx-Umgebung.

  2. Führen Sie den folgenden Befehl aus, um alle Docker-Netzwerke aufzulisten:

docker network ls

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

NETWORK ID     NAME      DRIVER    SCOPE
1234567890ab   bridge    bridge    local
0987654321cd   host      host      local
abcdef123456   none      null      local

Docker bietet drei Standard-Netzwerke:

  • bridge: Das Standard-Netzwerk für Container
  • host: Nutzt direkt das Netzwerk des Hosts
  • none: Kein Netzwerk (Container sind isoliert)

Grundlegendes zum Standard-Bridge-Netzwerk

Wenn Sie einen Container ohne Angabe eines Netzwerks ausführen, verbindet Docker ihn mit dem Standard-Bridge-Netzwerk. Dies erstellt für jeden Container eine virtuelle Netzwerkschnittstelle und ermöglicht es den Containern, miteinander und mit dem externen Netzwerk zu kommunizieren.

Lassen Sie uns dies in Aktion sehen:

  1. Führen Sie einen einfachen nginx-Container mit dem Standard-Bridge-Netzwerk aus:
docker run --name nginx-bridge -d -p 8080:80 nginx:alpine
  1. Überprüfen Sie die Netzwerkeinstellungen des Containers:
docker inspect nginx-bridge --format '{{json .NetworkSettings.Networks}}' | jq

Sie sollten eine Ausgabe sehen, die zeigt, dass der Container mit dem Bridge-Netzwerk verbunden ist und seine eigene IP-Adresse hat.

  1. Überprüfen Sie, ob der Container vom Host aus erreichbar ist, indem Sie eine Anfrage an den zugeordneten Port senden:
curl http://localhost:8080

Sie sollten den HTML-Inhalt der nginx-Willkommensseite sehen.

Dies zeigt, wie das Bridge-Netzwerk funktioniert - der Container hat seine eigene IP-Adresse, und Port 80 im Container ist auf Port 8080 auf dem Host zugeordnet.

Ausführen eines Containers im Host-Netzwerkmodus

Jetzt wollen wir untersuchen, wie man einen Container mit dem Host-Netzwerk ausführt und verstehen, wie es sich vom Bridge-Netzwerk unterscheidet.

Verwenden des Host-Netzwerks

Wenn Sie den Host-Netzwerkmodus verwenden, teilt sich der Container direkt den Netzwerknamespace (Netzwerk-Namensraum) des Hosts. Dies bedeutet:

  • Der Container verwendet die IP-Adresse des Hosts.
  • Es ist keine Portzuordnung (Port mapping) erforderlich.
  • Der Container kann alle Netzwerkschnittstellen auf dem Host zugreifen.
  • Es können Portkonflikte auftreten, wenn der Container versucht, Ports zu verwenden, die bereits auf dem Host belegt sind.

Lassen Sie uns einen Container mit Host-Netzwerk ausführen:

  1. Stoppen und entfernen Sie den vorherigen nginx-Container, um Port 80 freizugeben:
docker stop nginx-bridge
docker rm nginx-bridge
  1. Führen Sie jetzt einen neuen nginx-Container mit dem Host-Netzwerk aus:
docker run --name nginx-host --network host -d nginx:alpine

Beachten Sie, dass wir nicht den -p-Parameter für die Portzuordnung angeben mussten, da der Container direkt den Netzwerkstack des Hosts verwenden wird.

  1. Überprüfen Sie die Netzwerkeinstellungen des Containers:
docker inspect nginx-host --format '{{json .NetworkSettings.Networks}}' | jq

Sie werden sehen, dass der Container mit dem Host-Netzwerk verbunden ist.

  1. Greifen Sie direkt auf den nginx-Server über Port 80 des Hosts zu:
curl http://localhost:80

Sie sollten den HTML-Inhalt der nginx-Willkommensseite sehen.

Verständnis der Unterschiede

Vergleichen wir die beiden Ansätze:

  1. Mit Bridge-Netzwerk (Standard):

    • Der Container hat seine eigene IP-Adresse.
    • Portzuordnung ist erforderlich, um auf die Container-Services zuzugreifen.
    • Zusätzliche Netzwerkschicht für Isolation.
    • Durch die Isolation sicherer.
  2. Mit Host-Netzwerk:

    • Der Container verwendet die IP-Adresse des Hosts.
    • Keine Portzuordnung erforderlich.
    • Direkter Zugriff auf die Netzwerkschnittstellen des Hosts.
    • Bessere Netzwerkleistung.
    • Weniger Isolation zwischen Container und Host.

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.

  1. Stoppen und entfernen wir den vorherigen nginx-Container:
docker stop nginx-host
docker rm nginx-host
  1. Erstellen wir einen neuen Container mit Bridge-Netzwerk, um die Leistung zu testen:
docker run --name bridge-test -d --network bridge nginx:alpine
  1. Erstellen wir einen anderen Container mit Host-Netzwerk:
docker run --name host-test -d --network host nginx:alpine
  1. 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:

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

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

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

  1. Stoppen und entfernen wir alle laufenden Container:
docker stop bridge-test host-test
docker rm bridge-test host-test
  1. Starten wir einen Dienst auf dem Host, der Port 8080 verwendet:
python3 -m http.server 8080 &
  1. 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.

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

Praktische Anwendungsfälle für Host-Netzwerke

Jetzt wollen wir einige praktische Anwendungsfälle untersuchen, in denen das Host-Netzwerk von Vorteil ist, und ein reales Beispiel implementieren.

Wann man das Host-Netzwerk nutzen sollte

Das Host-Netzwerk ist in folgenden Szenarien besonders nützlich:

  1. Leistungskritische Anwendungen: Wenn die Netzwerkleistung von entscheidender Bedeutung ist und man den Overhead des Bridge-Netzwerks vermeiden möchte.

  2. Netzwerküberwachungstools: Anwendungen, die Netzwerkverkehr auf dem Host erfassen oder analysieren müssen.

  3. Anwendungen, die mehrere Ports nutzen: Wenn Sie Dienste haben, die viele Ports oder dynamische Portzuweisung verwenden.

  4. Zugriff auf Hardware-Netzwerkschnittstellen: Wenn Container direkten Zugriff auf physische Netzwerkschnittstellen benötigen.

Implementierung eines Netzwerküberwachungstools mit Host-Netzwerk

Lassen Sie uns ein praktisches Beispiel implementieren: einen einfachen Netzwerküberwachungscontainer, der Zugriff auf die Netzwerkschnittstellen des Hosts benötigt.

  1. Zunächst führen wir ein Netzwerküberwachungstool mit Host-Netzwerk aus:
docker run --name netmon --network host -d alpine:latest sleep infinity

Dieser Container wird unendlich lange laufen, sodass wir Befehle darin ausführen können.

  1. Jetzt erfassen wir etwas Netzwerkverkehr innerhalb des Containers:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 10 -i any -n"

Der obige Befehl:

  • Installiert das tcpdump-Tool im Container
  • Erfasst 10 Pakete von jeder Schnittstelle
  • Zeigt numerische Ausgabe an (keine Hostnamenauflösung)

Da wir das Host-Netzwerk verwenden, kann der Container direkt auf alle Netzwerkschnittstellen des Hosts zugreifen.

  1. Überprüfen wir, ob wir Verkehr zu einem bestimmten Host-Dienst erfassen können:
## Öffnen Sie ein neues Terminalfenster und generieren Sie etwas Verkehr
curl http://localhost:80 &

## Im ursprünglichen Terminal führen Sie aus:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 5 -i any port 80 -n"

Sie sollten sehen, dass der Container HTTP-Verkehr auf Port 80 erfasst.

Dies zeigt, wie das Host-Netzwerk es dem Container ermöglicht, auf die Netzwerkschnittstellen des Hosts zuzugreifen und Verkehr zu erfassen, was mit einem Bridge-Netzwerk schwieriger wäre.

Verwenden des Host-Netzwerks in einer Docker Compose-Datei

Für diejenigen, die Docker Compose verwenden, können Sie in Ihrer docker-compose.yml-Datei einen Dienst so konfigurieren, dass er das Host-Netzwerk nutzt:

version: "3"
services:
  web:
    image: nginx:alpine
    network_mode: "host"

Diese Konfiguration würde bewirken, dass der web-Dienst den Netzwerkstack des Hosts verwendet.

Sicherheitsüberlegungen und bewährte Verfahren

Beim Verwenden des Host-Netzwerks mit Docker-Containern ist es wichtig, die Sicherheitsauswirkungen zu verstehen und bewährte Verfahren zu befolgen.

Sicherheitsauswirkungen des Host-Netzwerks

Die Verwendung des Host-Netzwerks verringert die Isolation zwischen Container und Host-System. Dies hat mehrere Sicherheitsauswirkungen:

  1. Verringerte Netzwerkisolation: Container mit Host-Netzwerk können auf alle Netzwerkschnittstellen und Ports auf dem Host zugreifen.

  2. Potenzielle Portkonflikte: Dienste im Container können mit Diensten auf dem Host in Konflikt geraten.

  3. Vergrößerte Angriffsfläche: Wenn ein Container kompromittiert wird, kann der Angreifer möglicherweise direkter auf das Host-Netzwerk zugreifen.

Bewährte Verfahren für die Verwendung des Host-Netzwerks

Befolgen Sie diese bewährten Verfahren, wenn Sie das Host-Netzwerk verwenden:

  1. Begrenzen Sie die Containerberechtigungen: Selbst wenn Sie das Host-Netzwerk verwenden, folgen Sie dem Prinzip der geringsten Privilegien:
## 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. Verwenden Sie das Host-Netzwerk nur, wenn es notwendig ist: Verwenden Sie das Host-Netzwerk nur für Container, die es wirklich benötigen, nicht als Standardoption.

  2. Führen Sie regelmäßige Sicherheitsaudits durch: Überwachen Sie Container, die das Host-Netzwerk verwenden, enger auf potenzielle Sicherheitsrisiken.

  3. Verwenden Sie möglichst schreibgeschützte Dateisysteme:

## 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. Entfernen Sie nicht verwendete Container:
## Remove all stopped containers (cleanup)
docker container prune -f

Aufräumen Ihrer Lab-Umgebung

Lassen Sie uns alle Container aufräumen, die wir während dieses Labs erstellt haben:

## 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

Nach Ausführung dieser Befehle sollten keine Container mehr aufgelistet werden.

Wann Bridge- oder Host-Netzwerk wählen

Zusammenfassend, wann welches Netzwerktyp verwendet werden sollte:

Verwenden Sie das Bridge-Netzwerk (Standard), wenn:

  • Sie Isolation zwischen Containern benötigen
  • Sie präzise Kontrolle über die Portzuordnung benötigen
  • Ihre Anwendung keinen direkten Zugriff auf die Host-Netzwerkschnittstellen erfordert
  • Sicherheit oberste Priorität hat

Verwenden Sie das Host-Netzwerk, wenn:

  • Die Netzwerkleistung von entscheidender Bedeutung ist
  • Sie direkten Zugriff auf die Host-Netzwerkschnittstellen benötigen
  • Ihr Container viele Ports oder dynamische Portzuweisung verwenden muss
  • Sie den Netzwerkverkehr überwachen müssen
  • Der Container die gleiche IP-Adresse wie der Host haben muss

Zusammenfassung

In diesem Lab haben Sie gelernt:

  • Die Unterschiede zwischen Docker Bridge-Netzwerken und Host-Netzwerken
  • Wie man Docker-Container mit Host-Netzwerk mithilfe der Flagge --network host ausführt
  • Die Leistungsvorteile des Host-Netzwerks im Vergleich zum Bridge-Netzwerk
  • Praktische Anwendungsfälle, in denen das Host-Netzwerk von Vorteil ist
  • Sicherheitsüberlegungen und bewährte Verfahren bei der Verwendung des Host-Netzwerks

Das Host-Netzwerk hebt die Netzwerkisolation zwischen Container und Host auf, sodass der Container direkt auf die Netzwerkschnittstellen des Hosts zugreifen kann. Dies kann die Leistung verbessern, die Konfiguration vereinfachen und es bestimmten Arten von Anwendungen wie Netzwerküberwachungstools ermöglichen, ordnungsgemäß zu funktionieren.

Denken Sie daran, dass das Host-Netzwerk zwar bestimmte Vorteile bietet, aber auch die Isolation verringert und möglicherweise Sicherheitsbedenken mit sich bringt. Befolgen Sie immer bewährte Verfahren und verwenden Sie das Host-Netzwerk nur, wenn Ihr Anwendungsfall es erfordert.