Umgang mit Netzwerken
Ziel
In diesem Projekt geht es darum, grundlegende Netzwerkkonzepte von Docker kennen zu lernen. Sie werden:
- ein eigenes Netzwerk erstellen
- die Verbindung zwischen zwei Containern herstellen
- ein eigenes IPv6-Netzwerk mit bestimmten Subnetzen erstellen
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
Vorbereitung - VSCode einstellen
Vergewissern Sie sich zuerst, dass Sie wieder im workspace Ordner sind. In diesem Hands-On werden wir die Verbindung zwischen zwei Containern in verschiedenen Szenarien betrachten. Das ist am einfachsten, wenn die zwei Container in gesplitteten Terminal Fenstern nebeneinander offen sind. Öffnen Sie dafür VSCode, öffnen Sie ein Terminal und klicken Sie auf . Ihr VSCode sollte danach etwa so aussehen:
Aufgabe 1 - Default Bridge Netzwerke
1.1: Container starten
Starten Sie im linken und rechten Terminal jeweils einen Container mit:
docker run -it --rm corewire/network-playground /bin/bash
1.2: Netzwerkinformationen herausfinden
Finden Sie für beide Container die IP Adressen heraus mit:
ip a
1.3: Containerverbindung testen
- Führen Sie im Container im rechten Terminal folgenden Befehl aus:
Der Container überwacht jetzt live allen ICMP Traffic, also alle PING Pakete.
tcpdump icmp
- Führen Sie im Container im linken Terminal einen Ping zum Container im rechten Terminal aus:
Sie sehen nun im rechten Terminal, wie der Traffic beim Container ankommt.
ping <container ip>
Aufgabe 2 - User-defined bridge Netzwerke
2.1: Eigenes Netzwerk anlegen
- Beenden Sie den
tcpdump
im rechten Terminal mitStrg
+c
und verlassen Sie den Container mitexit
. - Erstellen Sie ein neues Netzwerk mit dem Namen
my-network
.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Führen Sie in einem der beiden Terminals folgenden Befehl aus:
docker network create my-network
- Inspizieren Sie Ihr Netzwerk und prüfen Sie, welches Subnetz in my-network verwendet wird.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Führen Sie in einem der beiden Terminals folgenden Befehl aus:
docker network inspect my-network
2.2: Container mit Netzwerk starten
- Starten Sie im rechten Terminal wieder den Container, diesmal aber mit dem gerade erstellten Netzwerk:
docker run -it --rm --network=my-network corewire/network-playground /bin/bash
- Starten Sie wieder
tcpdump
, fragen Sie die neue IP-Adresse mitip a
ab und versuchen Sie, wie oben, den rechten Container aus dem linken heraus zu erreichen. Das ist in diesem Fall nicht erfolgreich, da die Container in unterschiedlichen Netzwerken sind.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Führen Sie im Container im rechten Terminal folgenden Befehl aus:
tcpdump icmp
ip a
ping <container ip>
- Stoppen Sie den linken Container mit
exit
. - Starten Sie den linken Container im neuen Netzwerk.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Um das Netzwerk im linken Container zu starten, nutzen Sie folgenden Befehl:
docker run -it --rm --network=my-network corewire/network-playground /bin/bash
- Testen Sie erneut die Verbindung zwischen den Containern mit
tcpdump
undping
. - Die Verbindung ist nun wieder möglich.
2.3: Nutzung des DNS
- Stoppen Sie beide Container wieder und starten Sie diese zusätzlich mit einem Namen. Dieser kann über
--name=<container name>
gesetzt werden. - Testen Sie die Verbindung erneut mit
tcpdump
undping
, nutzen Sie dabei den vergebenen Namen als Zieladresse.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Linkes Terminal:
docker run -it --rm --network=my-network --name=left corewire/network-playground /bin/bash
Rechtes Terminal:
docker run -it --rm --network=my-network --name=right corewire/network-playground /bin/bash
tcpdump icmp
Linkes Terminal:
ping right
Aufgabe 3: IPv6-Netzwerke
- Stoppen Sie wieder beide Container.
- Legen Sie ein neues Netzwerk
my-ipv6-network
an mit dem spezifizierten Subnetzfd00:0:0:1::/64
an
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Um das Netzwerk in einem der Container zu erstellen, nutzen Sie folgenden Befehl:
docker network create --ipv6 --subnet fd00:0:0:1::/64 my-ipv6-network
- Starten Sie die beiden Container nun im
my-ipv6-network
Netzwerk.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Linkes Terminal:
docker run -it --rm --network=my-ipv6-network --name=left corewire/network-playground /bin/bash
Rechtes Terminal:
docker run -it --rm --network=my-ipv6-network --name=right corewire/network-playground /bin/bash
- Mit
tcpdump icmp6
können Sie nun die ipv6-Pakete beobachten.
Lösung (Klicken Sie auf den Pfeil, falls sie nicht weiterkommen)
Rechtes Terminal:
tcpdump icmp6
Linkes Terminal:
ping6 right