it-swarm.com.de

IP des Docker 1.10-Containers im LAN

Seit Docker 1.10 (und dem libnetwork-Update) können wir einem Container in einem benutzerdefinierten Netzwerk manuell eine IP zuweisen, und das ist cool!

Ich möchte einem Container eine IP-Adresse in meinem LAN zuweisen (wie bei virtuellen Maschinen im "Bridge" -Modus). Mein LAN ist 192.168.1.0/24, alle meine Computer haben IP-Adressen. Und ich möchte, dass meine Container IPs in diesem Bereich haben, um sie von überall in meinem LAN (ohne NAT/PAT/etc ...) zu erreichen.

Ich lese natürlich Jessie Frazelle's Blogpost und viele andere hier und überall posten wie:

und so viel mehr, aber nichts kam heraus; Meine Container haben immer noch IP-Adressen in meinem Docker-Host und sind für andere Computer in meinem LAN nicht erreichbar.

Als ich Jessie Frazelle im Blogbeitrag las, dachte ich (da sie öffentliche IP-Adressen verwendet), können wir tun, was ich will.

Edit: Wenn ich so etwas mache:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
docker run --rm -it --net homenet --ip 192.168.1.100 nginx

Die neue Schnittstelle auf dem Docker Host (br- [a-z0-9] +) übernimmt die IP-Adresse "--gateway", die meine Router-IP ist. Und die gleiche IP auf zwei Computern im Netzwerk ... BOOM

Danke im Voraus.

18
Jérôme Pin

EDIT: Diese Lösung ist jetzt unbrauchbar. Seit Version 1.12 stellt Docker zwei Netzwerktreiber zur Verfügung: macvlan und ipvlan. Sie ermöglichen die Zuweisung einer statischen IP aus dem LAN-Netzwerk. Siehe die Antwort unten .


Nachdem wir nach Personen mit dem gleichen Problem gesucht hatten, gingen wir zu einer Problemumgehung:

Zusammenfassen :

  • (V) LAN ist 192.168.1.0/24
  • Standardgateway (= Router) ist 192.168.1.1
  • Mehrere Docker-Hosts
  • Hinweis: Wir haben zwei NIC: eth0 und eth1 (die Docker gewidmet ist)

Was wollen wir :

Wir möchten Container mit IP im Netzwerk 192.168.1.0/24 (wie Computer) ohne NAT/PAT/Übersetzung/Portweiterleitung/etc haben.

Problem

Wenn Sie dies tun:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet

wir können Containern die IP geben, die wir wollen, aber die von docker (br-[a-z0-9]+) erstellte Bridge hat die IP 192.168.1.1, die unser Router ist.

Lösung

1. Richten Sie das Docker Network ein

Verwenden Sie den DefaultGatewayIPv4-Parameter:

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet

Standardmäßig gibt Docker der Bridge-Schnittstelle (br-[a-z0-9]+) die erste IP-Adresse, die möglicherweise bereits von einem anderen Computer übernommen wurde. Die Lösung ist, den --gateway-Parameter zu verwenden, um Docker anzuweisen, eine beliebige IP (die verfügbar ist) zuzuweisen:

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet

Wir können den Brückennamen angeben, indem Sie -o com.docker.network.bridge.name=br-home-net zum vorherigen Befehl hinzufügen.

2. Brücke überbrücken!

Jetzt haben wir eine Brücke (br-[a-z0-9]+), die von Docker erstellt wurde. Wir müssen es zu einer physischen Schnittstelle überbrücken (in meinem Fall muss ich zur NIC, also verwende ich eth1):

brctl addif br-home-net eth1

3. Löschen Sie die Bridge-IP

Wir können jetzt die IP-Adresse von der Bridge löschen, da wir keine benötigen:

ip a del 192.168.1.200/24 dev br-home-net

Die IP 192.168.1.200 kann als Bridge auf mehreren Docker-Hosts verwendet werden, da wir sie nicht verwenden und sie entfernen.

18
Jérôme Pin

Docker unterstützt jetzt die Netzwerktreiber Macvlan und IPvlan. Die Docker-Dokumentation für beide Netzwerktreiber finden Sie hier .

Mit beiden Treibern können Sie das gewünschte Szenario implementieren (einen Container so konfigurieren, dass er sich im Bridge-Modus wie eine virtuelle Maschine verhält):

  • Macvlan: Ermöglicht einer physischen Netzwerkschnittstelle (Master-Gerät) eine beliebige Anzahl von Slave-Geräten mit jeweils eigenen MAC-Adressen.

    Benötigt Linux-Kernel v3.9–3.19 oder 4.0 oder höher.

  • IPvlan: Ermöglicht das Erstellen einer beliebigen Anzahl von Slave-Geräten für Ihr Master-Gerät, die alle dieselbe MAC-Adresse haben.

    Benötigt Linux-Kernel v4.2 + (Unterstützung für frühere Kernel ist vorhanden, aber fehlerhaft). 

    Weitere Informationen finden Sie unter kernel.org IPVLAN Driver HOWTO .

Container-Konnektivität wird erreicht, indem eines der Slave-Geräte in den Netzwerk-Namensraum des zu konfigurierenden Containers gestellt wird. Die Master-Geräte verbleiben auf dem Host-Betriebssystem (Standard-Namensraum).

