Probleme bei der Einrichtung von Docker & Docker-Compose mit ipvlan-Netzwerk

Hallo zusammen,

ich versuche, mehrere Container einzurichten – zuerst mit Docker Compose, aber das hat nicht funktioniert. Also habe ich es einfacher mit nur Docker versucht, aber auch das schlägt fehl.

Am Ende müssen 4 Container laufen, die miteinander kommunizieren können. Der Plan ist:

  • 3 Container auf einem ipvlan-Netzwerk.
  • 1 Container im host-Modus (weil er auf den USB-Port zugreifen muss).

Um das Testen zu vereinfachen, habe ich ein einfaches Skript geschrieben, das ein Alpine-Container zieht und startet.

Hier ist mein Skript:

#!/bin/sh

# 1. Entferne alles
docker network rm qnap-ipvlan 2>/dev/null || true
docker rm -f alpine 2>/dev/null || true

# 2. Erstelle ipvlan-Netzwerk (L2-Modus)
# docker network create -d ipvlan --subnet=10.159.2.0/24 --gateway=10.159.2.4 --ip-range=10.159.2.96/28 -o parent=eth1 -o ipvlan_mode=l2 qnap-ipvlan

docker network create -d ipvlan --subnet=10.159.2.0/24 --gateway=10.159.2.4 --ip-range=10.159.2.96/28 -o parent=eth1 -o ipvlan_mode=l2 -o ipvlan_flags=bridge -o com.docker.network.driver.mtu=1500 qnap-ipvlan

# 3. Funktioniert es?
docker network inspect qnap-ipvlan

# 4. Test mit Alpine-Container
docker run -it --rm --network=qnap-ipvlan --ip=10.159.2.109 alpine sh -c "ping -c 2 10.159.2.4 && ping -c 2 10.159.2.10"

# 5. Alpine erreichbar
# Von QNAP selbst:
curl -I http://10.159.2.109 2>/dev/null || echo "Testing connection"

# 6. Status
docker-compose ps
docker network inspect qnap-ipvlan

Und das ist das Ergebnis/der Fehler, den ich bekomme:

[/share/Container/docker-compose] # chmod ug+x ./setup_IPvlan_alpine.sh
[/share/Container/docker-compose] # ./setup_IPvlan_alpine.sh
qnap-ipvlan
9f3dbd6a27cfa1812--------636471f5893ba6b38bf15f7b2c
[
    {
        "Name": "qnap-ipvlan",
        "Id": "9f3dbd6a27cfa1812a----3b31636471f5893ba6b38bf15f7b2c",
        "Created": "2026-01-14T22:05:40.655178454+01:00",
        "Scope": "local",
        "Driver": "ipvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.159.2.0/24",
                    "IPRange": "10.159.2.96/28",
                    "Gateway": "10.159.2.4"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.driver.mtu": "1500",
            "ipvlan_flags": "bridge",
            "ipvlan_mode": "l2",
            "parent": "eth1"
        },
        "Labels": {}
    }
]
docker: Error response from daemon: failed to create the ipvlan port: device or resource busy.
Testing connection
WARN[0000] /share/Container/docker-compose/docker-compose.yml: das Attribut `version` ist veraltet, es wird ignoriert, bitte entfernen Sie es, um mögliche Verwirrung zu vermeiden 
NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS
[
    {
        "Name": "qnap-ipvlan",
        "Id": "9f3dbd6a27cfa1812a36-------893ba6b38bf15f7b2c",
        "Created": "2026-01-14T22:05:40.655178454+01:00",
        "Scope": "local",
        "Driver": "ipvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.159.2.0/24",
                    "IPRange": "10.159.2.96/28",
                    "Gateway": "10.159.2.4"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.driver.mtu": "1500",
            "ipvlan_flags": "bridge",
            "ipvlan_mode": "l2",
            "parent": "eth1"
        },
        "Labels": {}
    }
]

Der Hauptfehler, auf den ich stoße, ist:
„docker: Error response from daemon: failed to create the ipvlan port: device or resource busy.“

Warum erscheint dieser „device or resource busy“ ipvlan-Fehler? Wie kann ich das beheben, damit ich mit dem Setup weitermachen kann?

Jeder Rat oder Vorschlag wäre wirklich willkommen

Vielen Dank im Voraus!

Gibt es einen Grund, warum du dafür VLANs verwenden musst? QNAP setzt standardmäßig alle Container in ein eigenes Netzwerk…

Zunächst einmal vielen Dank für Ihre Zeit. Ich wollte früher antworten, aber aus irgendeinem Grund habe ich beim Einloggen immer wieder einen „Gateway Timeout“ erhalten.

Zweitens, ja, es gibt einen Grund.

Die Standard-Container-Station stellt Dienste über Port-Mapping (Port-Forwarding) bereit.

