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
dhclient
cuando he habilitado--privileged
al iniciar el contenedor:dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
Corriendo
sudo dhclient eth0
cuando 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 dhclient
odhclient
(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.04
el Dockerfile.
dhclient
a partir/sbin
de/usr/sbin
la 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".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.
fuente
si está intentando obtener una dirección dhcp en un contenedor de docker de ubuntu, simplemente haga lo siguiente:
--dns <my_dns_ip>
)/etc/dhcp/dhclient.conf
y editar la línea que contienerequest subnet-mask, broadcast-address...
y eliminar las palabrasdomain-name, domain-name-servers
service networking restart
, obtendrá una nueva dirección dhcp sin mensajes de errorfuente
La otra posibilidad es utilizar "tuberías". Necesita ejecutarlo fuera de su contenedor. https://github.com/jpetazzo/pipework
fuente
pipework
es, 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.