Come posso ottenere l'indirizzo IP di un contenitore LXC?


19

Ho scritto alcuni script per gestire i contenitori LXC e posso ottenere i loro indirizzi IP tramite ifconfig, supponendo che io sia connesso alla console.

Ora voglio collegarmi a questi contenitori tramite ssh. Come posso ottenere il loro indirizzo IP in modo tale da poter scrivere uno script? Inoltre, non voglio impostare manualmente gli indirizzi (ma lo farò, se questa è l'unica opzione).

Finora, ho provato a utilizzare lxc-start, ma la macchina non ha un indirizzo IP prima di eseguire /sbin/init.


Lo stesso problema qui, relativo a questo bug report, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 che contiene informazioni di conferma su questo non funziona in Ubuntu 16.04 Server Editions, ma va bene su Desktop dove dnsmasq è avviato da NetworkManager (come suggerito in; askubuntu.com/a/545265/599087 da 'forest'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Risposte:


10

Il modo più semplice per farlo ora è:

lxc-info -n container-name -iH

Ciò restituisce l'indirizzo IP senza altro testo.

L' -iopzione specifica che l'indirizzo IP deve essere restituito e l' -Hopzione disabilita l'output leggibile dall'uomo, ad esempio le etichette. Per maggiori informazioni, consultare la pagina man lxc-info .

EDIT per la versione più recente di LXC:

lxc info container-name

Quindi ottieni informazioni dettagliate. Guarda il blocco "Ips:", che dovrebbe assomigliare a quello qui sotto. Si potrebbe prendere uno per prendere il primo indirizzo IPv4 ( 10.121.48.241) in questo caso:

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

Lavorando con LXD e contenitori non privilegiati, questo comando non è utile. Come otterresti queste informazioni con i contenitori non privilegiati predefiniti promossi da LXD nel 2017?
jgomo3,

10

Visto che le cose in esecuzione nei container non sembrano essere supportate in Ubuntu, il mio suggerimento successivo è quello di esaminare i contratti di locazione degli indirizzi IP che dnsmasqvengono distribuiti. È davvero semplice:

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

Ci sono solo due parti che possono essere utili, quindi possiamo formattarlo molto meglio:

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

Funziona perfettamente!
Stefano Palazzo

2
Per riferimento: le nuove versioni di LXC (ovvero quella in Raring) mostrano l'indirizzo IP nell'output di lxc-ls --fancy.
Stefano Palazzo

Cordiali saluti, su Ubuntu il nome file di questo record di leasing IP contiene il nome del bridge lxc, ad esempiodnsmasq.lxcbr0.leases
Flint,

7

Tecnicamente parlando dovresti essere in grado di usare lxc-attachper connetterti e lanciare un comando (ed elaborare l'output), in questo modo:

sudo lxc-attach --name containername -- ifconfig

Ciò richiede che il contenitore sia in esecuzione.

Nota: non sono riuscito a farlo funzionare. Ho installato LXC e l'ho provato, ma ho appena visto un sacco di errori nello spazio dei nomi, file mancanti e altre sciocchezze. Ma la mia unica esperienza con LXC sono i 10 minuti che ho trascorso su questa domanda. Potrebbe funzionare Potrebbe no. In bocca al lupo!


E, naturalmente, aggiornalo a ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2se vuoi solo l'indirizzo IP.
Oli

Purtroppo sto ricevendo lo stesso tipo di errori. No such file or directory - failed to open '/proc/28741/ns/pid'e failed to enter the namespace. Ho trovato un bug che descrive esattamente il problema, ma è del 2010.
Stefano Palazzo

Ho dovuto usare il percorso completo per ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli,

Come dice help.ubuntu.com/12.04/serverguide/lxc.html , lxc -attach non è supportato.
Ciastek,

5

Funziona su Ubuntu 14.04:

lxc-info -n $name -i

e se vuoi solo l'indirizzo IP (utile per gli script), (grazie @JulianHLam):

lxc-info -n $name -iH

Se chiami tramite uno script, puoi anche fare solo lxc-info -n $name -Hiper ottenere l'IP senza spazi bianchi estranei
Julian H. Lam

4

Oppure interroga dnsmasq (che fornisce gli IP ai contenitori)

dig @10.0.3.1 $container-name +short

2

Versione Python per farlo:

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

Il comando seguente sostituisce l' lxc-attachesempio nel post precedente

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

Funziona ifconfigall'interno del contenitore e mostra l'output.

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

Sembra che qualcosa non sia configurato correttamente. Come soluzione alternativa ho usato il modello di configurazione predefinito fornito dalla documentazione di LXC per farlo funzionare senza ulteriori indagini.


1

Se si esegue LXD, è possibile che questo comando sia utile per ottenere l'indirizzo IP di un contenitore in esecuzione

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

Lascia che dnsmasq lo faccia per te.

Configurare l'istanza dnsmasq della macchina host per eseguire una query sull'istanza dnsmasq di lxc per il dominio di primo livello .lxc.

In / etc / default / lxc-net, decommenta questa riga:

LXC_DOMAIN="lxc"

Se l'istanza dnsmasq del tuo host è avviata da NetworkManager (come nel caso della maggior parte delle installazioni desktop Ubuntu correnti) crea un file chiamato /etc/NetworkManager/dnsmasq.d/lxc.conf con questa riga all'interno:

server=/lxc/10.0.3.1

Se il dnsmasq del tuo host è lanciato da qualcosa di diverso da NetworkManager, aggiungi invece quella linea a /etc/dnsmasq.d-available/lxc:

server=/lxc/10.0.3.1

Quindi riavvia le cose in modo che raccolgano le modifiche:

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

Potrebbe essere necessario riavviare i contenitori lxc o fare in modo che richiedano nuovi lease DHCP prima che vengano visualizzati in DNS. (Non ricordo se era necessario quando l'ho fatto.) Vale anche la pena ricordare che ho visto una segnalazione di bug su lxc-net che non rilevava le modifiche di dnsmasq quando è stato riavviato, quindi potresti voler riavviare il tuo sistema host solo per essere sicuro.

Quindi provalo:

$ 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

La risposta è semplice

sudo lxc-ls -f | grep "container_name"

Se non ricordi il nome_contenitore, digita sudo lxc-ls -f.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.