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,
dhclient
wenn ich das--privileged
Starten des Containers aktiviert habe :dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
Laufen,
sudo dhclient eth0
wenn 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 dhclient
oderdhclient
(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.04
der Docker- Datei erstellt.
dhclient
von/sbin
zu/usr/sbin
der Apparmor-Richtliniendefinition wechseln , stimmen die Einstellungen nicht mehr überein und Apparmor wendet keine Sicherheitsbeschränkungen mehr auf diese "unbekannte" Anwendung an.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.
quelle
Wenn Sie versuchen, eine DHCP-Adresse für einen Ubuntu Docker-Container abzurufen, gehen Sie wie folgt vor:
--dns <my_dns_ip>
)/etc/dhcp/dhclient.conf
und bearbeiten Sie die Zeile, dierequest subnet-mask, broadcast-address...
die Wörter enthält, und entfernen Sie siedomain-name, domain-name-servers
service networking restart
Anmeldung erhalten Sie eine neue DHCP-Adresse ohne Fehlermeldungenquelle
Die andere Möglichkeit ist die Verwendung von "Rohrleitungen". Sie müssen es außerhalb Ihres Containers ausführen. https://github.com/jpetazzo/pipework
quelle
pipework
ist, 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.