Mein Wunsch nach einem eigenen ipvlan-Netzwerk ist jedoch durch mehrere architektonische und betriebliche Anforderungen motiviert: Ein ipvlan-Netzwerk ermöglicht es Containern, eigene, dedizierte und routbare IP-Adressen im bestehenden LAN-Subnetz zu erhalten, ohne NAT. Dadurch verhalten sie sich wie physische Geräte im Netzwerk, was für eine direkte Container-zu-Container-Kommunikation mit festen IPs unerlässlich ist. Andere Geräte im LAN können so die Container direkt erreichen, ohne über die Port-Mappings des Hosts gehen zu müssen.

Der ipvlan-L2-Modus hat weniger Overhead als die Standard-Docker-Bridge (die NAT und iptables-Regeln verwendet). Für meinen Anwendungsfall ist das auch einfacher, da ich weder ein Wirrwarr von Port-Mappings verwalten noch mir alles merken muss, während ich mit dem eigentlichen Zweck des Containers beschäftigt bin.

Die Verwendung von Docker Compose oder Skripten mit einem definierten ipvlan-Netzwerk macht das Setup selbstdokumentierend und portabel. Ich kann exakt dieselbe Netzwerkkonfiguration auf einem anderen Docker-Host (nicht unbedingt QNAP) reproduzieren, indem ich lediglich das parent-Interface anpasse.

Abgesehen von meinen Präferenzen und Wünschen gibt es also auch betriebliche Anforderungen. Mein Fokus liegt darauf, warum ich die Benachrichtigung „Port wird verwendet“ erhalte. Können Sie oder jemand anderes mir dabei helfen?

Vielen Dank.

Vielen Dank für Ihren Beitrag. Ich habe immer angenommen, dass die zusätzlichen Netzwerke, die von ContainerStation im Network and Virtual Switch erstellt werden, tatsächlich eigene routbare Netzwerke sind. Ist das nicht der Fall?

Basierend auf meinem Verständnis von Container Station kann man Netzwerkmodes wie „Host“, „Bridge“ und einen VLAN-Typ (macvlan?) auswählen.

Du weißt wahrscheinlich mehr darüber als ich, aber ich habe keine Möglichkeit gefunden, jedem Container eine statische IP zuzuweisen – ohne Portweiterleitung – und gleichzeitig direkte Kommunikation zwischen den Containern zu ermöglichen. Ich habe keine Beispiele gefunden, die das erreichen. Wenn ich versuche, den Bridge-Modus mit einer statischen IP zu verwenden, hängt die Container-Einrichtung immer, sobald ich versuche, einen Ordner auszuwählen. Dieses Problem, zusammen mit dem Zeitaufwand und dem eigentlichen Ziel, hat mich davon abgehalten, weiter zu experimentieren.

Eine wiederverwendbare Konfiguration in Container Station zu erstellen, erscheint mir zu aufwändig, besonders wenn ich sie später auf ein anderes QNAP oder ein anderes System verschieben möchte. Ich brauche wirklich eine Lösung, die alle notwendigen Einstellungen in einem Schritt oder Setup anwendet.

Update:

Übrigens habe ich gerade die Ursache des Fehlers entdeckt. Das QNAP war mit einer virtuellen Schnittstelle konfiguriert, die eth1.100 und vsc0 (oder etwas Ähnliches) blockierte. Docker – oder das System selbst – hat dann auf eth0 zurückgegriffen.

Ich habe einen Teil davon gelöst, indem ich ip link set eth1 promisc on ausgeführt habe, wodurch die physische Schnittstelle mehrere IP-Adressen akzeptieren konnte.

Jetzt können die Container miteinander kommunizieren, aber seltsamerweise kann der Host nicht mit den Containern kommunizieren.

Habe gerade ein Testskript fertiggestellt. Vielleicht kann jemand dabei helfen.


#!/bin/sh

echo "1. Alte Container entfernen"
docker rm -f container-a container-b 2>/dev/null || true
docker network rm qnap-ipvlan-static

echo "=== 1. AKTUELLE NETZWERKKONFIGURATION ==="
echo "Eth1 IP-Adresse:"
ip addr show dev eth1 | grep inet
echo "---"
echo "Eth1 Link-Status:"
ip link show eth1

echo "=== 2. ALTE NETZWERKE ENTFERNEN ==="
docker network rm qnap-ipvlan 2>/dev/null || true

echo "=== IPVLAN-NETZWERK MIT FESTEN IPs ==="

echo "1. Promiscuous Mode aktivieren"
ip link set eth1 promisc on

echo "2. IPVLAN-Netzwerk mit Namen 'qnap-ipvlan-static' erstellen"
docker network create -d ipvlan --subnet=10.159.2.0/24 --gateway=10.159.2.4 --ip-range=10.159.2.96/28 -o parent=eth1 -o ipvlan_mode=l2 qnap-ipvlan-static

