Docker + Bridges + DHCP

13

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.
por Programster 17.09.2014 / 09:32

4 respostas

3

é um problema em aberto e é específico dos contêineres e do apparmor do Ubuntu.

Uma solução alternativa foi postada lá a partir do bprodoehl:

  • Inicie o contêiner como privilegiado com --privileged
  • Adicione a seguinte linha ao dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Execute dhclient eth0 e você ainda verá a mensagem de erro: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busy , mas agora você terá um IP e poderá usar a rede.
por 17.09.2014 / 10:07
1

Eu encontrei um script

link

que faz exatamente o que você quer (a solução alternativa mencionada pelo Programster).

O comando mv é necessário porque, quando você executa o contêiner do docker no modo privilegiado, o docker não define o perfil do AppArmor para o contêiner. Portanto, o perfil AppArmor padrão de máquina é usado e impede que você execute o dhclient em seu caminho padrão.

    
por 09.01.2015 / 12:49
1

se você está tentando obter um endereço dhcp em um contêiner docker do ubuntu, faça o seguinte:

  1. defina a opção dns no seu comando do daemon do docker ( --dns <my_dns_ip> )
  2. abra /etc/dhcp/dhclient.conf e edite a linha que contém request subnet-mask, broadcast-address... e remova as palavras domain-name, domain-name-servers
  3. depois de aplicar service networking restart , você receberá um novo endereço dhcp sem mensagens de erro
por 14.01.2015 / 16:37
-2

A outra possibilidade é usar "tubulação". Você precisa executá-lo fora do seu contêiner. link

    
por 04.11.2014 / 22:52