Wie erhalte ich die IP-Adresse eines LXC-Containers?


19

Ich habe ein paar Skripte geschrieben, um LXC-Container zu verwalten, und ich kann ihre IP-Adressen über ifconfig abrufen, sofern ich mit der Konsole verbunden bin.

Ich möchte mich jetzt mit diesen Containern über ssh verbinden. Wie bekomme ich ihre IP-Adresse so, dass ich ein Skript schreiben kann? Ich möchte die Adressen auch nicht manuell festlegen (aber ich werde es tun, wenn dies die einzige Option ist).

Bisher habe ich versucht, zu verwenden lxc-start, aber der Computer hat keine IP-Adresse, bevor ich ausgeführt werde /sbin/init.


Das gleiche Problem hier, im Zusammenhang mit diesem Fehler-Bericht, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 , die auf diese bestätigenden Informationen enthält nicht funktioniert in Ubuntu 16.04 Server Edtions, aber sein ok in Desktops , wo dnsmasq ist von NetworkManager verworfen (wie in; askubuntu.com/a/545265/599087 von 'forest' vorgeschlagen). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX 13.10.16

Antworten:


10

Der einfachste Weg, dies jetzt zu tun, ist:

lxc-info -n container-name -iH

Dies gibt die IP-Adresse ohne weiteren Text zurück.

Die -iOption gibt an, dass die IP-Adresse zurückgegeben werden soll, und -Hdeaktiviert die von Menschen lesbare Ausgabe, dh Beschriftungen. Weitere Informationen finden Sie in der lxc-info Manpage .

EDIT für neuere Version von LXC:

lxc info container-name

Dann bekommst du ausführliche Infos. Schauen Sie sich den "Ips:" - Block an, der wie der folgende aussehen sollte. 10.121.48.241In diesem Fall können Sie die erste IPv4-Adresse ( ) abrufen:

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

In Verbindung mit LXD und nichtprivilegierten Containern ist dieser Befehl nicht von Nutzen. Wie würden Sie diese Informationen mit den von LXD im Jahr 2017 beworbenen unprivillierten Standardcontainern erhalten?
jgomo3

10

Da das Ausführen von Dingen in Containern in Ubuntu anscheinend nicht unterstützt wird, ist mein nächster bester Vorschlag, sich die IP-Adress-Leases anzusehen, die dnsmasqverteilt werden. Das ist ganz einfach:

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

Es gibt nur zwei Teile, die von Nutzen sind, so dass wir sie viel besser formatieren können:

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

Das funktioniert einwandfrei
Stefano Palazzo

2
Als Referenz: Neue Versionen von LXC (dh die in Raring) zeigen die IP-Adresse in der Ausgabe von an lxc-ls --fancy.
Stefano Palazzo

Zu Ihrer Information, auf Ubuntu enthält der Dateiname dieses IP-Leasing-Datensatzes den Namen der lxc-Brücke, z. B.dnsmasq.lxcbr0.leases
Flint,

7

Technisch gesehen sollten Sie in der Lage sein, lxc-attacheinen Befehl zu verbinden und auszulösen (und die Ausgabe zu verarbeiten):

sudo lxc-attach --name containername -- ifconfig

Dies setzt voraus, dass der Container ausgeführt wird.

Hinweis: Ich konnte das nicht zum Laufen bringen. Ich habe LXC installiert und dies ausprobiert, aber nur eine Menge Namespace-Fehler, fehlende Dateien und anderen Unsinn gesehen. Meine einzige Erfahrung mit LXC sind die 10 Minuten, die ich mit dieser Frage verbracht habe. Es könnte funktionieren. Es könnte nicht sein. Viel Glück!


Aktualisieren Sie das natürlich auf, ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2wenn Sie nur die IP-Adresse möchten.
Oli

Leider erhalte ich die gleiche Art von Fehlern. No such file or directory - failed to open '/proc/28741/ns/pid'und failed to enter the namespace. Ich habe einen Fehler gefunden , der das Problem genau beschreibt, aber er stammt aus dem Jahr 2010.
Stefano Palazzo

Ich musste den vollständigen Pfad zu ifconfig verwenden: lxc-attach -n container / sbin / ifconfig
Epeli

Wie help.ubuntu.com/12.04/serverguide/lxc.html sagt, wird lxc-Attach nicht unterstützt.
ciastek

5

Dies funktioniert unter Ubuntu 14.04:

lxc-info -n $name -i

und wenn du nur die IP-Adresse willst (nützlich für Skripte), (danke @JulianHLam):

lxc-info -n $name -iH

Wenn Sie über ein Skript anrufen, können Sie sogar tun lxc-info -n $name -Hi, um nur die IP ohne extranneous Whitespace zu erhalten
Julian H. Lam

4

Oder fragen Sie dnsmasq ab (das den Containern IPs gibt)

dig @10.0.3.1 $container-name +short

2

Python-Version, um es zu tun:

#!/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

1

Der folgende Befehl ersetzt das lxc-attachBeispiel im vorherigen Beitrag

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

Es läuft ifconfigim Container und zeigt die Ausgabe.

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

Es hört sich so an, als ob etwas nicht richtig konfiguriert ist. Um dieses Problem zu umgehen, habe ich die vordefinierte Konfigurationsvorlage aus der LXC-Dokumentation verwendet, damit sie ohne weitere Untersuchung funktioniert.


1

Wenn Sie LXD ausführen, ist dieser Befehl möglicherweise hilfreich, um die IP-Adresse eines ausgeführten Containers abzurufen

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

0

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


0

Lassen Sie dnsmasq das für Sie tun.

Konfigurieren Sie die dnsmasq-Instanz Ihres Hostcomputers so, dass die dnsmasq-Instanz von lxc nach der .lxc-Domäne der obersten Ebene abgefragt wird.

Kommentar in / etc / default / lxc-net entfernen:

LXC_DOMAIN="lxc"

Wenn die dnsmasq-Instanz Ihres Hosts von NetworkManager gestartet wird (wie dies bei den meisten aktuellen Ubuntu-Desktop-Installationen der Fall ist), erstellen Sie eine Datei mit dem Namen /etc/NetworkManager/dnsmasq.d/lxc.conf mit folgender Zeile:

server=/lxc/10.0.3.1

Wenn dnsmasq Ihres Hosts nicht über NetworkManager gestartet wird, fügen Sie diese Zeile stattdessen zu /etc/dnsmasq.d-available/lxc hinzu:

server=/lxc/10.0.3.1

Starten Sie dann die Dinge neu, damit sie die Änderungen übernehmen:

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

Möglicherweise müssen Sie Ihre lxc-Container neu starten oder neue DHCP-Leases anfordern, bevor sie in DNS angezeigt werden. (Ich erinnere mich nicht, ob es notwendig war, als ich das getan habe.) Es ist auch erwähnenswert, dass ich einen Fehlerbericht darüber gesehen habe, dass lxc-net dnsmasq-Änderungen nicht übernommen hat, als es neu gestartet wurde um sicher zu sein.

Dann probiere es aus:

$ host mycontainer.lxc
mycontainer.lxc has address 10.0.3.21

$ ssh ubuntu@mycontainer.lxc
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
ubuntu@mycontainer:~$

0

Einfache Antwort ist

sudo lxc-ls -f | grep "container_name"

Wenn Sie sich nicht an den Containernamen erinnern, geben Sie einfach sudo lxc-ls -f ein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.