Est-il possible de démarrer le conteneur LXC à l'intérieur du conteneur LXC?

21

Est-il possible de démarrer le conteneur LXC à l'intérieur d'un autre conteneur LXC?

Mikhail
la source
1
Avez-vous réellement une vraie raison de le faire? N'oubliez pas que les questions doivent porter sur les problèmes réels auxquels vous êtes confronté .
Zoredache
6
Je pense que lxc devrait être en mesure de simplifier la migration des VM (et la sauvegarde + la récupération aussi). Mais je ne suis pas sûr des cas, quand il n'y a pas d'accès au système d'exploitation hôte (vps bon marché par exemple).
Mikhail

Réponses:

45

Je vais dissiper quelques mythes ici.

C'est juste une mauvaise idée. Je suis désolé. - Jacob 5 mars à 20h30

Je ne vois pas en quoi c'est une mauvaise idée. C'est vraiment juste un chroot à l'intérieur d'un chroot. D'une part, cela pourrait éventuellement réduire les performances de manière négligeable (rien par rapport à l'exécution d'une machine virtuelle à l'intérieur d'une machine virtuelle). D'un autre côté, il est susceptible d'être plus sûr (par exemple, plus isolé du système hôte racine et de ses composants).

Avez-vous réellement une vraie raison de le faire? N'oubliez pas que les questions doivent porter sur les problèmes réels auxquels vous êtes confronté. - Zoredache 5 mars à 21:52

Je suis d'accord à 100% avec le commentaire suivant de l'affiche. En outre, je pense qu'il est prudent de supposer que tous ceux qui publient une question ici pensent probablement qu'ils ont une vraie raison de le faire.

Je pense que lxc devrait être en mesure de simplifier la migration des VM (et la sauvegarde + la récupération aussi). Mais je ne suis pas sûr des cas, quand il n'y a pas d'accès au système d'exploitation hôte (vps bon marché par exemple). - Mikhail 6 mars à 11:17

En fait, je suis tombé sur cette question en juin lorsque j'ai plongé pour la première fois dans LXC pour des projets PaaS / IaaS, et j'étais particulièrement intéressé par la possibilité de permettre aux utilisateurs d'émuler des environnements cloud à des fins de développement.

LXCeption. Nous sommes trop profonds. - Tom O'Connor 6 mars à 22h46

J'ai ri un peu en lisant celui-ci, mais ce n'est pas du tout le cas :)

Quoi qu'il en soit, j'ai finalement mis en place un environnement VirtualBox avec une installation standard d'Ubuntu 12.04 LTS Server Edition après avoir lu tout cela, pensant que c'était 100% possible. Après avoir installé LXC, j'ai créé un nouveau conteneur et installé LXC à l'intérieur du conteneur avec apt-get. La plupart de l'installation a bien progressé, mais a finalement entraîné une erreur en raison d'un problème avec le package cgroup-lite, dont le travail parvenu à l'échec n'a pas pu démarrer après l'installation du package.

