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

19

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.

Stefano Palazzo
fuente
El mismo problema aquí, relacionado con este informe de error, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 que contiene información corroborativa sobre esto no funciona en Ubuntu 16.04 Server Edtions, pero está bien en escritorios donde dnsmasq es pateado por NetworkManager (como se sugiere en; askubuntu.com/a/545265/599087 por 'bosque'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Respuestas:

10

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 -iopción especifica que se debe devolver la dirección IP y la -Hopción deshabilita la salida legible por humanos, es decir, las etiquetas. Para obtener más información, consulte la página del comando man lxc-info .

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. Puede uno para tomar 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
Andy
fuente
Al trabajar con LXD y contenedores sin privilegios, este comando no sirve. ¿Cómo obtendría esa información con los contenedores sin privilegios predeterminados promovidos por LXD en 2017?
jgomo3
10

Al ver que ejecutar cosas en contenedores no parece ser compatible con Ubuntu, mi siguiente mejor sugerencia es mirar los contratos de arrendamiento de direcciones IP que dnsmasqse están 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
Oli
fuente
Eso funciona perfectamente!
Stefano Palazzo
2
Como referencia: las nuevas versiones de LXC (es decir, la de Raring) muestran la dirección IP en la salida de lxc-ls --fancy.
Stefano Palazzo
Para su información, en Ubuntu, el nombre de archivo de este registro de alquileres IP contiene el nombre del puente lxc, por ejemplodnsmasq.lxcbr0.leases
Flint,
7

Técnicamente hablando, debería poder usar lxc-attachpara conectarse y disparar 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!

Oli
fuente
Y, por supuesto, actualícelo ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2si solo desea la dirección IP.
Oli
Lamentablemente estoy recibiendo el mismo tipo de errores. No such file or directory - failed to open '/proc/28741/ns/pid'y failed to enter the namespace. Encontré un error que describe el problema con precisión, pero es de 2010.
Stefano Palazzo
Tuve que usar la ruta completa a ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli
Como help.ubuntu.com/12.04/serverguide/lxc.html dice, lxc-attach no es compatible.
ciastek
5

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
vaab
fuente
Si llama a través de un script, incluso puede hacerlo lxc-info -n $name -Hipara obtener solo la IP sin espacios en blanco extranjeros
Julian H. Lam
4

O consulta dnsmasq (que proporciona IP a los contenedores)

dig @10.0.3.1 $container-name +short
Carl Hörberg
fuente
2

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
Ektor
fuente
1

El siguiente comando reemplaza el lxc-attachejemplo en la publicación anterior

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

Se ejecuta ifconfigdentro 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 usado la plantilla de configuración predefinida proporcionada por la documentación de LXC para que funcione sin más investigación.

cfalguiere
fuente
1

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
anastymous
fuente
0

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

ramigg
fuente
0

Deja que dnsmasq lo haga por ti.

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)
ubuntu@mycontainer:~$
ʇsәɹoɈ
fuente
0

La respuesta simple es

sudo lxc-ls -f | grep "container_name"

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

usuario646873
fuente