Los contenedores de Linux (LXC) son una tecnología de virtualización ligera y tienen varios usos. Es parte del kernel de Linux y puede permitirle emular una o varias distribuciones de Linux en un solo host de Linux. Piense en ello como un punto intermedio entre un chroot y tecnologías de virtualización completas como VirtualBox, KVM o Xen. Una tecnología similar presente en el mundo de BSD son las cárceles de FreeBSD.
A modo de ejemplo, la máquina en la que estoy escribiendo es una computadora portátil con Linux Mint 18, con un procesador Intel Atom, y tiene una cantidad de 2 GB de RAM. Sin embargo, estoy ejecutando tres contenedores de Linux, cada uno con una instancia del servidor web Apache ejecutándose, sin un gran impacto en el rendimiento. Esto sería impensable con una máquina virtual tradicional como VirtualBox. Por lo tanto, si desea ejecutar varias distribuciones en su sistema Linux, los Contenedores de Linux deben hacer el trabajo por usted muy bien.
Instalación y configuración de contenedores de Linux
Estamos configurando LXC en Linux Mint 18 de 64 bits. Las instrucciones de instalación proporcionadas aquí también funcionarán sin modificaciones en Ubuntu 16.04 y superior. Si está utilizando otra distro, consulte la documentación oficial de su distro si algo no funciona como se esperaba. También se supone una familiaridad con la línea de comandos y la solución de problemas en general.
Prerrequisitos
Aquí hay algunas cosas que debe configurar para comenzar a usar múltiples distribuciones:
1. Instale LXC y otro software de requisito previo utilizando:
[código fuente] sudo apt install lxc lxc-templates uidmap [/ sourcecode]
2. Ahora necesitas configurar tu perfil . Ingrese los siguientes comandos para configurarlo:
[código fuente] mkdir -p ~ / .config / lxc
echo "lxc.id_map = u 0 100000 65536" & amp; amp; gt; ~ / .config / lxc / default.conf
echo "lxc.id_map = g 0 100000 65536" & amp; amp; gt; & amp; amp; gt; ~ / .config / lxc / default.conf
echo "lxc.network.type = veth" & amp; amp; gt; & amp; amp; gt; ~ / .config / lxc / default.conf
echo "lxc.network.link = lxcbr0" & amp; amp; gt; & amp; amp; gt; ~ / .config / lxc / default.conf
echo "$ USER veth lxcbr0 2" | sudo tee -a / etc / lxc / lxc-usernet [/ sourcecode]
3. Luego, debe configurar los permisos de usuario de la siguiente manera:
[código fuente] sudo usermod –add-subuids 100000-165536 $ USER
sudo usermod –add-subgids 100000-165536 $ USUARIO
sudo cgm crear todos los usuarios
sudo cgm chown todos los usuarios $ (id -u) $ (id -g)
cgm movepid all user $$ [/ sourcecode]
Configuración de su contenedor
Ahora que tiene LXC Container instalado junto con otro software de requisito previo, estos son los pasos para configurar el Container:
1. En este ejemplo, configuraremos un contenedor de Ubuntu, llamado ubu1
. Para hacerlo, ejecuta el siguiente comando:
[código fuente] lxc-create –template download –name ubu1 [/ sourcecode]
2. Aquí, el parámetro –template
le dice a lxc que descargue una imagen preconfigurada de Internet, mientras que el parámetro –name
especifica el nombre del contenedor - ubu1
en este caso. Puedes usar el nombre que quieras.
3. Ahora verá una lista de imágenes de distribución compatibles :
4. Ingrese los detalles de la distribución que desea instalar. Instalaré la versión de 64 bits de Ubuntu 16.04 (nombre en código xenial) aquí:
5. Si desea instalar la imagen de forma no interactiva, el siguiente comando logra el mismo resultado que el anterior:
[código fuente] lxc-create -t descarga -n ubu1 - –dist ubuntu –release xenial –arch amd64 [/ sourcecode]
6. LXC ahora descargará e instalará una imagen xenial mínima de Ubuntu en su sistema host. La descarga y la instalación pueden tomar un poco de tiempo dependiendo de su conexión a internet y la velocidad de su PC. Después de la instalación, verá una pantalla como esta:
Ahora está listo para usar su contenedor Ubuntu recién configurado.
Usando Distros Múltiples con Contenedores Linux
Poniendo en marcha el contenedor
Comience su contenedor usando el lxc-start
:
[código fuente] lxc-start -n ubu1 -d [/ sourcecode]
Aquí, el parámetro -n
especifica el nombre del contenedor que desea iniciar ( ubu1
en este caso), y el parámetro -d
hace que se ejecute en segundo plano .
Puede verificar que el contenedor se inició con el lxc-ls
:
[código fuente] lxc-ls -f [/ sourcecode]
El parámetro -f
habilita informes sofisticados . Aquí puede ver que tengo dos contenedores : uno Debian (detenido) y un Ubuntu (en ejecución).
Acceso y uso de su contenedor
Puede acceder a la consola del contenedor utilizando el lxc-attach
:
[código fuente] lxc-attach -n ubu1 [/ código fuente]
Ahora tendrá un shell de root en su contenedor. Se recomienda que configure una contraseña para el usuario root y cree una cuenta de usuario regular :
[código fuente] passwd
adduser beebom [/ sourcecode]
Por supuesto, reemplace beebom con el nombre de usuario que desee. Luego puede instalar el software y configurar su contenedor como lo haría en un sistema regular. Por ejemplo, en un contenedor de Debian o Ubuntu:
[código fuente] apt instalar wget openssh-server htop tmux nano iptables [/ sourcecode]
Parando su contenedor
Una vez que haya terminado de jugar con el contenedor, use el comando exit
para volver al sistema host . Ahora use el lxc-stop
para detener su contenedor :
[código fuente] lxc-stop -n ubu1 [/ código fuente]
Esto hará que el contenedor se cierre de forma limpia y no consumirá más recursos en su sistema, excepto el espacio en disco.
Clonación e instantáneas
Clones
Una vez que haya instalado los programas en un contenedor y los haya configurado a su gusto, es posible que desee crear una o varias copias para facilitar el aprovisionamiento. Puede hacer esto creando un clon, que es una réplica exacta de un contenedor.
Por ejemplo, para crear un clon del contenedor ubu1
(llamémoslo ubu2
), primero detenga el contenedor usando lxc-stop
, luego use el lxc-copy
:
[código fuente] lxc-stop -n ubu
lxc-copy -n ubu1 -N ubu2 [/ sourcecode]
Aquí, la opción -n especifica el contenedor de origen, y la opción -N especifica el nombre del clon . Para verificar que el contenedor fue clonado, use el lxc-ls
:
Instantáneas
Supongamos que está a punto de hacer que algunos cambios en un contenedor, como la reconfiguración de un servidor web, sean potencialmente peligrosos o difíciles de recuperar. Para minimizar el daño, puede crear una instantánea del contenedor antes de realizar dicho cambio. En caso de que algo salga mal durante la configuración, simplemente puede detener el contenedor y recuperarlo a su estado de trabajo anterior restaurando una instantánea.
Para crear la instantánea, primero detenga el contenedor :
[código fuente] lxc-stop -n ubu1 [/ código fuente]
Luego, cree una instantánea usando el lxc-snapshot
:
[código fuente] lxc-snapshot -n ubu1 [/ código fuente]
Esto crea una instantánea llamada snap0
. Cualquier instantánea posterior que cree con este comando se llamará snap1, snap2, etc.
Después de esto, puede iniciar el contenedor y realizar los cambios que desee. Si en algún momento desea volver a una instantánea que creó, detenga el contenedor y use el lxc-snapshot
con el parámetro -r
para restaurar una instantánea :
[código fuente] lxc-snapshot -r snap0 -n ubu1 [/ sourcecode]
Esto restaurará la instantánea snap0
al contenedor ubu1
.
Contenedores de arranque automático en el arranque
Puede crear un contenedor, por ejemplo, un contenedor de servidor web, que se inicia automáticamente al iniciar el sistema. Para hacer esto, vaya al archivo de configuración del contenedor, ubicado en $HOME/.local/share/lxc//config
, y agregue las siguientes líneas :
[código fuente] lxc.start.auto = 1
lxc.start.delay = 5 [/ sourcecode]
La primera línea especifica que el contenedor debe iniciarse en el arranque. El segundo le dice al sistema que espere 5 segundos antes de comenzar el siguiente contenedor, si lo hubiera.
Solución de problemas
Si tiene problemas para iniciar contenedores, lo primero que debe intentar es ejecutar el lxc-start
en el modo de primer plano . Por ejemplo:
[código fuente] lxc-start -n ubu1 -F [/ sourcecode]
Esto le mostrará los errores en la consola actual, que es muy útil para identificar la naturaleza del problema.
Problemas al ejecutar varios contenedores simultáneamente
Si intenta ejecutar varios contenedores a la vez, es posible que vea errores como "Cuota alcanzada" o "No se pudo crear la red configurada". Esto se debe a que está ejecutando más interfaces de red que las asignadas a usted. Puede aumentar el número de puentes de red que un usuario puede ejecutar modificando el /etc/lxc/lxc-usernet
como root . Podría verse algo como esto:
[código fuente] # TIPO DE NOMBRE DE USUARIO CUENTA DE PUENTE
beebom veth lxcbr0 5 [/ sourcecode]
Puede cambiar el número al final (5 en este ejemplo), a un número mayor como 10. Esto le permitirá ejecutar hasta 10 contenedores a la vez.
Otros usos de los contenedores de Linux
Los contenedores de Linux tienen varios usos. Puede usarlas como cajas de prueba livianas, por ejemplo, para probar varias configuraciones de un servidor web o de base de datos antes de enviarlas a un servidor de producción. Otro caso de uso es probar cómo se ejecuta una aplicación en diferentes versiones de varias distribuciones.
También puede usarlas para aislar aplicaciones en las que no confía. Cualquier daño que pueda hacer una aplicación de este tipo se limitará a su propio contenedor y no afectará al sistema host. Tenga en cuenta que si bien es posible ejecutar aplicaciones GUI en un contenedor, esto requiere una cantidad significativa de tiempo y esfuerzo, por lo que no se recomienda. Si desea ejecutar aplicaciones GUI en un recinto de seguridad, consulte nuestro artículo sobre cómo utilizar las aplicaciones de entorno limitado en Linux.
Ejecutar varias distribuciones simultáneas con contenedores de Linux
Así termina nuestro How-To sobre la ejecución de múltiples distribuciones de Linux en una sola computadora, sin la sobrecarga de una máquina virtual de tamaño completo. La utilidad de esta tecnología solo está limitada por su creatividad, así que siéntase libre de experimentar y descubrir nuevos casos de uso. Si tiene problemas para instalar contenedores, no dude en hacernos una pregunta en la sección de comentarios.