web-dev-qa-db-fra.com

Comment obtenir l'adresse IP d'un conteneur LXC?

J'ai écrit quelques scripts pour gérer les conteneurs LXC et je peux obtenir leurs adresses IP via ifconfig, en supposant que je sois connecté à la console.

Je souhaite maintenant me connecter à ces conteneurs via ssh. Comment puis-je obtenir leur adresse IP de manière à pouvoir écrire un script? Je ne veux pas non plus définir les adresses manuellement (mais je le ferai si c'est la seule option).

Jusqu'ici, j'ai essayé d'utiliser lxc-start, mais la machine n'a pas d'adresse IP avant d'exécuter /sbin/init.

19
Stefano Palazzo

Le moyen le plus simple de faire cela maintenant est:

lxc-info -n container-name -iH

Cela renvoie l'adresse IP sans autre texte.

L'option -i spécifie que l'adresse IP doit être renvoyée et l'option -H désactive la sortie lisible par l'homme, c'est-à-dire les étiquettes. Pour plus d'informations, voir lxc-info page de manuel .

EDIT pour les versions plus récentes de LXC:

lxc info container-name

Ensuite, vous obtenez des informations détaillées. Regardez le bloc "Ips:", qui devrait ressembler à celui ci-dessous. Vous pouvez peut-être saisir la première adresse IPv4 (10.121.48.241) dans ce cas:

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

Étant donné que l'exécution d'objets dans des conteneurs ne semble pas être prise en charge dans Ubuntu, ma meilleure suggestion consiste à examiner les baux d'adresse IP que dnsmasq distribue. C'est vraiment simple:

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

Il n'y a que deux parties qui sont utiles, nous pouvons donc le formater beaucoup plus agréablement:

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

Techniquement, vous devriez pouvoir utiliser lxc-attach pour vous connecter et déclencher une commande (et traiter la sortie), comme suit:

Sudo lxc-attach --name containername -- ifconfig

Cela nécessite que le conteneur soit en cours d'exécution.

Note: Je ne pouvais pas faire fonctionner ça. J'ai installé LXC et essayé cela, mais je viens de voir une multitude d’erreurs d’espace de noms, de fichiers manquants et d’autres absurdités. Mais ma seule expérience avec LXC, ce sont les 10 minutes que j'ai passées sur cette question. Cela peut fonctionner. Il se peut que non. Bonne chance!

7
Oli

Cela fonctionne sur Ubuntu 14.04:

lxc-info -n $name -i

et si vous voulez seulement l'adresse IP (utile pour les scripts), (merci @JulianHLam):

lxc-info -n $name -iH
5
vaab

Ou interrogez Dnsmasq (qui donne les adresses IP aux conteneurs)

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

Version Python pour le faire:

#!/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 vous exécutez LXD, cette commande peut s'avérer utile pour obtenir l'adresse IP d'un conteneur en cours d'exécution.

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

La commande ci-dessous remplace l'exemple lxc-attach du message précédent

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

Il exécute ifconfig dans le conteneur et affiche le résultat.

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

Cela ressemble à quelque chose qui n'est pas configuré correctement. Pour contourner le problème, j'ai utilisé le modèle de configuration prédéfini fourni par la documentation LXC pour le faire fonctionner sans enquête supplémentaire.

1
cfalguiere

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

0
ramigg

La réponse simple est

Sudo lxc-ls -f | grep "container_name"

Si vous ne vous souvenez pas du nom du conteneur, tapez simplement Sudo lxc-ls -f.

0
user646873

Laissez Dnsmasq le faire pour vous.

Configurez l'instance dnsmasq de votre ordinateur hôte pour interroger l'instance dnsmasq de lxc pour le domaine de premier niveau .lxc.

Dans/etc/default/lxc-net, décommentez cette ligne:

LXC_DOMAIN="lxc"

Si NetworkManager lance l'instance dnsmasq de votre hôte (comme dans le cas des installations de bureau Ubuntu les plus récentes), créez un fichier appelé /etc/NetworkManager/dnsmasq.d/lxc.conf avec cette ligne:

server=/lxc/10.0.3.1

Si le dnsmasq de votre hôte est lancé par autre chose que NetworkManager, ajoutez cette ligne à /etc/dnsmasq.d-available/lxc à la place:

server=/lxc/10.0.3.1

Ensuite, redémarrez les objets pour qu'ils prennent en compte les modifications:

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

Vous devrez peut-être redémarrer vos conteneurs lxc ou leur demander de nouveaux baux DHCP avant qu'ils n'apparaissent dans DNS. (Je ne me souviens pas si c'était nécessaire quand j'ai fait cela.) Il est également intéressant de noter que j'ai vu un rapport de bogue sur le fait que lxc-net ne prend pas en compte les modifications de Dnsmasq lors de son redémarrage. Vous voudrez peut-être simplement redémarrer votre système hôte. pour être sûr.

Alors essayez-le:

$ 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:~$
0
ʇsәɹoɈ