Jak uzyskać adres IP kontenera LXC?


19

Napisałem kilka skryptów do zarządzania kontenerami LXC i mogę uzyskać ich adresy IP poprzez ifconfig, zakładając, że jestem podłączony do konsoli.

Chcę teraz połączyć się z tymi kontenerami przez ssh. Jak uzyskać ich adres IP w taki sposób, że mogę napisać skrypt? Nie chcę też ustawiać adresów ręcznie (ale zrobię to, jeśli to jedyna opcja).

Do tej pory próbowałem używać lxc-start, ale maszyna nie ma adresu IP przed uruchomieniem /sbin/init.


Ten sam problem tutaj, związany z tym raportem o błędzie , bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954, który zawiera informacje potwierdzające, że nie działa w Ubuntu 16.04 Server Edtions, ale działa poprawnie na komputerach stacjonarnych, na których jest dnsmasq wykopany przez NetworkManager (jak sugerowano w; askubuntu.com/a/545265/599087 przez „forest”). osdir.com/ml/ubuntu-bugs 2016-10
OpenITeX

Odpowiedzi:


10

Najłatwiej to zrobić teraz:

lxc-info -n container-name -iH

Zwraca adres IP bez żadnego innego tekstu.

Do -iopcja określa, czy adres IP powinien być zwrócony i -Hwyłącza opcja człowieka wyjściowe czytelny tj etykiet. Aby uzyskać więcej informacji zobacz lxc-info stronę man .

EDYCJA dla nowszej wersji LXC:

lxc info container-name

Następnie otrzymasz szczegółowe informacje. Spójrz na blok „Ips:”, który powinien wyglądać jak ten poniżej. W takim przypadku możesz pobrać pierwszy adres IPv4 ( 10.121.48.241):

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

Ta komenda nie działa w LXD i nieuprzywilejowanych kontenerach. Jak uzyskasz te informacje przy użyciu domyślnych nieuprzywilejowanych kontenerów promowanych przez LXD w 2017 roku?
jgomo3

10

Ponieważ wydaje się, że uruchamianie rzeczy w kontenerach nie jest obsługiwane w Ubuntu, moją następną najlepszą propozycją jest przyjrzenie się dzierżawionym adresom IP dnsmasq. To naprawdę proste:

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

Istnieją tylko dwie części, które są przydatne, więc możemy sformatować je o wiele ładniej:

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

To działa idealnie!
Stefano Palazzo

2
Dla odniesienia: nowe wersje LXC (tj. Ta w Raring) pokazują adres IP na wyjściu lxc-ls --fancy.
Stefano Palazzo

Do Twojej wiadomości, w Ubuntu nazwa tego pliku najmu IP zawiera nazwę mostu lxc, np.dnsmasq.lxcbr0.leases
Flint

7

Technicznie rzecz biorąc, powinieneś być w stanie użyć lxc-attachdo połączenia i odpalenia polecenia (i przetworzenia danych wyjściowych), w następujący sposób:

sudo lxc-attach --name containername -- ifconfig

Wymaga to działania kontenera.

Uwaga: nie mogłem tego uruchomić. Zainstalowałem LXC i spróbowałem tego, ale właśnie zobaczyłem masę błędów przestrzeni nazw, brakujących plików i innych bzdur. Ale moje jedyne doświadczenie z LXC to 10 minut, które spędziłem na tym pytaniu. To może zadziałać. Może nie. Powodzenia!


I oczywiście uaktualnij to, ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2jeśli chcesz tylko adres IP.
Oli

Niestety dostaję ten sam rodzaj błędów. No such file or directory - failed to open '/proc/28741/ns/pid'a failed to enter the namespace. Znalazłem błąd, który dokładnie opisuje problem, ale pochodzi z 2010 roku.
Stefano Palazzo

Musiałem użyć pełnej ścieżki do ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli,

Jak mówi help.ubuntu.com/12.04/serverguide/lxc.html , lxc-attach nie jest obsługiwany.
ciastek

5

Działa to na Ubuntu 14.04:

lxc-info -n $name -i

a jeśli chcesz tylko adres IP (przydatne dla skryptów), (dzięki @JulianHLam):

lxc-info -n $name -iH

Jeśli dzwonisz za pomocą skryptu, możesz nawet lxc-info -n $name -Hiuzyskać adres IP bez obcych znaków
Julian H. Lam

4

Lub zapytanie dnsmasq (który daje adresy IP kontenerom)

dig @10.0.3.1 $container-name +short

2

Wersja Python, aby to zrobić:

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

Poniższe polecenie zastępuje lxc-attachprzykład w poprzednim poście

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

Działa ifconfigwewnątrz kontenera i pokazuje wynik.

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

Wygląda na to, że coś nie jest poprawnie skonfigurowane. Aby obejść ten problem, wykorzystałem predefiniowany szablon konfiguracji dostarczony przez dokumentację LXC, aby działał bez dalszych badań.


1

Jeśli korzystasz z LXD, możesz uznać to polecenie za przydatne do uzyskania adresu IP działającego kontenera

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


0

Pozwól dnsmasq zrobić to za Ciebie.

Skonfiguruj wystąpienie dnsmasq na komputerze hosta, aby wyszukiwać wystąpienie dnsmasq w lxc dla domeny najwyższego poziomu .lxc.

W / etc / default / lxc-net, odkomentuj ten wiersz:

LXC_DOMAIN="lxc"

Jeśli instancja dnsmasq twojego hosta jest uruchamiana przez NetworkManager (jak ma to miejsce w przypadku większości aktualnych instalacji Ubuntu na komputerze), utwórz plik o nazwie /etc/NetworkManager/dnsmasq.d/lxc.conf z tą linią wewnątrz:

server=/lxc/10.0.3.1

Jeśli dnsmasq twojego hosta jest uruchamiany przez coś innego niż NetworkManager, dodaj tę linię do /etc/dnsmasq.d-available/lxc:

server=/lxc/10.0.3.1

Następnie uruchom ponownie, aby pobrać zmiany:

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

Konieczne może być ponowne uruchomienie kontenerów LXC lub zmuszenie ich do zażądania nowych dzierżaw DHCP, zanim pojawią się one w DNS. (Nie pamiętam, czy było to konieczne, kiedy to zrobiłem.) Warto również wspomnieć, że widziałem raport o błędzie dotyczący tego, że lxc-net nie wykrywa zmian dnsmasq po ponownym uruchomieniu, więc możesz chcieć ponownie uruchomić system hosta po prostu być pewnym.

Następnie spróbuj:

$ 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

Prosta odpowiedź brzmi

sudo lxc-ls -f | grep "container_name"

Jeśli nie pamiętasz nazwy_kontenera, po prostu wpisz sudo lxc-ls -f.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.