Docker + Ponti + DHCP


13

Ho molti container docker che devo indirizzare sulla stessa LAN dei loro host. Fino ad ora, ho raggiunto questo obiettivo utilizzando la creazione di un bridge e l'assegnazione manuale degli IP e la gestione degli stessi . Un esempio di avvio sarebbe il seguente:

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]

Con l'host che ha il bridge definito in /etc/network/interfaces(ubuntu) in questo modo:

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

Da quando ho scoperto servo , ho cercato di passare all'utilizzo del rilevamento automatico all'interno dei contenitori, in modo che il DHCP possa tenere traccia degli IP e distribuirli ai contenitori. Da allora ho cambiato il comando di avvio 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

e il ponte per:

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

Ciò ha comportato l'avvio del contenitore, ma non un IP. Ho quindi ricevuto consigli da un post online che è riuscito a farlo con Fedora, chiamando dhclient. Purtroppo questo non funziona per me nei contenitori basati su Ubuntu.

Di seguito sono riportati i seguenti messaggi di errore che ricevo in diverse condizioni:

  • In esecuzione dhclientquando ho abilitato l' --privilegedavvio del contenitore:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • In esecuzione sudo dhclient eth0quando non in--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • In esecuzione sudo dhcliento dhclient(nessuna interfaccia specificata).

    Ritorna immediatamente e non è ancora presente alcuna connessione IP o di rete.

Come posso ottenere contenitori docker per acquisire IP dinamici dalla stessa sottorete dei loro host, in modo da poter distribuire contenitori su più host senza tenere traccia degli IP?

Informazioni extra

  • Esecuzione DOCKER_OPTS="-e lxc"in/etc/default/docker
  • L'host è Ubuntu 14.04
  • I contenitori Docker vengono creati utilizzando from ubuntu:14.04nel Dockerfile.

Risposte:


3

Sembra che questo sia un problema aperto ed è specifico per i contenitori e gli apparmor Ubuntu.

È stata pubblicata una soluzione alternativa da bprodoehl:

  • Avviare il contenitore come privilegiato con --privileged
  • Aggiungi la seguente riga al file docker: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Esegui dhclient eth0e vedrai ancora il messaggio di errore:, mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyma ora avrai un IP e puoi usare la rete.

funziona come un incantesimo per il mio caso, ma perché è necessario quel mv? Puoi spiegare per favore?
Federico Bonelli,

Questa era la soluzione che il ragazzo ha pubblicato (a cui ho collegato) e sembra funzionare. Forse qualcun altro può spiegare.
Programster,

1
@Federico Bonelli: Apparmor applica restrizioni di sicurezza alle applicazioni che gestisce. Gestisce solo le applicazioni per cui ha definizioni di criteri. Queste politiche corrispondono alle applicazioni in base al loro percorso. Quando si sposta dhclientdalla /sbina /usr/sbinalla definizione della politica Apparmor non corrisponderà più e Apparmor non si applica alcuna restrizione di sicurezza per questa applicazione "sconosciuto".
paprika,

Ho dovuto ricorrere a "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" come la soluzione non ha fatto, questo era un Ubuntu 14.04 contenitore FYI. Tuttavia, è stato visualizzato il messaggio di errore sopra riportato e quindi assegnato un indirizzo IP.
Neil McGill,

1

Ho trovato una sceneggiatura

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

fa esattamente quello che vuoi (la soluzione menzionata da Programster).

Il comando mv è necessario, poiché quando si esegue il contenitore docker in modalità privilegiata, la finestra mobile non definisce il profilo AppArmor per il contenitore. Quindi viene utilizzato il profilo AppArmor predefinito dalla macchina e impedisce di eseguire dhclient nel percorso predefinito.


1

se stai cercando di ottenere un indirizzo dhcp su un contenitore docker ubuntu, procedi come segue:

  1. imposta l'opzione dns sul tuo comando daemon docker ( --dns <my_dns_ip>)
  2. aprire /etc/dhcp/dhclient.confe modificare la riga che contiene request subnet-mask, broadcast-address...e rimuovere le paroledomain-name, domain-name-servers
  3. quindi dopo l'applicazione service networking restartotterrai un nuovo indirizzo dhcp senza messaggi di errore

-2

L'altra possibilità è quella di utilizzare "tubazioni". Devi eseguirlo al di fuori del tuo contenitore. https://github.com/jpetazzo/pipework


5
Ciao e benvenuto nel sito. Ci piace che le risposte siano un po 'più complete qui. Potresti modificare e spiegare cos'è pipework, dove è possibile trovarlo, come può essere installato, forse dare un esempio del suo utilizzo? Allo stato attuale, la tua risposta è un commento e non una risposta.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.