Docker + Bridges + DHCP


13

Ich habe viele Docker-Container, die ich im selben LAN wie ihre Hosts adressieren muss. Bisher habe ich dies erreicht, indem ich eine Bridge eingerichtet und ihnen manuell IPs zugewiesen und die IPs selbst verwaltet habe. Ein Beispiel für ein Startup wäre wie folgt:

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

Wenn der Host die Bridge in /etc/network/interfaces(ubuntu) wie folgt definiert hat :

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Seitdem ich Serf entdeckt habe , habe ich versucht, die automatische Erkennung in den Containern zu verwenden, damit DHCP die IP-Adressen nachverfolgen und an die Container weitergeben kann. Ich habe seitdem den Startbefehl geändert in:

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

und die Brücke zu:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Dies führte dazu, dass der Container gestartet wurde, aber keine IP hatte. Ich habe mich dann von einem Online-Post beraten lassen, der es geschafft hat, es mit Fedora zu erledigen, indem er anrief dhclient. Leider funktioniert dies bei Ubuntu-basierten Containern nicht.

Im Folgenden sind die folgenden Fehlermeldungen aufgeführt, die unter verschiedenen Bedingungen angezeigt werden:

  • Wird ausgeführt, dhclientwenn ich das --privilegedStarten des Containers aktiviert habe :

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Laufen, sudo dhclient eth0wenn nicht in--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Läuft sudo dhclientoder dhclient(keine Schnittstelle angegeben).

    Kehrt sofort zurück und es besteht noch keine IP- oder Netzwerkverbindung.

Wie kann ich Docker-Container dazu bringen, dynamische IP-Adressen aus demselben Subnetz wie ihre Hosts abzurufen, sodass ich Container auf mehreren Hosts bereitstellen kann, ohne die IP-Adressen zu verfolgen?

Zusatzinformation

  • Laufen DOCKER_OPTS="-e lxc"in/etc/default/docker
  • Host ist Ubuntu 14.04
  • Docker-Container werden mithilfe from ubuntu:14.04der Docker- Datei erstellt.

Antworten:


3

Offenbar handelt es sich hierbei um ein offenes Problem, das sich speziell auf Ubuntu-Container und -Apparmor bezieht.

Dort wurde eine Problemumgehung von bprodoehl gepostet:

  • Starten Sie den Container als privilegiert mit --privileged
  • Fügen Sie der Docker-Datei die folgende Zeile hinzu: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Führen dhclient eth0Sie aus, und es wird weiterhin die Fehlermeldung angezeigt: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busySie haben jetzt eine IP-Adresse und können das Netzwerk verwenden.

es funktioniert wie ein Zauber für meinen Fall, aber warum wird das mv benötigt? Kannst du bitte erklären?
Federico Bonelli

Das war die Lösung, die der Typ gepostet hat (mit der ich verlinkt habe), und sie scheint zu funktionieren. Vielleicht kann jemand anderes erklären.
Programster

1
@ Federico Bonelli: Apparmor wendet Sicherheitsbeschränkungen auf die von ihm verwalteten Anwendungen an. Es werden nur Anwendungen verwaltet, für die Richtliniendefinitionen vorhanden sind. Diese Richtlinien stimmen auf der Grundlage ihres Pfads mit Anwendungen überein. Wenn Sie dhclientvon /sbinzu /usr/sbinder Apparmor-Richtliniendefinition wechseln , stimmen die Einstellungen nicht mehr überein und Apparmor wendet keine Sicherheitsbeschränkungen mehr auf diese "unbekannte" Anwendung an.
Paprika

Ich musste auf "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" zurückgreifen, da die Problemumgehung dies nicht tat. Dies war ein Ubuntu 14.04-Container. Die obige Fehlermeldung wurde jedoch angezeigt und eine IP-Adresse wurde zugewiesen.
Neil McGill

1

Ich habe ein Drehbuch gefunden

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

Das macht genau das, was Sie wollen (die von Programster erwähnte Problemumgehung).

Der Befehl mv ist erforderlich, da der Docker beim Ausführen des Docker-Containers im privilegierten Modus kein AppArmor-Profil für den Container definiert. Daher wird das AppArmor-Standardprofil des Computers verwendet und verhindert, dass Sie dhclient auf seinem Standardpfad ausführen.


1

Wenn Sie versuchen, eine DHCP-Adresse für einen Ubuntu Docker-Container abzurufen, gehen Sie wie folgt vor:

  1. setze dns Option auf deinen Docker Daemon Befehl ( --dns <my_dns_ip>)
  2. Öffnen /etc/dhcp/dhclient.confund bearbeiten Sie die Zeile, die request subnet-mask, broadcast-address...die Wörter enthält, und entfernen Sie siedomain-name, domain-name-servers
  3. Nach der service networking restartAnmeldung erhalten Sie eine neue DHCP-Adresse ohne Fehlermeldungen

-2

Die andere Möglichkeit ist die Verwendung von "Rohrleitungen". Sie müssen es außerhalb Ihres Containers ausführen. https://github.com/jpetazzo/pipework


5
Hallo und willkommen auf der Seite. Wir möchten, dass die Antworten hier etwas umfassender sind. Könnten Sie bearbeiten und erklären, was pipeworkist, wo man es finden kann, wie es installiert werden kann, vielleicht ein Beispiel für seine Verwendung geben? So wie es aussieht, ist Ihre Antwort ein Kommentar und keine Antwort.
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.