it-swarm-es.com

¿Cómo obtengo la dirección IP de un contenedor LXC?

He escrito algunos scripts para administrar contenedores LXC, y puedo obtener sus direcciones IP a través de ifconfig, suponiendo que estoy conectado a la consola.

Ahora quiero conectarme a estos contenedores a través de ssh. ¿Cómo obtengo su dirección IP de tal manera que pueda escribir un script? Tampoco quiero establecer las direcciones manualmente (pero lo haré, si esa es la única opción).

Hasta ahora, he intentado usar lxc-start, pero la máquina no tiene una dirección IP antes de ejecutar /sbin/init.

19
Stefano Palazzo

La forma más fácil de hacer esto ahora es:

lxc-info -n container-name -iH

Esto devuelve la dirección IP sin otro texto.

La opción -i especifica que se debe devolver la dirección IP y la opción -H deshabilita la salida legible por humanos, es decir, las etiquetas. Para obtener más información, consulte lxc-info página del manual .

EDITAR para la versión más nueva de LXC:

lxc info container-name

Entonces obtienes información detallada. Mire el bloque "Ips:", que debería verse como el siguiente. Es posible que uno tome la primera dirección IPv4 (10.121.48.241) en este 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
10
Andy

Al ver que ejecutar cosas en contenedores no parece ser compatible con Ubuntu, mi siguiente mejor sugerencia es mirar las concesiones de direcciones IP que dnsmasq está entregando. Eso es realmente simple:

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

Solo hay dos partes que son útiles, por lo que podemos formatearlo mucho mejor:

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

Técnicamente hablando, debería poder usar lxc-attach para conectarse y disparar en un comando (y procesar la salida), así:

Sudo lxc-attach --name containername -- ifconfig

Esto requiere que el contenedor se esté ejecutando.

Nota: No pude hacer que esto funcione. Instalé LXC y probé esto, pero solo vi un montón de errores de espacio de nombres, archivos faltantes y otras tonterías. Pero mi única experiencia con LXC son los 10 minutos que he dedicado a esta pregunta. Podría funcionar. Puede que no. ¡Buena suerte!

7
Oli

Esto funciona en Ubuntu 14.04:

lxc-info -n $name -i

y si solo quieres la dirección IP (útil para scripts), (gracias @JulianHLam):

lxc-info -n $name -iH
5
vaab

O consulta dnsmasq (que proporciona IP a los contenedores)

Dig @10.0.3.1 $container-name +short
4
Carl Hörberg

Versión de Python para hacerlo:

#!/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
2
Ektor

Si está ejecutando LXD, puede encontrar este comando útil para obtener la dirección IP de un contenedor en ejecución

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

El siguiente comando reemplaza el ejemplo _lxc-attach_ en la publicación anterior

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

Se ejecuta ifconfig dentro del contenedor y muestra la salida.

_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 no está configurado correctamente. Como solución alternativa, he utilizado la plantilla de configuración predefinida proporcionada por la documentación de LXC para que funcione sin más investigación.

1
cfalguiere

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

0
ramigg

La respuesta simple es

Sudo lxc-ls -f | grep "container_name"

Si no recuerda el nombre_contenedor, simplemente escriba Sudo lxc-ls -f.

0
user646873

Deje que dnsmasq lo haga por usted

Configure la instancia dnsmasq de su máquina Host para consultar la instancia dnsmasq de lxc para el dominio de nivel superior .lxc.

En/etc/default/lxc-net, descomente esta línea:

LXC_DOMAIN="lxc"

Si NetworkManager lanza la instancia dnsmasq de su Host (como es el caso con la mayoría de las instalaciones de escritorio de Ubuntu actuales), cree un archivo llamado /etc/NetworkManager/dnsmasq.d/lxc.conf con esta línea dentro:

server=/lxc/10.0.3.1

Si el dnsmasq de su Host es lanzado por algo que no sea NetworkManager, agregue esa línea a /etc/dnsmasq.d-available/lxc en su lugar:

server=/lxc/10.0.3.1

Luego reinicie las cosas para que recojan los cambios:

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

Es posible que deba reiniciar sus contenedores lxc o hacer que soliciten nuevas concesiones de DHCP antes de que aparezcan en DNS. (No recuerdo si fue necesario cuando hice esto). También vale la pena mencionar que vi un informe de error sobre lxc-net que no detectaba los cambios de dnsmasq cuando se reiniciaba, por lo que es posible que desee reiniciar su sistema Host solo para estar seguro.

Entonces pruébalo:

$ 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)
[email protected]:~$
0
ʇsәɹoɈ