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
.
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
É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
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!
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
Ou interrogez Dnsmasq (qui donne les adresses IP aux conteneurs)
Dig @10.0.3.1 $container-name +short
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
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
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.
Sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1
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.
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:~$