Docker + Puentes + DHCP

13

Tengo muchos contenedores acoplables que necesito direccionar en la misma LAN que sus hosts. Hasta ahora, he estado logrando esto al configurar un puente y asignarles manualmente las IP , y administrar las IP yo mismo. Un ejemplo de inicio sería así:

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 el host con el puente definido en /etc/network/interfaces(ubuntu) así:

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

Desde que descubrí el siervo , he estado tratando de usar el descubrimiento automático dentro de los contenedores, para que DHCP pueda realizar un seguimiento de las IP y entregarlas a los contenedores. Desde entonces cambié el comando de inicio a:

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

y el puente para:

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

Esto dio como resultado que el contenedor se iniciara, pero que no tuviera una IP. Luego tomé el consejo de una publicación en línea que logró hacerlo con Fedora, llamando dhclient. Lamentablemente, esto no funciona para mí en contenedores basados ​​en ubuntu.

A continuación se muestran los siguientes mensajes de error que recibo en diferentes condiciones:

  • Ejecutando dhclientcuando he habilitado --privilegedal iniciar el contenedor:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Corriendo sudo dhclient eth0cuando no está--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • En ejecución sudo dhcliento dhclient(sin interfaz especificada).

    Regresa de inmediato y todavía no hay conectividad IP o de red.

¿Cómo puedo obtener contenedores de Docker para tomar IP dinámicas de la misma subred que sus hosts, de modo que pueda implementar contenedores en varios hosts sin rastrear IP?

Información extra

  • Corriendo DOCKER_OPTS="-e lxc"en/etc/default/docker
  • El host es Ubuntu 14.04
  • Los contenedores Docker se crean utilizando from ubuntu:14.04el Dockerfile.
Programador
fuente

Respuestas:

3

Parece que este es un problema abierto y es específico de los contenedores y de los dispositivos de Ubuntu.

Una solución alternativa se publicó allí desde bprodoehl:

  • Inicie el contenedor como privilegiado con --privileged
  • Agregue la siguiente línea al dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Ejecute dhclient eth0y aún verá el mensaje de error: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busypero ahora tendrá una IP y podrá usar la red.
Programador
fuente
funciona como un encanto para mi caso, pero ¿por qué se necesita ese mv? ¿Puedes explicar por favor?
Federico Bonelli
Eso fue lo que estaba en la solución que el tipo publicó (a lo que me vinculé) y parece funcionar. Quizás alguien más pueda explicarlo.
Programador
1
@Federico Bonelli: Apparmor aplica restricciones de seguridad a las aplicaciones que administra. Solo administra las aplicaciones para las que tiene definiciones de políticas. Estas políticas coinciden con las aplicaciones en función de su ruta. Cuando se mueve dhclienta partir /sbinde /usr/sbinla definición de políticas Apparmor no coincidirá con más y Apparmor no se aplicará ninguna restricción de seguridad para esta aplicación "desconocido".
pimentón
Tuve que recurrir a "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient", ya que la solución no lo hizo, este era un contenedor de ubuntu 14.04 para su información. Sin embargo, se vio el mensaje de error anterior y luego se asignó una dirección IP.
Neil McGill
1

He encontrado un guion

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

eso hace exactamente lo que quieres (la solución mencionada por Programster).

El comando mv es necesario, porque cuando ejecuta el contenedor Docker en modo privilegiado, Docker no define el perfil de AppArmor para el contenedor. Por lo tanto, se utiliza el perfil de AppArmor predeterminado de la máquina y evita que ejecute dhclient en su ruta predeterminada.

Dmitriusan
fuente
1

si está intentando obtener una dirección dhcp en un contenedor de docker de ubuntu, simplemente haga lo siguiente:

  1. establecer la opción dns en su comando docker daemon ( --dns <my_dns_ip>)
  2. abrir /etc/dhcp/dhclient.confy editar la línea que contiene request subnet-mask, broadcast-address...y eliminar las palabrasdomain-name, domain-name-servers
  3. luego, después de aplicar service networking restart, obtendrá una nueva dirección dhcp sin mensajes de error
usuario99240
fuente
-2

La otra posibilidad es utilizar "tuberías". Necesita ejecutarlo fuera de su contenedor. https://github.com/jpetazzo/pipework

usuario90299
fuente
55
Hola y bienvenidos al sitio. Nos gusta que las respuestas sean un poco más completas aquí. ¿Podría editar y explicar qué pipeworkes, dónde se puede encontrar, cómo se puede instalar, tal vez dar un ejemplo de su uso? Tal como está, su respuesta es un comentario y no una respuesta.
terdon