
Ok, quero saber como fazer networking em contêineres LXC. Não apenas o tipo de informação vaga que você obtém de outros sites, mas um verdadeiro guia para iniciantes para fazê-los funcionar. Como a maioria dos exemplos são basicamente configurados para as pessoas testarem, quero executar um serviço em um deles... como um servidor web, por exemplo.
Estou executando o Ubuntu 12.04 LTS e tenho o LXC instalado e posso criar, iniciar e parar um contêiner. Obviamente, meu servidor tem um IP público e gostaria de saber como configurar um contêiner para que ele também possa ter um IP público. Como já parece haver uma ponte em vigor no meu contêiner atual, parece que preciso fornecer aos contêineres um intervalo DHCP público para que eles funcionem ou atribuir manualmente um endereço IP estático ao meu contêiner.
Se eu quiser atribuir estaticamente um IP ao contêiner, como faço isso? Preciso fazer alguma alteração na configuração da minha ponte no host? É realmente melhor fazer isso com a opção MACVLAN?
Qualquer ajuda seria apreciada.
Responder1
Minha abordagem pressupõe que seu servidor tenha uma única NIC e você precise compartilhar essa NIC entre o host e os convidados do LXC. Isso envolve o uso de uma ponte. A ponte possui e administra eth0
. O host agora configura sua própria rede em br0
vez de eth0
. Os convidados LXC estão configurados para se conectar à ponte.
No host,
sudo apt-get install bridge-utils
.No host, substitua
eth0
por uma ponte:Isso é perigoso. Se errar, você poderá ficar sem acesso ao seu servidor. Certifique-se de ter um login local habilitado e que o acesso ao console local funcione, para que você possa reverter essa alteração se tiver algum problema.
Em
/etc/network/interfaces
:- Substituir
auto eth0
comauto br0
. Substituir:
iface eth0 inet dhcp
com:
iface br0 inet dhcp bridge_ports eth0
Se você tivesse uma configuração de rede estática, substituiria:
iface eth0 inet static address ... netmask ... gateway ... etc.
com:
iface br0 inet static bridge_ports eth0 address ... netmask ... gateway ... etc.
Você está apenas alterando
eth0
ebr0
adicionando abridge_ports eth0
linha.Reinicie o host. Se você estivesse fazendo isso localmente, executar
sudo ifdown eth0
antes de começar esudo ifup br0
depois também serviria. Observe que a ponte pode demorar um pouco para subir, então aguarde cinco minutos após a reinicialização antes de presumir que tudo está perdido.
- Substituir
Para mover um determinado contêiner LXC nomeado para um IP público:
- Pare o contêiner.
- No host, edite e mude para .
/var/lib/lxc/container_name/config
lxc.network.link
br0
- No host, edite e configure seu IP público como faria normalmente (DHCP ou uma configuração estática conforme necessário). Observe que a interface ainda é chamada do ponto de vista do contêiner.
/var/lib/lxc/container_name/rootfs/etc/network/interfaces
eth0
- Reinicie o contêiner.
Para alterar o padrão para novos contêineres LXC, edite
/etc/lxc/default.conf
no host e mudelxc.network.link
parabr0
.Se você não precisar da ponte NAT fornecida pelo LXC (ou seja, todos os seus contêineres usarão a nova ponte), no host edite
/etc/default/lxc
e mudeUSE_LXC_BRIDGE
para"false"
e, em seguida, no host executesudo service lxc restart
.
Responder2
Robie, muito obrigado por postar esta resposta, estou arrepiando meu cabelo tentando fazer isso e esse foi o único método que funcionou!
Achei que deveria mencionar algumas coisas que descobri para ajudar a esclarecer as instruções para outros administradores.
Meu host tinha vários aliases de IP estáticos atribuídos a eth0 no convidado, por exemplo:
iface eth0:1 inet static
address 5.5.5.5
netmask 255.255.255.5
gateway 5.5.5.1
etc.
Agora não queremos configurar o br0 da mesma forma, queremos apenas um IP sem aliases como Robie indicado acima.
Então, digamos que você queira que 5.5.5.5 seja atribuído ao contêiner debian8.
Edite /var/lib/lxc/debian8/etc/network/interfaces
e adicione:
iface eth0 inet static
address 5.5.5.5
netmask 255.255.255.5
gateway 5.5.5.1
etc.
Em seguida, emita este comando:route add default gw <gateway-ip, in my case 5.5.5.1>
Depois disso, reinicie o contêiner e tudo deverá finalmente funcionar! :)
Responder3
Eu tive o mesmo problema e tenho essa solução (rápida e suja).
server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24
container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28 (public ip address on eth0 alias)
No servidor:route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0
Além disso, se necessário, adicione rota aos roteadores upstream.
Provavelmente não é a melhor solução, mas não requer grande esforço! Saúde.