¿Es posible iniciar el contenedor LXC dentro del contenedor LXC?

21

¿Es posible iniciar el contenedor LXC dentro de otro contenedor LXC?

Mikhail
fuente
1
¿Realmente tienes una razón real para hacer esto? Recuerde que las preguntas aquí deberían ser sobre los problemas reales que enfrenta .
Zoredache
66
Creo que lxc debería ser capaz de simplificar la migración de VM (y backup + recovery también). Pero no estoy seguro de los casos, cuando no hay acceso al sistema operativo host (vps baratos, por ejemplo).
Mikhail

Respuestas:

45

Voy a disipar algunos mitos aquí.

Esto es solo una mala idea. Lo siento. - Jacob 5 de marzo a las 20:30

No veo cómo es una mala idea. Realmente es solo un chroot dentro de un chroot. Por un lado, posiblemente podría disminuir el rendimiento de una manera insignificante (nada en comparación con ejecutar una VM dentro de una VM). Por otro lado, es probable que sea más seguro (por ejemplo, más aislado del sistema host raíz y sus componentes).

¿Realmente tienes una razón real para hacer esto? Recuerde que las preguntas aquí deberían ser sobre los problemas reales que enfrenta. - Zoredache 5 de marzo a las 21:52

Estoy 100% de acuerdo con el siguiente comentario del póster. Además, creo que es seguro asumir que todos los que publican una pregunta aquí probablemente piensen que tienen una razón real para hacerlo.

Creo que lxc debería ser capaz de simplificar la migración de VM (y copia de seguridad + recuperación también). Pero no estoy seguro de los casos, cuando no hay acceso al sistema operativo host (vps baratos, por ejemplo). - Mikhail 6 de marzo a las 11:17

De hecho, me encontré con esta pregunta en junio cuando me sumergí por primera vez en LXC para proyectos de PaaS / IaaS, y estaba particularmente interesado en la capacidad de permitir a los usuarios emular entornos de nube con fines de desarrollo.

LXCeption. Somos muy profundos - Tom O'Connor 6 de marzo a las 22:46

Me reí un poco cuando leí este, pero ese no es el caso :)

De todos modos, eventualmente configuré un entorno VirtualBox con una instalación en stock de Ubuntu 12.04 LTS Server Edition después de leer todo esto, pensando que esto era 100% posible. Después de instalar LXC, creé un nuevo contenedor e instalé LXC dentro del contenedor con apt-get. La mayor parte de la instalación progresó bien, pero resultó en un error eventualmente debido a un problema con el paquete cgroup-lite, cuyo trabajo inicial no pudo iniciarse después de que el paquete había sido instalado.

Después de un poco de búsqueda, me encontré con este excelente artículo en stgraber.org (las golosinas se esconden debajo de la sección "Anidamiento de contenedores"):

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

Instalar esa política de AppArmor y reiniciar el demonio fue el truco (¡aunque no olvides cambiar los rangos de red!). De hecho, pensé que ese fragmento en particular era tan importante que lo reflejé en @ http://pastebin.com/JDFp6cTB por si el artículo alguna vez se desconecta.

Después de eso, sudo /etc/init.d/cgroup-lite starttuvo éxito y fue una navegación tranquila.

Entonces, sí, es posible iniciar un contenedor LXC dentro de otro contenedor LXC :)

Adam Eberlin
fuente
1
Esta configuración prácticamente deshabilita la protección de AppArmor (al ejecutar el contenedor sin confinar). AppArmor está "destinado a proteger al host de usos indebidos de privilegios dentro del contenedor". Esta configuración está prácticamente abriendo el host lxc para ser explotado por su contenedor lxc anidado. El host LXC anidado también puede no ofrecer protección a sus contenedores. En general, no se recomienda deshabilitar esta protección.
Reece45
¿Existe un enfoque seguro viable para ejecutar lxc dentro de lxc?
Mascarpone
10
Caso de uso del mundo real: tengo un contenedor LXC que ejecuta jenkins, y quiero que jenkins pueda ejecutar contenedores LXC antes de ejecutar pruebas de integración. Alternativas: ejecute jenkins fuera de LXC, o cree contenedores LXC en el host a través de ssh (feo).
Giovanni Toraldo
13

