Macvlan in Docker - Container direkt im Heimnetz mit eigener IP
Macvlan in Docker - Container direkt im Heimnetz mit eigener IP
Manchmal soll ein Container nicht hinter einem Port-Mapping versteckt sein, sondern wie ein normales Gerät im Netzwerk erscheinen — mit eigener IP-Adresse, die andere Geräte direkt ansprechen können. Dafür gibt es Macvlan.
Was Macvlan macht
Bei Standard-Bridge-Netzwerken hat der Container eine interne IP (z. B. 172.17.0.2) und ist von außen nur über Port-Mappings erreichbar. Mit Macvlan bekommt der Container eine eigene MAC-Adresse und eine IP aus dem physischen Netzwerk — für den Router sieht er aus wie ein eigenständiges Gerät.
Typische Anwendungsfälle: Container, der als NAS, DNS-Server (Pi-hole), DLNA-Server oder andere Dienste im Heimnetz fungiert, die direkt über ihre IP erreichbar sein müssen.
Macvlan-Netzwerk erstellen
Voraussetzung: Die physische Netzwerkschnittstelle des Hosts kennen (ip a zeigt sie — oft eth0 oder enp3s0).
docker network create \
-d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--ip-range=192.168.1.240/28 \
-o parent=eth0 \
heimnetz
--subnet: das Subnetz des Heimnetzes--gateway: der Router--ip-range: der IP-Bereich, aus dem Docker IPs vergibt (sollte sich nicht mit DHCP überschneiden)parent: die physische Netzwerkschnittstelle
Container mit eigener IP starten
docker run -d \
--name pihole \
--network heimnetz \
--ip 192.168.1.240 \
-e TZ=Europe/Berlin \
pihole/pihole:latest
Pi-hole ist jetzt unter 192.168.1.240 im Heimnetz erreichbar — kein Port-Mapping nötig.
Die wichtige Einschränkung: Host kann Macvlan-Container nicht erreichen
Das ist die häufigste Verwunderung beim ersten Macvlan-Setup: Der Host selbst kann die Container im Macvlan-Netzwerk nicht direkt ansprechen. Das ist kein Bug, sondern eine technische Eigenheit von Macvlan.
Workaround: Ein Macvlan-Interface auf dem Host erstellen, das in dasselbe Netzwerk zeigt:
# Host-seitige Macvlan-Schnittstelle
sudo ip link add macvlan0 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.1.241/32 dev macvlan0
sudo ip link set macvlan0 up
# Route zu den Container-IPs über diese Schnittstelle
sudo ip route add 192.168.1.240/28 dev macvlan0
Danach kann der Host die Container erreichen.
Promiscuous Mode
Für Macvlan muss die Netzwerkkarte des Hosts im Promiscuous Mode laufen — sie muss Pakete für MAC-Adressen empfangen, die nicht die eigene sind. Auf physischer Hardware ist das problemlos. Auf VMs oder manchen Cloud-Instanzen muss Promiscuous Mode explizit in den Hypervisor-Einstellungen erlaubt werden (bei VMware, Proxmox, VirtualBox als Option verfügbar).
# Prüfen ob Promiscuous Mode aktiv ist
ip link show eth0 | grep PROMISC
Docker aktiviert Promiscuous Mode für Macvlan automatisch — aber der Hypervisor muss es erlauben.