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


19

Escrevi alguns scripts para gerenciar contêineres LXC e posso obter seus endereços IP via ifconfig, assumindo que estou conectado ao console.

Agora eu quero conectar a esses contêineres via ssh. Como obtenho o endereço IP deles para que eu possa escrever um script? 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 possui um endereço IP antes de executar /sbin/init.


O mesmo problema aqui, relacionado a este relatório de erros, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 que contém informações corroborativas sobre o fato de não funcionar no Ubuntu 16.04 Server Edtions, mas estar bem em Desktops onde o dnsmasq é expulso pelo NetworkManager (como sugerido em; askubuntu.com/a/545265/599087 por 'forest'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Respostas:


10

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

lxc-info -n container-name -iH

Isso retorna o endereço IP sem nenhum outro texto.

A -iopção especifica que o endereço IP deve ser retornado e a -Hopção desativa a saída legível por humanos, ou seja, rótulos. Para mais informações consulte o LXC-info página homem .

EDIT para a versão mais recente do LXC:

lxc info container-name

Então você obtém informações detalhadas. Veja o bloco "Ips:", que deve se parecer com o abaixo. Você pode escolher o primeiro endereço IPv4 ( 10.121.48.241) neste caso:

Ips:
  eth0: inet    10.121.48.241   vethSBP4RR
  eth0: inet6   fda5:b9a9:f3b9:ba32:216:3eff:fe4a:4d7d  vethSBP4RR
  eth0: inet6   fe80::216:3eff:fe4a:4d7d    vethSBP4RR
  lo:   inet    127.0.0.1
  lo:   inet6   ::1

Trabalhando com LXD e contêineres sem privilégios, este comando não é útil. Como você obteria essas informações com os contêineres sem privilégios padrão promovidos pelo LXD em 2017?
jgomo3

10

Como a execução de coisas em contêineres não parece ser suportada no Ubuntu, minha próxima melhor sugestão é examinar as concessões de endereços IP que dnsmasqestão sendo distribuídas. Isso é realmente simples:

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

Existem apenas duas partes úteis para que possamos formatar isso muito melhor:

$ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83

Isso funciona perfeitamente!
Stefano Palazzo

2
Para referência: novas versões do LXC (ou seja, a em Raring) mostram o endereço IP na saída de lxc-ls --fancy.
Stefano Palazzo

FYI, no Ubuntu o nome do arquivo deste IP aluga registro contém lxc nome ponte por exemplodnsmasq.lxcbr0.leases
Flint

7

Tecnicamente falando, você deve poder se lxc-attachconectar e disparar em um comando (e processar a saída), da seguinte maneira:

sudo lxc-attach --name containername -- ifconfig

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

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


E, é claro, atualize-o para ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2apenas o endereço IP.
Oli

Infelizmente, estou recebendo o mesmo tipo de erro. No such file or directory - failed to open '/proc/28741/ns/pid'e failed to enter the namespace. Eu encontrei um erro que descreve o problema com precisão, mas é a partir de 2010.
Stefano Palazzo

Eu tive que usar o caminho completo para ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli

Como o help.ubuntu.com/12.04/serverguide/lxc.html diz, o lxc-attach não é suportado.
Ciastek

5

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

Se chamando através de um script, você mesmo pode fazer lxc-info -n $name -Hipara obter apenas o IP sem espaços extranneous
Julian H. Lam

4

Ou consulte dnsmasq (que fornece IPs para os contêineres)

dig @10.0.3.1 $container-name +short

2

Versão do 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

1

O comando abaixo substitui o lxc-attachexemplo na postagem anterior

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

É executado ifconfigdentro 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 maiores investigações.


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 $2}' | cut -d/ -f1

0

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


0

Deixe o dnsmasq fazer isso por você.

Configure a instância dnsmasq da 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, remova o comentário desta linha:

LXC_DOMAIN="lxc"

Se a instância dnsmasq do seu host for iniciada pelo NetworkManager (como é o caso das instalações de desktop Ubuntu atuais), 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 do 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

Pode ser necessário reiniciar seus contêineres lxc ou fazê-los solicitar novas concessões DHCP antes que eles apareçam no DNS. (Não me lembro se era necessário quando fiz isso.) Também vale a pena mencionar que vi um relatório de erro sobre o lxc-net não captar as alterações do dnsmasq quando ele foi reiniciado, portanto, você pode querer reiniciar o sistema host apenas para ter certeza.

Então tente:

$ host mycontainer.lxc
mycontainer.lxc has address 10.0.3.21

$ ssh ubuntu@mycontainer.lxc
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
ubuntu@mycontainer:~$

0

Resposta simples é

sudo lxc-ls -f | grep "container_name"

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.