È possibile avviare il contenitore LXC all'interno del contenitore LXC?


21

È possibile avviare il contenitore LXC all'interno di un altro contenitore LXC?


1
Hai davvero un vero motivo per farlo? Ricorda che qui le domande dovrebbero riguardare i problemi reali che devi affrontare .
Zoredache,

6
Penso che lxc dovrebbe essere in grado di semplificare la migrazione delle VM (e anche il backup + recupero). Ma non sono sicuro dei casi, quando non c'è accesso al sistema operativo host (ad esempio vps economici).
Mikhail,

Risposte:


45

Ho intenzione di sfatare alcuni miti qui.

Questa è solo una cattiva idea. Mi dispiace. - Jacob 5 marzo alle 20:30

Non vedo come questa sia una cattiva idea. È davvero solo un chroot dentro un chroot. Da un lato, potrebbe eventualmente ridurre le prestazioni in modo trascurabile (nulla rispetto all'esecuzione di una macchina virtuale in una macchina virtuale). D'altra parte, è probabile che sia più sicuro (ad es. Più isolato dal sistema host di root e dai suoi componenti).

Hai davvero un vero motivo per farlo? Ricorda che qui le domande dovrebbero riguardare i problemi reali che devi affrontare. - Zoredache il 5 marzo alle 21:52

Sono d'accordo al 100% con il seguente commento del poster. Inoltre, penso che sia sicuro presumere che tutti coloro che postano una domanda qui probabilmente pensano di avere un vero motivo per farlo.

Penso che lxc dovrebbe essere in grado di semplificare la migrazione delle VM (e anche il backup + recupero). Ma non sono sicuro dei casi, quando non c'è accesso al sistema operativo host (ad esempio vps economici). - Mikhail, 6 marzo alle 11:17

In realtà mi sono imbattuto in questa domanda a giugno, quando mi sono immerso per la prima volta in LXC per i progetti PaaS / IaaS, ed ero particolarmente interessato alla capacità di consentire agli utenti di emulare gli ambienti cloud per scopi di sviluppo.

LXCeption. Siamo troppo profondi. - Tom O'Connor il 6 marzo alle 22:46

Ho riso un po 'quando ho letto questo, ma non è affatto così :)

Ad ogni modo, alla fine ho impostato un ambiente VirtualBox con un'installazione stock di Ubuntu 12.04 LTS Server Edition dopo aver letto tutto ciò, pensando che fosse possibile al 100%. Dopo aver installato LXC, ho creato un nuovo contenitore e installato LXC all'interno del contenitore con apt-get. La maggior parte dell'installazione è andata bene, ma alla fine ha provocato un errore a causa di un problema con il pacchetto cgroup-lite, il cui processo di avvio non è stato avviato dopo l'installazione del pacchetto.

Dopo un po 'di ricerche, mi sono imbattuto in questo bell'articolo su stgraber.org (le chicche si nascondono nella sezione "Nesting dei container"):

sudo apt-get install lxc
sudo lxc-create -t ubuntu -n my-host-container -t ubuntu
sudo wget https://www.stgraber.org/download/lxc-with-nesting -O /etc/apparmor.d/lxc/lxc-with-nesting
sudo /etc/init.d/apparmor reload
sudo sed -i "s/#lxc.aa_profile = unconfined/lxc.aa_profile = lxc-container-with-nesting/" /var/lib/lxc/my-host-container/config
sudo lxc-start -n my-host-container
(in my-host-container) sudo apt-get install lxc
(in my-host-container) sudo stop lxc
(in my-host-container) sudo sed -i "s/10.0.3/10.0.4/g" /etc/default/lxc
(in my-host-container) sudo start lxc
(in my-host-container) sudo lxc-create -n my-sub-container -t ubuntu
(in my-host-container) sudo lxc-start -n my-sub-container

L'installazione di quel criterio AppArmor e il riavvio del demone hanno funzionato (non dimenticare di cambiare gli intervalli di rete, però!). In effetti, ho pensato che quel particolare frammento fosse così importante che l'ho rispecchiato @ http://pastebin.com/JDFp6cTB nel caso in cui l'articolo non fosse mai in linea.

Dopo ciò, ci sudo /etc/init.d/cgroup-lite startriuscì e fu una navigazione fluida.

Quindi, sì, è possibile avviare un contenitore LXC all'interno di un altro contenitore LXC :)


1
Questa configurazione praticamente disabilita la protezione AppArmor (eseguendo il contenitore non confinato). AppArmor "intende proteggere l'host da abusi accidentali di privilegi all'interno del contenitore". Questa configurazione sta praticamente aprendo l'host lxc per essere sfruttato dal tuo contenitore lxc nidificato. L'host LXC nidificato potrebbe non offrire protezione anche ai suoi contenitori. In generale, si consiglia di non disabilitare questa protezione.
Reece45

esiste un approccio sicuro praticabile per eseguire lxc all'interno di lxc?
Mascarpone,

10
Caso d'uso reale: ho un contenitore LXC con jenkins e voglio che jenkins sia in grado di eseguire i contenitori LXC prima di eseguire i test di integrazione. Alternative: esegui jenkins all'esterno di LXC o crea contenitori LXC sull'host tramite ssh (brutto).
Giovanni Toraldo,

13

Con Ubuntu 14.04 (fidato) puoi semplicemente aggiungere quanto segue nella configurazione del contenitore padre:

lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting

riferimento: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (ricerca di "annidamento)

Assicurati di avere una rete preconfigurata prima dell'avvio per evitare una lunga pausa prima che appaia la schermata di accesso!

HTH


1
Funziona perfettamente - grazie! Per gli utenti come me che potrebbero non aver già avuto una configurazione del contenitore padre in cui inserire le righe sopra, l'aggiunta di un file ~/.config/lxc/default.confnell'account dell'utente che crea il contenitore e l'aggiunta di quelle due linee funziona perfettamente.
Brandon Rhodes,

Nel 2017! Recentemente devo installare la finestra mobile all'interno di lxc per un'app "enterprise-y" - funziona bene ma non chiedere ...
Lester Cheung

1

Inoltre ... lo sapevi che ora puoi installare TUTTO di Openstack in un singolo contenitore LXC. Ciascuno dei "servizi" di Openstack (nova, swift ecc.) Viene quindi installato in contenitori lxc "nidificati" all'interno del contenitore "master / parent".

Ci vuole un po 'di tempo per installare tutto, ma una volta terminato, si avrà un bel test sull'ambiente OpenStack sul proprio laptop o desktop per sperimentare.

Se si desidera arrestare OpenStack, basta riavviare lo stesso contenitore master / parent per riavviare Openstack.

vedere: Istruzioni per l'installazione singola di Openstack


1

Sì, puoi creare contenitori LXC nidificati e, nonostante il primo commento, ci sono volte e casi d'uso in cui i contenitori nidificati sono sicuramente utili. Vedi il blog LXC in 10 parti di Stephane Graber ma in particolare la sezione Nesting dei container -

La serie in 10 parti di Stephane Graber su LXC

casi d'uso: supponiamo di voler un ambiente LXC multi-tenant. Crea 1 contenitore principale per ogni persona o organizzazione assicurandoti di abilitare Nesting aggiungendo i 2 cmds al file di configurazione del contenitore LXC. Successivamente, in ciascun contenitore principale, creare i sottocontenitori nidificati in cui si installano le app, i desktop ecc. Richiesti da ciascun gruppo. NOTA che mentre la rete predefinita per i contenitori Master sarà 10.0.3.x i contenitori nidificati saranno 10.0.4.x per impostazione predefinita (puoi cambiarli se necessario).

Qual è il vantaggio più grande che ho avuto usando Nested LXC? Se lxc-stop il contenitore Master e lxc-clonalo .. cloni non solo il Master ma tutti i sotto-contenitori ... questo è utile per backup rapidi. Questo approccio è utile anche se si desidera eseguire la migrazione in tempo reale LXC con CRIU. Quando esegui la migrazione di uno dei contenitori master su un'altra macchina ... in realtà lo stai migrando e anche tutti i contenitori nidificati.

Infine, per un bell'esempio di annidamento LXC, utilizzare Stephane Graber e altri hanno creato un simulatore per "Internet" usando LXC, BPG e OSPF in un unico contenitore LXC. All'interno di quel 1 container LXC "master o parent" LXC ci sono 512 container LXC nidificati ciascuno con Quagga in esecuzione per il routing BGP / OSPF. Insieme quei 512 "nodi" Internet simulano Internet. Questa implementazione è stata utilizzata alla conferenza di sicurezza NSEC del 2014 affinché tutti i partecipanti sperimentassero la sicurezza in Internet.

La fonte di questo è su Githug a: 2014 simulatore LXC NSEC per il codice github di Internet

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.