Come ottengo l'indirizzo IP di un container LXC?

19

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

Ora voglio connettermi a questi contenitori tramite ssh. Come ottengo 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 .

    
posta Stefano Palazzo 18.03.2013 - 17:41

11 risposte

9

Il modo più semplice per farlo ora è:

lxc-info -n container-name -iH

Questo restituisce l'indirizzo IP senza altro testo.

L'opzione -i specifica che l'indirizzo IP deve essere restituito e l'opzione -H disabilita l'output leggibile dall'uomo, cioè le etichette. Per maggiori informazioni vedi la pagina man di lxc-info .

    
risposta data Andy 14.05.2015 - 15:02
10

Visto che le cose in esecuzione nei contenitori non sembrano essere supportate in Ubuntu, il mio prossimo suggerimento migliore è quello di esaminare i lease degli indirizzi IP che dnsmasq sta distribuendo. È molto 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 sono di qualche utilità, quindi possiamo formattarlo molto più bello:

$ awk '{ print , }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83
    
risposta data Oli 19.03.2013 - 14:03
7

Tecnicamente parlando dovresti essere in grado di usare lxc-attach per connetterti e sparare in 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 ho potuto farlo funzionare. Ho installato LXC e l'ho provato, ma ho visto solo una manciata di errori di namespace, file mancanti e altre sciocchezze. Ma la mia unica esperienza con LXC sono i 10 minuti che ho dedicato a questa domanda. Potrebbe funzionare. Potrebbe non farlo. Buona fortuna!

    
risposta data Oli 18.03.2013 - 18:21
5

Funziona su Ubuntu 14.04:

lxc-info -n $name -i

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

lxc-info -n $name -iH
    
risposta data vaab 11.04.2014 - 13:07
4

Oppure query dnsmasq (che fornisce IP ai contenitori)

dig @10.0.3.1 $container-name +short
    
risposta data Carl Hörberg 21.08.2013 - 13:12
1

Il comando qui sotto sostituisce lxc-attach esempio nel post precedente

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

Esegue ifconfig all'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 temporanea, ho utilizzato il modello di configurazione predefinito fornito dalla documentazione LXC per farlo funzionare senza ulteriori indagini.

    
risposta data cfalguiere 31.01.2014 - 18:29
1

Se stai usando LXD, potresti trovare utile questo comando per ottenere l'indirizzo IP di un contenitore in esecuzione

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1
    
risposta data anastymous 14.07.2016 - 02:09
1

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
    
risposta data Ektor 04.11.2016 - 11:55
0

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

    
risposta data ramigg 05.05.2014 - 14:16
0

Lascia che dnsmasq faccia tutto per te.

Configura l'istanza dnsmasq della tua macchina host per interrogare l'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 di dnsmasq del tuo host viene lanciata da NetworkManager (come nel caso delle più attuali installazioni desktop di Ubuntu) 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 viene lanciato da qualcosa di diverso da NetworkManager, aggiungi quella riga a /etc/dnsmasq.d-available/lxc invece:

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 farli richiedere nuovi lease DHCP prima che vengano visualizzati in DNS. (Non ricordo se fosse necessario quando l'ho fatto.) Vale anche la pena ricordare che ho visto una segnalazione di bug su lxc-net che non ha raccolto le modifiche di dnsmasq quando è stato riavviato, quindi potresti voler riavviare il tuo sistema host per essere sicuro.

Quindi prova:

$ 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)
[email protected]:~$
    
risposta data ʇsәɹoɈ 03.11.2014 - 21:17
0

La risposta semplice è

sudo lxc-ls -f | grep "container_name"

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

    
risposta data user646873 26.01.2017 - 08:12

Leggi altre domande sui tag