Ist es möglich, LXC Container im LXC Container zu starten?


21

Ist es möglich, LXC-Container in einem anderen LXC-Container zu starten?


1
Haben Sie tatsächlich einen wirklichen Grund dafür? Bitte denken Sie daran, dass sich die hier gestellten Fragen auf aktuelle Probleme beziehen sollten .
Zoredache

6
Ich denke, dass lxc in der Lage sein sollte, die VM-Migration (und auch Backup + Recovery) zu vereinfachen. Aber ich bin mir nicht sicher, ob es Fälle gibt, in denen kein Zugriff auf das Host-Betriebssystem besteht (z. B. günstiges vps).
Mikhail

Antworten:


45

Ich werde hier ein paar Mythen zerstreuen.

Das ist nur eine schlechte Idee. Es tut mir Leid. - Jacob 5. März um 20:30 Uhr

Ich verstehe nicht, dass das eine schlechte Idee ist. Es ist wirklich nur eine Chroot in einer Chroot. Einerseits könnte dies möglicherweise die Leistung in vernachlässigbarer Weise verringern (nichts im Vergleich zum Ausführen einer VM innerhalb einer VM). Auf der anderen Seite ist es wahrscheinlich sicherer (z. B. stärker vom Root-Host-System und seinen Bestandteilen isoliert).

Haben Sie tatsächlich einen wirklichen Grund dafür? Bitte denken Sie daran, dass sich die hier gestellten Fragen auf aktuelle Probleme beziehen sollten. - Zoredache 5. März um 21:52 Uhr

Ich stimme dem folgenden Kommentar des Posters zu 100% zu. Außerdem kann ich davon ausgehen, dass jeder, der hier eine Frage stellt, der Meinung ist, dass er einen echten Grund hat, dies zu tun.

Ich denke, dass lxc in der Lage sein sollte, die VM-Migration (und auch Backup + Recovery) zu vereinfachen. Aber ich bin mir nicht sicher, ob es Fälle gibt, in denen kein Zugriff auf das Host-Betriebssystem besteht (z. B. günstiges VPS). - Mikhail 6. März um 11:17 Uhr

Diese Frage traf mich im Juni, als ich zum ersten Mal in LXC für PaaS / IaaS-Projekte eintauchte, und ich war besonders an der Möglichkeit interessiert, Benutzern die Emulation von Cloud-Umgebungen für Entwicklungszwecke zu ermöglichen.

LXCeption. Wir sind zu tief. - Tom O'Connor 6. März um 22:46

Ich habe ein bisschen gelacht, als ich dieses gelesen habe, aber das ist überhaupt nicht der Fall :)

Wie auch immer, ich habe schließlich eine VirtualBox-Umgebung mit einer Standardinstallation von Ubuntu 12.04 LTS Server Edition eingerichtet, nachdem ich dies alles gelesen hatte und dachte, dass dies zu 100% möglich sei. Nach der Installation von LXC habe ich einen neuen Container erstellt und LXC mit apt-get im Container installiert. Der Großteil der Installation verlief gut, führte jedoch zu einem Fehler, der möglicherweise auf ein Problem mit dem cgroup-lite-Paket zurückzuführen war, dessen Startjob nach der Installation des Pakets nicht gestartet werden konnte.

Nach einigem Suchen bin ich auf diesen schönen Artikel auf stgraber.org gestoßen (die Goodies verstecken sich unter der Rubrik "Container Nesting"):

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

Die Installation dieser AppArmor-Richtlinie und der Neustart des Daemons haben den Trick ausgeführt (vergessen Sie jedoch nicht, die Netzwerkbereiche zu ändern!). Tatsächlich dachte ich, dass ein bestimmtes Snippet so wichtig ist, dass ich es unter http://pastebin.com/JDFp6cTB gespiegelt habe, für den Fall, dass der Artikel jemals offline geschaltet wird.

Danach sudo /etc/init.d/cgroup-lite startgelang es und es wurde reibungslos gesegelt.

Es ist also möglich, einen LXC-Container in einem anderen LXC-Container zu starten :)


1
Diese Konfiguration deaktiviert den AppArmor-Schutz (indem der Container nicht eingeschränkt ausgeführt wird). AppArmor soll "den Host vor versehentlichem Missbrauch von Berechtigungen im Container schützen". Diese Konfiguration öffnet so ziemlich den lxc-Host, um von Ihrem verschachtelten lxc-Container ausgenutzt zu werden. Der verschachtelte LXC-Host bietet möglicherweise auch keinen Schutz für seine Container. Im Allgemeinen wird das Deaktivieren dieses Schutzes nicht empfohlen.
Reece45