Con Ubuntu 14.04 (confiable) simplemente puede agregar lo siguiente en la configuración del contenedor principal:

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

referencia: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (busque "anidamiento"

¡Asegúrese de tener una red preconfigurada antes de iniciar para evitar una pausa larga antes de que aparezca la pantalla de inicio de sesión!

HTH

Lester Cheung
fuente
1
Funciona perfectamente, ¡gracias! Para usuarios como yo que quizás no hayan tenido una configuración de contenedor principal en la que colocar las líneas anteriores, agregar un archivo ~/.config/lxc/default.confbajo la cuenta del usuario que crea el contenedor y agregar esas dos líneas funciona bien.
Brandon Rhodes
¡De vuelta en 2017! Recientemente, tengo que configurar Docker dentro de lxc para una aplicación "empresarial-y" - funciona bien pero no preguntes ...
Lester Cheung
1

Además ... ¿sabía que ahora puede instalar TODO Openstack en un solo contenedor LXC? Cada uno de los "servicios" de Openstack (nova, swift, etc.) se instalan en contenedores lxc "anidados" dentro del contenedor "maestro / padre".

Tarda un poco en instalar todo, pero cuando haya terminado, tendrá un buen entorno de prueba de OpenStack en su computadora portátil o de escritorio para experimentar.

Si desea detener OpenStack, simplemente detenga el contenedor maestro / padre para reiniciar Openstack.

ver: Instrucciones para el instalador único de Openstack

bmullan
fuente
1

Sí, puede hacer contenedores LXC anidados y, a pesar del primer comentario, hay momentos y casos de uso en los que los contenedores anidados son ciertamente útiles. Vea el blog LXC de 10 partes de Stephane Graber, pero en particular la sección Anidamiento de contenedores:

La serie de 10 partes de Stephane Graber en LXC

Casos de uso: suponga que desea un entorno LXC multiempresa. Cree 1 contenedor maestro para cada persona u organización asegurándose de habilitar Nesting agregando los 2 cmds al archivo de configuración del contenedor LXC. A continuación, en cada contenedor maestro, cree sus subcontenedores anidados donde instale las aplicaciones, los escritorios, etc. que requiere cada grupo. TENGA EN CUENTA que, mientras que la red predeterminada para los contenedores maestros será 10.0.3.x, los contenedores anidados serán 10.0.4.x de forma predeterminada (puede cambiarlos si es necesario).

¿Cuál es la mayor ventaja que he tenido al usar Nested LXC? Si lxc-detiene el contenedor Master y lxc-clone ... no clone solo el Master sino todos los subcontenedores ... esto es útil para copias de seguridad rápidas. Este enfoque también es útil si alguna vez quieres hacer una migración en vivo de LXC con CRIU. Cuando migra uno de los contenedores maestros a otra máquina ... en realidad lo está migrando a él y a todos los contenedores anidados.

Por último, para un ejemplo genial de anidamiento LXC, use Stephane Graber y otros construyeron un simulador para "Internet" usando LXC, BPG y OSPF, todo en 1 contenedor LXC. Dentro de ese 1 contenedor LXC "maestro o padre" LXC hay 512 contenedores LXC anidados, cada uno de los cuales ejecuta Quagga para el enrutamiento BGP / OSPF. Juntos, esos 512 "nodos" de Internet simulan Internet. Esta implementación se utilizó en la conferencia de seguridad NSEC 2014 para que todos los asistentes experimentaran con la seguridad en Internet.

La fuente de esto está en Githug en: 2014 NSEC LXC simulator for The Internet github code

bmullan
fuente