Como obtenho o endereço IP de um contêiner LXC?

18

Eu escrevi alguns scripts para gerenciar contêineres LXC, e posso obter seus endereços IP via ifconfig, supondo que eu esteja conectado ao console.

Agora quero me conectar a esses contêineres por meio do ssh. Como faço para obter o endereço IP de tal forma que eu possa escrever um script? Eu também não quero definir os endereços manualmente (mas farei isso, se essa for a única opção).

Até agora, tentei usar lxc-start , mas a máquina não tem um endereço IP antes de executar /sbin/init .

    
por Stefano Palazzo 18.03.2013 / 17:41

11 respostas

8

A maneira mais fácil de fazer isso agora é:

lxc-info -n container-name -iH

Isso retorna o endereço IP sem outro texto.

A opção -i especifica que o endereço IP deve ser retornado e a opção -H desabilita a saída legível, ou seja, os rótulos. Para mais informações, consulte a página de manual do lxc-info .

    
por Andy 14.05.2015 / 15:02
10

Ver como executar coisas em containers não parece ser suportado no Ubuntu, minha segunda melhor sugestão é olhar para as concessões de endereços IP que o dnsmasq está distribuindo. Isso é muito simples:

$ cat /var/lib/misc/dnsmasq.leases
1363699477 00:16:3e:4a:ce:a4 10.0.3.83 containername *

Existem apenas duas partes que são de alguma utilidade, por isso podemos formatá-lo muito melhor:

$ awk '{ print , }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83
    
por Oli 19.03.2013 / 14:03
6

Tecnicamente falando, você deve ser capaz de usar lxc-attach para se conectar e disparar em um comando (e processar a saída), assim:

sudo lxc-attach --name containername -- ifconfig

Isso requer que o contêiner esteja em execução.

Nota: Eu não consegui fazer isso funcionar. Eu instalei o LXC e tentei isso, mas só vi um monte de erros de namespace, arquivos ausentes e outras bobagens. Mas minha única experiência com o LXC são os 10 minutos que passei nessa questão. Pode funcionar. Pode não ser. Boa sorte!

    
por Oli 18.03.2013 / 18:21
4

Ou consulte dnsmasq (que fornece IPs aos contêineres)

dig @10.0.3.1 $container-name +short
    
por Carl Hörberg 21.08.2013 / 13:12
4

Isso funciona no Ubuntu 14.04:

lxc-info -n $name -i

e se você quiser apenas o endereço IP (útil para scripts), (obrigado @JulianHLam):

lxc-info -n $name -iH
    
por vaab 11.04.2014 / 13:07
1

O comando abaixo substitui lxc-attach exemplo no post anterior

sudo lxc-execute --name containername --rcfile /usr/share/doc/lxc/examples/lxc-macvlan.conf /sbin/ifconfig

Ele executa ifconfig dentro do contêiner e mostra a saída.

The --rcfile argument might not be required. Without it the command failed with 

lxc-execute: No such file or directory - failed to exec /usr/lib/lxc/lxc-init 

lxc-execute: invalid sequence number 1. expected 2

Parece que algo não está configurado corretamente. Como solução alternativa, usei o modelo de configuração predefinido fornecido pela documentação do LXC para fazê-lo funcionar sem mais investigações.

    
por cfalguiere 31.01.2014 / 18:29
1

Se você estiver executando o LXD, poderá achar este comando útil para obter o endereço IP de um contêiner em execução

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1
    
por anastymous 14.07.2016 / 02:09
1

Versão em Python para fazer isso:

#!/usr/bin/python
from pylxd import Client

client = Client(endpoint='https://10.185.96.208:8443', verify=False,    cert=('.config/lxc/client.crt', '.config/lxc/client.key'))

myCtr = client.containers.get('YOUR_CTR_NAME')
addresses = myCtr.state().network['eth0']['addresses']
for a in addresses:
   if(a['scope'] == 'global'):
      print "Found IP [%s]" %(a['address'])
      break
    
por Ektor 04.11.2016 / 11:55
0

sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1

    
por ramigg 05.05.2014 / 14:16
0

Deixe o dnsmasq fazer isso por você.

Configure a instância dnsmasq da sua máquina host para consultar a instância dnsmasq do lxc para o domínio de nível superior .lxc.

Em / etc / default / lxc-net, descomente esta linha:

LXC_DOMAIN="lxc"

Se a instância dnsmasq do seu host for iniciada pelo NetworkManager (como é o caso com a maioria das instalações atuais da área de trabalho do Ubuntu) crie um arquivo chamado /etc/NetworkManager/dnsmasq.d/lxc.conf com esta linha dentro:

server=/lxc/10.0.3.1

Se o dnsmasq do seu host for iniciado por algo diferente de NetworkManager, adicione essa linha ao /etc/dnsmasq.d-available/lxc:

server=/lxc/10.0.3.1

Em seguida, reinicie as coisas para que elas captem as alterações:

service lxc-net stop
service lxc-net start
service network-manager restart

Você pode ter que reiniciar seus contêineres lxc ou fazê-los solicitar novas concessões de DHCP antes que eles apareçam no DNS. (Eu não lembro se foi necessário quando eu fiz isso.) Também vale a pena mencionar que eu vi um relatório de bug sobre o lxc-net não estar pegando as mudanças do dnsmasq quando foi reiniciado, então você pode querer reiniciar seu sistema host apenas para ter certeza.

Então tente:

$ host mycontainer.lxc
mycontainer.lxc has address 10.0.3.21

$ ssh [email protected]
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
ubuntu@mycontainer:~$
    
por ʇsәɹoɈ 03.11.2014 / 21:17
0

Resposta simples é

sudo lxc-ls -f | grep "container_name"

Se você não se lembra do container_name, apenas digite sudo lxc-ls -f.

    
por user646873 26.01.2017 / 08:12

Tags