Après un peu de recherche, je suis tombé sur ce bel article sur stgraber.org (les goodies se cachent dans la section "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

L'installation de cette stratégie AppArmor et le redémarrage du démon ont fait l'affaire (n'oubliez pas de changer les plages réseau, cependant!). En fait, je pensais que cet extrait particulier était si important que je l'ai reflété @ http://pastebin.com/JDFp6cTB juste au cas où l'article serait mis hors ligne.

Après cela, il a sudo /etc/init.d/cgroup-lite startréussi et la navigation s'est bien déroulée.

Donc, oui, il est possible de démarrer un conteneur LXC à l'intérieur d'un autre conteneur LXC :)

Adam Eberlin
la source
1
Cette configuration désactive à peu près la protection AppArmor (en exécutant le conteneur en mode non confiné). AppArmor est "destiné à protéger l'hôte contre les abus de privilèges accidentels à l'intérieur du conteneur." Cette configuration ouvre à peu près l'hôte lxc à exploiter par votre conteneur lxc imbriqué. L'hôte LXC imbriqué peut également ne pas offrir de protection à ses conteneurs. En général, la désactivation de cette protection n'est pas recommandée.
Reece45
Existe-t-il une approche sécurisée viable pour exécuter lxc dans lxc?
Mascarpone
10
Cas d'utilisation dans le monde réel: j'ai un conteneur LXC exécutant jenkins et je veux que jenkins puisse exécuter des conteneurs LXC avant d'exécuter des tests d'intégration. Alternatives: exécutez jenkins en dehors de LXC ou créez des conteneurs LXC sur l'hôte via ssh (laid).
Giovanni Toraldo
13

Avec Ubuntu 14.04 (fidèle), vous pouvez simplement ajouter ce qui suit dans la configuration du conteneur parent:

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

référence: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (recherchez "imbrication)

Assurez-vous d'avoir un réseau préconfiguré avant de démarrer pour éviter une longue pause avant que l'écran de connexion n'apparaisse!

HTH

Lester Cheung
la source
1
Fonctionne parfaitement - merci! Pour les utilisateurs comme moi qui n'ont peut-être pas déjà eu une configuration de conteneur parent dans laquelle placer les lignes ci-dessus, ajouter un fichier ~/.config/lxc/default.confsous le compte de l'utilisateur qui crée le conteneur et y ajouter ces deux lignes fonctionne très bien.
Brandon Rhodes
De retour en 2017! Récemment, je dois configurer docker dans lxc pour une application "entreprise-y" - fonctionne bien mais ne demandez pas ...
Lester Cheung
1

Aussi ... saviez-vous que vous pouvez maintenant installer TOUS Openstack dans un seul conteneur LXC. Chacun des "services" Openstack (nova, swift, etc.) est alors installé dans des conteneurs lxc "imbriqués" à l'intérieur du conteneur "master / parent".

Prend un certain temps pour tout installer, mais une fois terminé, vous disposez d'un environnement de test OpenStack agréable sur votre ordinateur portable ou de bureau pour expérimenter.

Si vous souhaitez arrêter OpenStack, il vous suffit d'arrêter lxc le conteneur maître / parent pour redémarrer Openstack.

voir: instructions Openstack Single Installer

bmullan
la source
1

Oui, vous pouvez faire des conteneurs LXC imbriqués et malgré le premier commentaire, il y a des moments et des cas d'utilisation où les conteneurs imbriqués sont certainement utiles. Voir le blog LXC en 10 parties de Stephane Graber mais en particulier la section Emboîtement de conteneurs -

La série en 10 parties de Stephane Graber sur LXC

cas d'utilisation: supposons que vous souhaitiez un environnement LXC à locataires multiples. Créez 1 conteneur maître pour chaque personne ou organisation en veillant à activer l'imbrication en ajoutant les 2 cmds au fichier de configuration du conteneur LXC. Ensuite, dans chaque conteneur principal, créez vos sous-conteneurs imbriqués où vous installez les applications, les bureaux, etc. dont chaque groupe a besoin. REMARQUE: alors que le réseau par défaut pour les conteneurs principaux sera 10.0.3.x, les conteneurs imbriqués seront 10.0.4.x par défaut (vous pouvez les modifier si vous en avez besoin).

Quel est le plus grand avantage que j'ai eu avec Nested LXC? Si vous lxc-arrêtez le conteneur maître et lxc-le clonez .. vous clonez non seulement le maître mais tous les sous-conteneurs ... c'est pratique pour des sauvegardes rapides. Cette approche est également pratique si vous souhaitez effectuer une migration LXC en direct avec CRIU. Lorsque vous migrez l'un des conteneurs principaux vers une autre machine ... vous le faites en fait migrer ainsi que tous les conteneurs imbriqués.

Enfin, pour un exemple sympa d'imbrication LXC, Stephane Graber et d'autres ont construit un simulateur pour "Internet" en utilisant LXC, BPG et OSPF le tout dans 1 conteneur LXC. À l'intérieur de ce conteneur LXC "maître ou parent" LXC se trouvent 512 conteneurs LXC imbriqués exécutant chacun Quagga pour le routage BGP / OSPF. Ensemble, ces 512 «nœuds» Internet simulent Internet. Cette implémentation a été utilisée lors de la conférence de sécurité NSEC 2014 pour que tous les participants expérimentent la sécurité sur Internet.

La source de ceci est sur Githug à: 2014 NSEC LXC simulator for The Internet github code

bmullan
la source