echo "3. Container A mit fester IP 10.159.2.101 starten"
docker run -d --name container-a --network=qnap-ipvlan-static --ip=10.159.2.101 alpine sleep 300
sleep 4

echo "4. Container B mit fester IP 10.159.2.102 starten"
docker run -d --name container-b --network=qnap-ipvlan-static --ip=10.159.2.102 alpine sleep 300
sleep 4

echo "=== 5. NETZWERKTESTS ==="

echo "Test 1: Container A zu Container B"
docker exec container-a ping -c 2 10.159.2.102

echo "Test 2: Container B zu Container A"
docker exec container-b ping -c 2 10.159.2.101

echo "Warnung ---- ICMP ist in der FW als blockiert eingetragen"
echo "Test 3: Container A zu Gateway"
docker exec container-a ping -c 2 10.159.2.4

echo "Test 4: Container B zu Gateway"
docker exec container-b ping -c 2 10.159.2.4

echo "Test 5: Host zu Container A"
ping -c 2 10.159.2.101

echo "Test 6: QNAP zu Container B"
ping -c 2 10.159.2.102

echo "=== 6. TESTS VON EXTERNEM GERÄT ==="
echo "Vom externen Gerät ausführen:"
echo "  ping 10.159.2.101"
echo "  ping 10.159.2.102"

#echo "=== 7. AUFRÄUMEN ==="

#docker rm -f container-a container-b

#docker network rm qnap-ipvlan-static

Das Ergebnis des Skripts mit der nicht funktionierenden Verbindung vom Host zu den Containern.

[/share/Container/docker-compose] # ./setup3_IPvlan_alpine.sh

1. Alte Container entfernen

container-a

container-b

qnap-ipvlan-static

=== 1. AKTUELLE NETZWERKKONFIGURATION ===

Eth1 IP-Adresse:

    inet 10.159.2.10/24 brd 10.159.2.255 scope global eth1

---

Eth1 Link-Status:

3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000

    link/ether 24:5e:be:6d:3d:05 brd ff:ff:ff:ff:ff:ff

=== 2. ALTE NETZWERKE ENTFERNEN ===

=== IPVLAN-NETZWERK MIT FESTEN IPs ===

1. Promiscuous Mode aktivieren

2. IPVLAN-Netzwerk erstellen

068597243bb2b05a185ef754a9eb00f0e06918b60028b01da9d159878e2b68be

3. Container A mit fester IP 10.159.2.101 starten

afbffd4314f94c1f38fdd992a53761da092d3c037ab63a8d03d3f293e5becbd3

4. Container B mit fester IP 10.159.2.102 starten

7daaad6cf1b1d2a0f549a41597dfc68a302fc809cd4f4f585101d055580f4076

=== 5. NETZWERKTESTS ===

Test 1: Container A zu Container B

PING 10.159.2.102 (10.159.2.102): 56 data bytes

64 bytes from 10.159.2.102: seq=0 ttl=64 time=0.329 ms

64 bytes from 10.159.2.102: seq=1 ttl=64 time=0.076 ms



--- 10.159.2.102 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.076/0.202/0.329 ms

Test 2: Container B zu Container A

PING 10.159.2.101 (10.159.2.101): 56 data bytes

64 bytes from 10.159.2.101: seq=0 ttl=64 time=0.072 ms

64 bytes from 10.159.2.101: seq=1 ttl=64 time=0.070 ms



--- 10.159.2.101 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.070/0.071/0.072 ms

ICMP ist in der FW als blockiert eingetragen

Test 3: Container A zu Gateway

PING 10.159.2.4 (10.159.2.4): 56 data bytes

64 bytes from 10.159.2.4: seq=0 ttl=64 time=0.487 ms

64 bytes from 10.159.2.4: seq=1 ttl=64 time=0.257 ms



--- 10.159.2.4 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.257/0.372/0.487 ms

Test 4: Container B zu Gateway

PING 10.159.2.4 (10.159.2.4): 56 data bytes

64 bytes from 10.159.2.4: seq=0 ttl=64 time=0.417 ms

64 bytes from 10.159.2.4: seq=1 ttl=64 time=0.231 ms



--- 10.159.2.4 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.231/0.324/0.417 ms

Test 5: Host zu Container A

PING 10.159.2.101 (10.159.2.101): 56 data bytes



--- 10.159.2.101 ping statistics ---

2 packets transmitted, 0 packets received, 100% packet loss

Test 6: QNAP zu Container B

PING 10.159.2.102 (10.159.2.102): 56 data bytes



--- 10.159.2.102 ping statistics ---

2 packets transmitted, 0 packets received, 100% packet loss

=== 6. TESTS VON EXTERNEM GERÄT ===

Vom externen Gerät ausführen:

  ping 10.159.2.101

  ping 10.159.2.102"

ping 10.159.2.101 und ping 10.159.2.102 funktionieren beide von anderen Geräten aus.