En el siguiente artículo vamos a echar un vistazo a los contenedores LXD. Sobre ellos ya habló en este blog un compañero hace algún tiempo. En aquel artículo ya dejaba claro que estos contenedores son útiles por diferentes razones. Aíslan aplicaciones del resto del sistema, son portátiles, fáciles de clonar y/o mover a otros sistemas operativos. En el caso de Gnu/Linux, funcionan de la misma manera en cualquier distribución, sin necesidad de adaptaciones.
Docker es una solución popular diseñada para contener una sola aplicación como podría ser un servidor de base de datos MySQL. LXD es similar en algunos aspectos, pero está diseñado para contener un sistema operativo completo. LXD no va a virtualizar hardware como QEMU o VirtualBox. Esto significa que es muy rápido y ofrece una velocidad de ejecución casi nativa.
Como ejemplo de uso, podríamos crear un contenedor LXD, instalar un servidor de base de datos y un servidor http. Ahí vamos a tener la posibilidad de crear un sitio web con WordPress y llegado el caso podemos cambiar de nube a nube simplemente moviendo este contenedor LXD donde sea necesario. Como resulta sencillo clonar un contenedor, incluso se podría cargar tu sitio web a múltiples proveedores de la nube para crear una configuración redundante y de alta disponibilidad.
Instalar y configurar LXD
Para instalar LXD solo hay que abrir una terminal (Ctrl+Alt+T) e instalar. Además también podemos instalar las utilidades ZFS. Estas nos ayudarán a acelerar algunas operaciones y ahorrar espacio en el disco cuando trabajemos con contenedores.
sudo apt install zfsutils-linux lxd
Para iniciar la configuración de LXD, en la misma terminal escribimos:
sudo lxd init
Aquí podemos pulsar Intro para seleccionar los valores predeterminados.
Busca e inicia una imagen de distribución LXD
Para ver un listado de las imágenes de Ubuntu, en la terminal escribimos:
lxc image list ubuntu: arch=amd64|head
Se puede omitir arch=amd64 si necesitas imágenes para otras arquitecturas. En la imagen anterior, los resultados se han limitado (con | head) para que sea más fácil de leer.
Como se pudo ver en la captura anterior, la huella digital de Ubuntu 18.04 (dcbc8e3e5c2e) la dejé resaltada. Si te interesa iniciar un contenedor con esa distribución habría que utilizar esa huella. El comando a ejecutar sería:
lxc launch ubuntu:dcbc8e3e5c2e
Gestionar contenedores LXD
Para listar todos los contenedores creados, solo hay que escribir:
lxc list
La columna ‘IPV4‘ es especialmente importante si tiene algún servicio en ejecución en esa instancia. Por ejemplo, si se estuviera ejecutando un servidor http Apache, al escribir la IP “10.191.112.88” en el navegador se mostraría el sitio web alojado en el contenedor.
Para detener un contenedor, solo hay que escribir:
lxc stop nombre-contenedor
Esto puede llevar mucho tiempo, o fallar con distribuciones que no sean de Ubuntu. Si esto ocurre, siempre puedes utilizar systemctl poweroff para detenerlo.
Si todo lo demás falla, puedes forzar la parada con:
lxc stop nombre-contenedor --force
Para empezar con un contenedor habría que escribir:
lxc start nombre-contenedor
Si quieres moverte dentro del contenedor, ejecuta:
lxc shell nombre-contenedor
Dentro del contenedor se puede instalar programas con ‘sudo apt install‘ y hacer cualquier otra cosa que harías en una distribución de Gnu/Linux normal, por ejemplo, configurar un servidor Apache.
Cuando quieras salir del contenedor, simplemente escribe:
exit
Transferir archivos a/desde Contenedores LXD
Para cargar un archivo a tu contenedor, utiliza la siguiente sintaxis:
lxc file push /ruta/al/archivo/local/nombre-archivo nombre-contenedor/ruta/al/archivo/subido/nombre-archivo
Incluye el nombre del archivo que se creará, no solo el directorio donde quieres dejarlo.
Para cargar un directorio en lugar de un archivo:
lxc file push /ruta/al/directorio nombre-contenedor/ruta/al/directorio/remoto --recursive --verbose
Para descargar un directorio desde el contenedor a tu sistema operativo principal:
lxc file pull nombre-contenedor/ruta/al/directorio/remoto ruta/al/directorio --recursive --verbose
Esto cubre el uso básico de los contenedores LXD. Hay funciones más avanzadas, como instantáneas, límites a los recursos como CPU y RAM, contenedores de clonación, etc. Todo esto y más se puede consultar en la documentación oficial, en la página web del proyecto o en su página de GitHub.