Liebe Forengemeinde,
in diesem Tutorial stelle ich Euch eine detaillierte Schritt-für-Schritt Anleitung inkl. aller Details und wichtiger Besonderheiten zur Verfügung, mit welcher Ihr ein MacVlan für Eure Docker-Container konfigurieren könnt. Voraussetzung für dieses Tutorial ist eine installierte Instanz von Portainer.
Empfehlung:
Überlegt Euch im ersten Schritt, wie viele IP-Adressen Ihr benötigt. Erfahrungsgemäß ist es besser, lieber mehr als zu wenig Adressen zu haben, da ein MacVlan im Nachgang nicht mehr erweitert werden kann. Man kann dieses nur löschen und neu erstellen, wodurch aber alle Container ihre IP-Adresse verlieren und diese nach einer Neukonfiguration manuell neu vergeben werden müssen. Wählt also einen großzügigen Bereich, insbesondere wenn ihr mit vielen Docker-Containern experimentieren möchtet.
Wichtiger Hinweis:
In meiner Anleitung konfiguriere ich als Beispiel den IP-Adressbereich 192.168.178.224/27 mit 32 IP-Adressen, wovon 30 IP-Adressen effektiv nutzbar sind. Solltet Ihr eine andere Adresskonfiguration haben oder mehr/weniger IP-Adressen benötigen, so muss das nachfolgende Konfigurationsbeispiel natürlich an Eure Gegebenheiten und Wünsche angepasst werden.
Eine Übersicht zu den Präfixen (im Beispiel /27), mit welchen Ihr den gewünschten IP-Adressbereich festlegen könnt, findet ihr in folgender Tabelle von Manitu: https://wiki.manitu.de/index.php/Server:IPv4-Subnetze
Vorbereitend zur eigentlichen Konfiguration sind einige ToDos erforderlich, welche ich im nachfolgenden beschreibe:
Subnetz für das MacVlan definieren:
- Öffnen der IT-Tools (erreichbar unter https://it-Tools.tech oder Eigeninstallation lt dieser Anleitung).
- In die Suchleiste „Subnet (ohne „“) eintippen und „IPv4 subnet calculator“ auswählen.
- Gewünschte Start-IP-Adresse und Präfix angeben.
- Alle Informationen notieren, diese werden bei der Konfiguration benötigt.
Excludieren des IP-Adressbereichs aus der DHCP-Range des Routers (am Beispiel meiner Fritzbox):
- Browser öffnen und das Webinterface deines Routers aufrufen und anmelden.
- In folgende Ansicht wechseln:
- Heimnetz > Netzwerk > Netzwerkeinstellungen > Weitere Einstellungen > IPv4-Einstellungen
- Den DHCP-Bereich so anpassen, dass der Teilbereich des MacVlans davon ausgenommen ist.
- Anschließend auf „Übernehmen“ klicken.
Ermitteln der aktiven Netzwerkverbindung:
- Sofern noch nicht erfolgt, muss auf dem NAS wie folgt SSH aktiviert werden.
- Systemsteuerung > Terminal > SSH aktivieren (Haken setzen)
- Terminal öffnen und per ssh anmelden.
- Nachfolgende Befehle ausführen:
- Sudo -i
- ifconfig
- In der Ausgabe werden nun alle verfügbaren Netzwerkverbindungen aufgelistet,
sucht hier nach der IP-Adresse Eures NAS (in meinem Fall 192.168.178.10). Die aktive Netzwerkverbindung für diese
IP-Adresse heißt in meinem Fall also „eth0“, notiert Euch diesen Namen, dieser wird bei der Einrichtung des MacVlans gleich benötigt.
Einrichtung des MacVlans in Portainer:
- Browser Eurer Wahl öffnen und Portainer aufrufen (http://IP-des-NAS:9443, z.B. http://192.168.178.10:9443)
- Anmeldedaten eingeben und auf Login klicken.
- Auf „Live connect“ klicken.
- Links im Menü auf „Networks“ klicken.
- Rechts oben auf „Add network“ klicken.
- Mac-Vlan Vorlage erstellen - die Angaben in den Feldern basieren auf meiner Beispiel, bei Bedarf anpassen:
- Name: mvl-vorlage
- Parent network card: eth0
- Driver: macvlan
- Subnet: 192.168.178.0/24
- Gateway: 192.168.178.1
- IP range: 192.168.178.224/27
- Auf „Add excluded“ IP klicken
- Exclude IP: 192.168.178.250
- Alles andere kann so belassen werden.
- Nun etwas nach unten scrollen und auf „Create the network“ klicken.
- Es erscheint eine Erfolgsmeldung.
- Links im Menü auf wieder auf „Networks“ klicken.
- Rechts oben wieder auf „Add network“ klicken.
- Mac-Vlan Netzwerk erstellen - die Felder mit den nachfolgenden Werten befüllen:
- Name: mvl
- Driver: macvlan
- Den Button „Creation“ anklicken
- Configuration: mvl-vorlage
- Alles andere kann so belassen werden.
- Anschließend auf „Create the network“ klicken.
- Es erscheint erneut eine Erfolgsmeldung.
Wir sind fast fertig, aber noch nicht ganz. Ihr erinnert euch bestimmt, bei der mvl-vorlage haben wir die "excluded IP" 192.168.178.250 definiert. Diese werden wir nun dazu nutzen, um sicherzustellen, dass alle Docker-Container mit dem Host und auch umgekehrt kommunizieren können. Hierzu sind ein paar Anpassungen im Terminal erforderlich.
Abschließende ToDos - Kommunikation Docker-Container <> Host:
- Folgenden Code kopieren und in einen Texteditor einfügen:
#!/bin/sh
ip link add mvl-brg link eth0 type macvlan mode bridge
ip addr add 192.168.178.250/32 dev mvl-brg
ip link set mvl-brg up
ip route add 192.168.178.224/27 dev mvl-brg
- Folgende Anpassungen vornehmen:
- In Zeile 2, sofern es eine Abweichung zu Eurer Konfig besteht, die "excluded IP" 192.168.178.250/32 anpassen.
- In Zeile 4, sofern es eine Abweichung zu Eurer Konfig besteht, die "IP range" 192.168.178.224/27 anpassen.
- Die Datei unter dem Namen "docker-network.sh" abspeichern.
- Die Datei "docker-network.sh" auf eine Freigabe des NAS hochladen (in meinem Fall /volume2/Scripte/).
- Terminal öffnen und per ssh anmelden.
- Nachfolgende Befehle ausführen:
- sudo -i
- mv /volume2/Scripte/docker-network.sh /usr/local/sbin
- cd /usr/local/sbin
- chmod +x docker-network.sh
- Service erstellen, damit das Script beim Systemstart ausgeführt wird - folgende Befehle eingeben:
- cd /etc/systemd/system
- nano docker-network.service
- Folgenden Inhalt kopieren und einfügen:
[Unit]
Description=Docker Host redet mit Container
After=multi-user.target
[Service]
ExecStart= /usr/local/sbin/docker-network.sh &
[Install]
WantedBy=multi-user.target
- Script unter dem Namen "docker-network.service" (ohne"") speichern.
- chmod 644 docker-network.service
- systemctl start docker-network.service
- systemctl status docker-network.service
- systemctl enable docker-network.service
- NAS neu starten.
Hinweis:
Nach Einrichtung eines oder mehrerer Docker mit MacVlan-Konfiguration kann geprüft werden, ob der Workaround "Kommunikation Docker-Container <> Host" erfolgreich war. Hierzu einfach vom PC aus einen Ping auf die IP-Adresse eines laufenden Docker-Containers (in meinem Fall z.B 192.168.178.251) absetzen.
Erhält man eine Antwort, war der Workaround erfolgreich:
Gratuliere, nun bist du einsatzbereit - viel Spaß beim nachbauen!