Eu tenho muitos contêineres de docker que precisam ser endereçados na mesma LAN dos seus hosts. Até agora, eu consegui isso usando a configuração de uma ponte, atribuindo-lhes IPs manualmente e gerenciando-os pessoalmente. 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 no /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 servo , eu tenho tentado passar para usar a descoberta automática dentro dos recipientes, para que DHCP pode manter o controle de IPs e entregá-los aos recipientes. Eu 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 sem um IP. Então, recebi o conselho de uma publicação on-line que conseguiu fazer isso com o Fedora, ligando dhclient
. Infelizmente isso não está funcionando para mim em contêineres baseados no ubuntu.
Abaixo estão as seguintes mensagens de erro que recebo em diferentes condições:
Em execução
dhclient
quando eu habilitei o--privileged
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 estiver em--privileged
RTNETLINK answers: Operation not permitted mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
Em execução
sudo dhclient
oudhclient
(nenhuma interface especificada).Retorna imediatamente e ainda não há conectividade IP ou de rede.
Como posso fazer com que os contêineres do docker obtenham IPs dinâmicos da mesma sub-rede que seus hosts, para que eu possa implantar contêineres em vários hosts sem rastrear IPs?
Informação extra
- Correndo
DOCKER_OPTS="-e lxc"
em/etc/default/docker
- O host é Ubuntu 14.04
- Os contêineres do Docker são criados usando
from ubuntu:14.04
o Dockerfile.
dhclient
a partir/sbin
para/usr/sbin
a definição de políticas Apparmor não irá corresponder mais e Apparmor não aplicar quaisquer restrições de segurança para esta aplicação "desconhecido".Eu encontrei um script
https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md
isso faz exatamente o que você deseja (a solução alternativa mencionada pelo Programster).
O comando mv é necessário porque, quando você executa o contêiner de docker no modo privilegiado, o docker não define o perfil do AppArmor para contêiner. Portanto, o perfil do AppArmor padrão da máquina é usado e impede a execução do dhclient no caminho padrão.
fonte
se você estiver tentando obter um endereço dhcp em um contêiner do docker ubuntu, faça o seguinte:
--dns <my_dns_ip>
)/etc/dhcp/dhclient.conf
e edite a linha que contémrequest subnet-mask, broadcast-address...
e remova as palavrasdomain-name, domain-name-servers
service networking restart
você obterá um novo endereço dhcp sem mensagens de errofonte
A outra possibilidade é usar "tubulações". Você precisa executá-lo fora do seu contêiner. https://github.com/jpetazzo/pipework
fonte
pipework
é, onde alguém pode encontrá-lo, como ele pode ser instalado, talvez dar um exemplo de seu uso? Tal como está, sua resposta é um comentário e não uma resposta.