Eu tenho muitos contêineres docker que eu preciso endereçar na mesma LAN que seus hosts. Até agora, tenho conseguido isso usando configuração de um ponte e manualmente atribuindo-lhes IPs , e gerenciando os IPs eu mesmo. Um exemplo de inicialização seria assim:
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]
Com o host tendo a ponte definida em /etc/network/interfaces
(ubuntu) da seguinte forma:
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 descobri serf , tenho tentado passar para a descoberta automática dentro dos contêineres, para que o DHCP possa acompanhar de IPs e entregá-los aos contêineres. Desde então mudei o comando de inicialização para:
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 a ponte para:
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Isso resultou na inicialização do contêiner, mas não em um IP. Em seguida, recebi conselhos de uma publicação on-line quem conseguiu fazê-lo com o Fedora, chamando dhclient
. Infelizmente isso não está funcionando para mim dentro de contêineres baseados no Ubuntu.
Abaixo estão as seguintes mensagens de erro que recebo sob diferentes condições:
-
Executando dhclient
quando eu tiver ativado --privileged
no início do contêiner:
dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
-
Executando sudo dhclient eth0
quando não está em --privileged
RTNETLINK answers: Operation not permitted
mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
-
Executando sudo dhclient
ou dhclient
(nenhuma interface especificada).
Retorna imediatamente e ainda não há conectividade de IP ou de rede.
Como posso obter contêineres docker para capturar IPs dinâmicos da mesma sub-rede de seus hosts, de modo que eu possa implantar contêineres em vários hosts sem rastrear IPs?
Informações extras
- executando
DOCKER_OPTS="-e lxc"
em /etc/default/docker
- O host é o Ubuntu 14.04
- Os contêineres do Docker são criados usando
from ubuntu:14.04
no Dockerfile.