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

19

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

Je veux 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'à présent, j'ai essayé d'utiliser lxc-start, mais la machine n'a pas d'adresse IP avant de courir /sbin/init.

Stefano Palazzo
la source
Même problème ici, lié à ce rapport de bogue, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 qui contient des informations corroborantes sur cela ne fonctionne pas dans Ubuntu 16.04 Server Edtions, mais est correct dans les bureaux où dnsmasq est coup de pied de NetworkManager (comme suggéré dans; askubuntu.com/a/545265/599087 par 'forest'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Réponses:

10

La façon la plus simple de le faire maintenant est:

lxc-info -n container-name -iH

Cela renvoie l'adresse IP sans autre texte.

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

EDIT pour la nouvelle version 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 pourriez 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
Andy
la source
Fonctionnant avec LXD et des conteneurs non privilégiés, cette commande n'est pas utile. Comment obtiendriez-vous ces informations avec les conteneurs non classés par défaut promus par LXD en 2017?
jgomo3
10

Vu que l'exécution de choses dans des conteneurs ne semble pas être prise en charge dans Ubuntu, ma prochaine meilleure suggestion est de regarder les baux d'adresses IP qui dnsmasqsont distribués. 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 formater cela beaucoup mieux:

$ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83
Oli
la source
Cela fonctionne parfaitement!
Stefano Palazzo
2
Pour référence: les nouvelles versions de LXC (c'est-à-dire celle de Raring) affichent l'adresse IP dans la sortie de lxc-ls --fancy.
Stefano Palazzo
Pour info, sur Ubuntu, le nom de fichier de cet enregistrement de baux IP contient le nom du pont lxc, par exemplednsmasq.lxcbr0.leases
Flint
7

Techniquement parlant, vous devriez pouvoir utiliser lxc-attachpour vous connecter et tirer dans une commande (et traiter la sortie), comme ceci:

sudo lxc-attach --name containername -- ifconfig

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

Remarque: je n'ai pas pu faire fonctionner cela. J'ai installé LXC et essayé cela, mais je viens de voir un tas d'erreurs d'espace de noms, de fichiers manquants et d'autres bêtises. Mais ma seule expérience avec LXC est les 10 minutes que j'ai passées sur cette question. Cela peut fonctionner. Il se pourrait que non. Bonne chance!

Oli
la source
Et bien sûr, ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2mettez-le à niveau si vous voulez juste l'adresse IP.
Oli
Malheureusement, je reçois le même genre d'erreurs. No such file or directory - failed to open '/proc/28741/ns/pid'et failed to enter the namespace. J'ai trouvé un bug qui décrit précisément le problème, mais il date de 2010.
Stefano Palazzo
J'ai dû utiliser le chemin complet vers ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli
Comme help.ubuntu.com/12.04/serverguide/lxc.html le dit, lxc-attach n'est pas pris en charge.
ciastek
5

Cela fonctionne sur Ubuntu 14.04:

lxc-info -n $name -i

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

lxc-info -n $name -iH
vaab
la source
Si vous appelez via un script, vous pouvez même le faire lxc-info -n $name -Hipour obtenir uniquement l'IP sans espace blanc extranet
Julian H. Lam
4

Ou interrogez dnsmasq (qui donne des IP aux conteneurs)

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

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
Ektor
la source
1

La commande ci-dessous remplace l' lxc-attachexemple du post précédent

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

Ça marche ifconfig à l'intérieur du conteneur et affiche la sortie.

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

Il semble que quelque chose ne soit pas configuré correctement. Pour contourner ce problème, j'ai utilisé le modèle de configuration prédéfini fourni par la documentation LXC pour le faire fonctionner sans autre enquête.

cfalguiere
la source
1

Si vous exécutez LXD, vous pouvez trouver cette commande 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
anastyme
la source
0

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

ramigg
la source
0

Laissez dnsmasq le faire pour vous.

Configurez l'instance dnsmasq de votre machine 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 l'instance dnsmasq de votre hôte est lancée par NetworkManager (comme c'est le cas avec la plupart des installations de bureau Ubuntu actuelles) créez un fichier appelé /etc/NetworkManager/dnsmasq.d/lxc.conf avec cette ligne à l'intérieur:

server=/lxc/10.0.3.1

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

server=/lxc/10.0.3.1

Redémarrez ensuite les choses pour qu'elles reprennent 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 faire demander de nouveaux baux DHCP avant qu'ils n'apparaissent dans DNS. (Je ne me souviens pas si cela était nécessaire lorsque j'ai fait cela.) Il convient également de mentionner que j'ai vu un rapport de bogue indiquant que lxc-net ne détectait pas les modifications de dnsmasq lors de son redémarrage, vous pouvez donc vouloir redémarrer votre système hôte juste ê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:~$
ʇsәɹoɈ
la source
0

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.

user646873
la source