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
.
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
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
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!
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
O consulta dnsmasq (que proporciona IP a los contenedores)
Dig @10.0.3.1 $container-name +short
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
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
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.
Sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1
La respuesta simple es
Sudo lxc-ls -f | grep "container_name"
Si no recuerda el nombre_contenedor, simplemente escriba Sudo lxc-ls -f.
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]:~$