Als Faustregel sollten Sie den IPvlan-Treiber verwenden, wenn für den mit dem externen Switch/Router verbundenen Linux-Host eine Richtlinie konfiguriert ist, die nur einen MAC pro Port zulässt. Dies ist häufig in VMWare ESXi-Umgebungen der Fall!

Eine weitere wichtige Sache (Macvlan und IPvlan): Der Verkehr zum und vom Master-Gerät kann nicht an und vom Slave-Gerät gesendet werden. Wenn Sie die Kommunikation von Master zu Slave aktivieren müssen, lesen Sie den Abschnitt "Kommunikation mit dem Host (default-ns)" im Dokument "IPVLAN - The Beginn", das von einem der IPvlan-Autoren (Mahesh Bandewar) veröffentlicht wurde .

5

Benutze den offiziellen Docker-Treiber:

Ab Docker v1.12.0-rc2 ist der neue MACVLAN-Treiber jetzt in einer offiziellen Docker-Version verfügbar:

  • MacVlan-Treiber ist aus dem experimentellen # 23524

Diese neuen Treiber wurden von den Autoren gut dokumentiert, mit Anwendungsbeispielen .

Am Ende des Tages sollte es ähnliche Funktionen bieten, einfacher einzurichten und weniger Fehler/andere Macken enthalten.

Container auf dem Docker-Host sehen:

Ein Nachteil des neuen offiziellen Macvlan-Treibers besteht jedoch darin, dass der Docker-Host-Computer seine eigenen Container nicht sehen/kommunizieren kann. Welches kann wünschenswert sein oder nicht, abhängig von Ihrer spezifischen Situation.

Dieses Problem kann umgangen werden, wenn sich mehr als 1 NIC auf Ihrem Docker-Host-Computer befindet. Und beide NICs sind mit Ihrem LAN verbunden. Dann kann entweder A) 1 der 2 Netzwerker Ihres Docker-Hosts exklusiv für Docker vergeben werden. Und verwenden Sie die verbleibende Netzwerkverbindung für den Host für den Zugriff auf das LAN. 

Oder B) durch Hinzufügen spezifischer Routen nur zu den Containern, auf die Sie über die zweite Netzwerkkarte zugreifen müssen. Zum Beispiel:

Sudo route add -Host $container_ip gw $lan_router_ip $if_device_nic2

Methode A) ist nützlich, wenn Sie vom Docker-Host aus auf alle Container zugreifen möchten und mehrere festverdrahtete Links haben.

Die Methode B) ist nützlich, wenn Sie vom Docker-Host nur Zugriff auf einige bestimmte Container benötigen. Oder wenn Ihre 2. NIC eine WLAN-Karte ist und für die Abwicklung Ihres gesamten LAN-Verkehrs viel langsamer wäre. Zum Beispiel auf einem Laptop.

Installation:

Wenn der -rc2-Kandidat für die Vorabversion unter ubuntu 16.04 nicht angezeigt wird, fügen Sie diese Zeile vorübergehend in Ihre /etc/apt/sources.list ein, um Folgendes zu sagen:

deb https://apt.dockerproject.org/repo ubuntu-xenial testing

anstelle von main (was stabile Versionen ist).

4
Dreamcat4

Ich habe diese Lösung nicht mehr empfohlen. Also wurde es entfernt. Es war mit Brückentreiber und brctrl .

Es gibt jetzt einen besseren und offiziellen Fahrer. Siehe andere Antwort auf dieser Seite: https://stackoverflow.com/a/36470828/287510

2
Dreamcat4

Hier ist ein Beispiel für die Verwendung von macvlan. Es startet einen Webserver unter http://10.0.2.1/ .

Diese Befehle und die Docker Compose-Datei funktionieren auf QNAP und der Container Station von QNAP. Beachten Sie, dass die Netzwerkschnittstelle von QNAP qvs0 ist.

Befehle:

Der Blogbeitrag " Docker Macvlan-Netzwerke verwenden "[1][2] von Lars Kellogg-Stedman erklärt, was die Befehle bedeuten.

docker network create -d macvlan -o parent=qvs0 --subnet 10.0.0.0/8 --gateway 10.0.0.1 --ip-range 10.0.2.0/24 --aux-address "Host=10.0.2.254" macvlan0
ip link del macvlan0-shim link qvs0 type macvlan mode bridge
ip link add macvlan0-shim link qvs0 type macvlan mode bridge
ip addr add 10.0.2.254/32 dev macvlan0-shim
ip link set macvlan0-shim up
ip route add 10.0.2.0/24 dev macvlan0-shim

docker run --network="macvlan0" --ip=10.0.2.1 -p 80:80 nginx

Docker Compose

Verwenden Sie Version 2, da Version 3 die anderen Netzwerkkonfigurationen wie gateway, ip_range und aux_address nicht unterstützt.

version: "2.3"

services:
    HTTPd:
        image: nginx:latest
        ports:
            - "80:80/tcp"
            - "80:80/udp"
        networks:
            macvlan0:
                ipv4_address: "10.0.2.1"

networks:
    macvlan0:
        driver: macvlan
        driver_opts:
            parent: qvs0
        ipam:
            config:
                - subnet: "10.0.0.0/8"
                  gateway: "10.0.0.1"
                  ip_range: "10.0.2.0/24"
                  aux_address: "Host=10.0.2.254"
0
XP1