Gibt es einen praktikablen und sicheren Ansatz, um lxc in lxc auszuführen?
Mascarpone

10
Anwendungsfall in der Praxis: Ich habe einen LXC-Container, auf dem Jenkins ausgeführt werden, und ich möchte, dass Jenkins LXC-Container ausführen kann, bevor Integrationstests ausgeführt werden. Alternativen: Führen Sie Jenkins außerhalb von LXC aus oder erstellen Sie LXC-Container auf dem Host über ssh (hässlich).
Giovanni Toraldo

13

Mit Ubuntu 14.04 (vertrauenswürdig) können Sie einfach Folgendes in die übergeordnete Containerkonfiguration einfügen:

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

Referenz: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (Suche nach "nesting")

Stellen Sie sicher, dass Sie das Netzwerk vor dem Booten vorkonfiguriert haben, um eine lange Pause zu vermeiden, bevor der Anmeldebildschirm angezeigt wird!

HTH


1
Funktioniert einwandfrei - danke! Für Benutzer wie mich, die möglicherweise noch keine übergeordnete Containerkonfiguration hatten, in die die obigen Zeilen eingefügt ~/.config/lxc/default.confwerden sollen, funktioniert das Hinzufügen einer Datei unter dem Konto des Benutzers, der den Container erstellt, und das Hinzufügen dieser beiden Zeilen problemlos.
Brandon Rhodes

Zurück in 2017! Vor kurzem muss ich Docker in LXC für eine "Enterprise-y" App einrichten - funktioniert gut, aber fragen Sie nicht ...
Lester Cheung

1

Wussten Sie, dass Sie jetzt ALLES von Openstack in einem einzigen LXC-Container installieren können? Jeder der Openstack- "Dienste" (nova, swift usw.) wird dann alle in "verschachtelten" lxc-Containern innerhalb des "master / parent" -Containers installiert.

Es dauert eine Weile, bis alles installiert ist, aber wenn Sie fertig sind, können Sie mit einer OpenStack-Testumgebung auf Ihrem Laptop oder Desktop experimentieren.

Wenn Sie OpenStack stoppen möchten, müssen Sie nur den Master / Parent-Container stoppen, um Openstack neu zu starten.

Siehe: Openstack Single Installer-Anweisungen


1

Ja, Sie können geschachtelte LXC-Container erstellen, und trotz des ersten Kommentars gibt es Zeiten und Anwendungsfälle, in denen geschachtelte Container sicherlich nützlich sind. Siehe Stephane Grabers 10-teiligen LXC-Blog, aber insbesondere den Abschnitt Container Nesting -

Stephane Grabers 10-teilige Serie auf LXC

Anwendungsfälle: Angenommen, Sie möchten eine mandantenfähige LXC-Umgebung. Erstellen Sie einen Master-Container für jede Person oder Organisation, und stellen Sie sicher, dass die Schachtelung aktiviert ist, indem Sie die 2 cmds zur Konfigurationsdatei des LXC-Containers hinzufügen. Als nächstes erstellen Sie in jedem Master-Container Ihre verschachtelten Unter-Container, in denen Sie die Apps, Desktops usw. installieren, die jede Gruppe benötigt. HINWEIS: Während das Standardnetzwerk für die Master-Container 10.0.3.x ist, sind die verschachtelten Container standardmäßig 10.0.4.x (Sie können dies bei Bedarf auch ändern).

Was ist der größte Vorteil, den ich bei der Verwendung von Nested LXC hatte? Wenn Sie den Master-Container lxc-stoppen und ihn lxc-klonen, klonen Sie nicht nur den Master, sondern alle Sub-Container. Dies ist praktisch für schnelle Backups. Dieser Ansatz ist auch nützlich, wenn Sie jemals eine LXC-Livemigration mit CRIU durchführen möchten. Wenn Sie einen der Master-Container auf einen anderen Computer migrieren, migrieren Sie ihn und alle verschachtelten Container.

Als letztes Beispiel für ein cooles LXC-Nesting haben Stephane Graber und andere einen Simulator für "The Internet" mit LXC, BPG und OSPF in einem LXC-Container erstellt. In diesem 1 LXC-Master- oder übergeordneten LXC-Container befinden sich 512 verschachtelte LXC-Container, in denen jeweils Quagga für das BGP / OSPF-Routing ausgeführt wird. Zusammen simulieren diese 512 Internet- "Knoten" das Internet. Diese Implementierung wurde auf der NSEC-Sicherheitskonferenz 2014 für alle Teilnehmer verwendet, um mit der Sicherheit im Internet zu experimentieren.

Die Quelle dafür ist auf Githug unter: 2014 NSEC LXC Simulator für The Internet Github Code

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.