Änderungsstand: 2025-01-14
Wird eben überarbeitet! Das dauert allerdings ein paar Tage.
Ich erstelle meist virtuelle Netzwerke, welche für meine Docker auf den Raspis später verwendet werden. Hier ein Beispiel für ein MCVLAN mit der VLAN-ID 30.
Meine Konfiguration im USG:
- Einstellungen
- Netzwerk
- Neues virtuelles Netzwerk
- Netzwerkname: mydockernet
- Auto-Scale Netzwerk: AUS
- Host-Adresse: 192.168.30.1 / Netmask: 24
- Erweitert: Manuell
- V-Lan ID: 30
- DHCP: DHCP-Server
- HINZUFÜGEN
Anschließend schaue ich, dass das vorhandene Profil in meinen Switch-Ports auch dort freigegeben wird, wo ich es wünsche. Die Unifi-Switches sind in der Konfiguration unschlagbar einfach aufgebaut.
Meine Konfiguration am Raspi 4:
Ein Macvlan-Netzwerk kann sich entweder im Bridge-Modus oder im 802.1Q-Trunk-Bridge-Modus befinden.
Im „Bridge Mode“ läuft der Macvlan-Verkehr direkt über ein physisches Gerät auf dem Host.
Der Bridge-Mode dient mir in erster Linie nur zur Erklärung. Ich verwende explizit den „Trunk Bridge Mode“ auf meinen Geräten.
Voraussetzung hierbei ist, dass Router und Switches das auch unterstützen. Da ich Unifi-Geräte habe, stellt das für mich kein Problem dar. Wer „nur“ eine Fritz!Box besitzt, hat hier gewissermaßen die A-Karte und muss zwangsläufig auf den normalen Bridge-Mode zurückgreifen, wenn man diese Technik überhaupt verwenden möchte.
Im 802.1Q-„Trunk Bridge Mode“ läuft der Verkehr über eine 802.1Q-Subschnittstelle, die Docker im laufenden Betrieb erstellt. Dadurch kann das Routing und die Filterung auf einer detaillierteren Ebene gesteuert werden.
Bridge Mode (für mich nur zur Info):
Im Bridge Mode läuft das System über die normale Netzwerkrange. Welchen Vorteil sollte dann Mcvlan bringen? Nun, ich kann hier jeden einzelnen Docker, egal ob im normalen Docker-Befehl oder in Docker Compose, feste IP-Adressen zuweisen.
sudo docker network create -d macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 -o parent=eth0 meinmacvlan
Oder mit Ausschluss von IP-Adressen (aux-address):
sudo docker network create -d macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 --aux-address "192.168.30.1" -o parent=eth0 meinmacvlan
Um am Ende eine direkte Verbindung zur Außenwelt herstellen zu können, muss ich noch einen speziellen Modus aktivieren. Der sogenannte Promisc-Mode sorgt dafür, dass ich mich auch außerhalb meines Containers bewegen kann. Ich kann quasi mit der Außenwelt kommunizieren 🙂 .
Promisc-Mode aktivieren:
sudo ip link set eth0 promisc on
Möchte ich diesen Mode wieder verlassen, dann:
sudo ip link set eth0 promisc off
Um das erstellte Netzwerk wieder zu entfernen, kann ich das entweder im Portainer tun oder folgenden Befehl verwenden:
sudo docker network rm meinmacvlan
Ich benötige das bisherige geschriebene im folgenden Modus NICHT.
Trunk Bridge Mode:
In meiner USG wurde das VLAN30 erstellt und durch alle Switche durchgereicht.
Meine Netzwerke befinden sich meist in VLANs. Jeder Raspi, den ich als Testgerät verwende, befindet sich in einem gesonderten VLAN. Das heißt, das der Raspi zwar eine normale IP-Adresse aus meinem Netzwerk bekommt, die Docker sich allerdings alle in einem weiteren Subnetz befinden. Somit habe ich ein mächtiges Werkzeug, mein Netzwerk zu gestalten. Doch leider macht das nicht jeder Router und auch nicht jeder Switch mit. Meine Ubiquiti-Geräte können das allerdings.
Zuerst setze ich natürlich das VLAN-Netzwerk im Router fest. Ich habe das in meiner USG anhand VLAN 30 erledigt. Dann am Raspi:
sudo docker network create -d macvlan --subnet 192.168.30.0/24 --gateway 192.168.30.1 -o parent=eth0.30 meinmacvlan30
Kontrolle:
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
0b95a5356daa bridge bridge local
8e80c2a4fd5c host host local
f180976b4257 meinmacvlan30 macvlan local
4e38dd5261ef none null local
Das war schon das ganze Geheimnis. Ich kann nun meine Docker in diesem Netzwerk verwenden. Ein Beispiel:
sudo docker run -itd --network=meinmacvlan30 --ip 192.168.30.3 --name testbox busybox
Der Container wurde erstellt. IP-Adressen werden in diesem Subnet automatisch erstellt und ich benötige auch keinerlei Portangaben. Test:
sudo docker exec -it testbox sh
Folgende Ping-Szenarien teste ich nun (Abbruch der Pings mit Strg-c):
ping 192.168.30.1
ping 8.8.8.8
ping 192.168.1.93
ping 192.168.1.146
exit
Alle Pings funktionieren auf Anhieb. Innerhalb des Subnetzes und auch außerhalb meines Subnetzes sind meine Geräte ansprechbar.
Ein Test, ob das auch rückwärts funktioniert:
sudo docker run -itd --network=meinmacvlan30 --ip 192.168.30.3 --name testbox1 nginx
Die von mir vergebene Nginx-IP-Adresse lautet 192.168.30.3. Das gebe ich nun im Browser ein:

Zur Info: Mein Browser inkl. mein Rechner befinden sich im Heim-Netzwerk 192.168.1.0/24.
Nun entferne ich wieder die soeben erstellten Test-Docker:
sudo docker stop testbox
sudo docker rm testbox
sudo docker stop testbox1
sudo docker rm testbox1
Falls ich das Macvlan wieder entfernen möchte, kann ich das auch hier im Portainer tun oder folgenden Befehl verwenden:
sudo docker network rm meinmacvlan30
.
Nginx im Beispiel als Docker Compose im Vlan:
sudo mkdir -p /home/dockervolumes/nginx
sudo nano /home/dockervolumes/nginx/docker-compose.yml
version: "2.1"
services:
nginx:
image: lscr.io/linuxserver/nginx:latest
container_name: nginx
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
volumes:
- /appdata/nginX:/config
restart: unless-stopped
networks:
default:
ipv4_address: 192.168.30.4
networks:
default:
name: meinmacvlan30
external: true
Strg-x, y, Enter
cd /home/dockervolumes/nginx && sudo docker compose up -d
Aufruf im Browser:
192.168.30.4 oder http s://192.168.30.4

.
Um das ganze Docker Compose-Zeugs, was ich eben erstellte, wieder zu entfernen:
cd /home/dockervolumes/nginx && sudo docker compose stop
cd /home/dockervolumes/nginx && sudo docker compose rm
y
sudo rm /home/dockervolumes/nginx/docker-compose.yml
sudo rm -r /home/dockervolumes/
.
Quelle(n):
https://docs.docker.com/network/drivers/macvlan
https://docs.docker.com/network/network-tutorial-macvlan
.