LXD es un hypervisor de contenedores similar a Docker, de hecho ambos comparten orígenes, y su principal diferencia consiste en que un contenedor LXD se considera un contenedor de sistema, ya permite crear entornos más parecidos a los de una máquina virtual, pero sin la sobrecarga de ejecutar un kernel separado, mientras que Docker es usado para crear contenedores de aplicaciones.
Los contenedores LXD son ideales para entornos poco volátiles, que requieren más de un servicio en ejecución por contenedor, mientras que en Docker se recomienda una aplicación por contenedor y suelen ser más efímeros y cambiantes.
En este artículo veremos cómo crear una imagen LXD personalizada basada en Ubuntu 20.04, a partir de la cual poder crear luego nuestros contenedores.
Requisitos: Host con Ubuntu 20.04 y el snap de LXD instalado.
1. Instalar paquetes requeridos
Veamos cómo crear un entorno mínimo de Debian/Ubuntu en un directorio de nuestro host, para ello usaremos debootstrap, que instalaremos usando el siguiente comando:
sudo apt install debootstrap
2. Crear la instalación base
Vamos a crear una instalación mínima de Ubuntu 20.04 (focal) en el directorio elegido, así que creamos un directorio y luego ejecutamos debootstrap con tres argumentos: el nombre de la distribución a instalar, la ruta destino y el repositorio de ls distribución (cuando es diferente a Debian):
mkdir -p /tmp/ubuntu-focal-lxd
sudo debootstrap focal /tmp/ubuntu-focal-lxd http://archive.ubuntu.com/ubuntu/
Veremos una salida como la siguiente mientras se construye el sistema base de Ubuntu 20.04.
Ingresamos al ambiente creado chroot para aplicar los cambios que deseamos en la imagen base, por ejemplo instalaremos node.js 14, para esto necesitamos antes el paquete curl para descargar y luego ejecutar el archivo nodesource_setup.sh, e instalaremos las librerias gcc, g++, y make, así:
apt -y install curl
curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
bash nodesource_setup.sh
apt install nodejs
apt -y install gcc g++ make
rm nodesource_setup.sh
apt clean
Comprimimos el entorno chroot creado luego de aplicarle los cambios:
sudo tar -cvzf rootfs.tar.gz -C /tmp/ubuntu-focal-lxd .
Creamos un archivo llamado metadata.yml donde ingresamos los detalles de la imagen, incluyendo la fecha de creación en segundos, la que obtenemos con el comando date +%s
architecture: «x86_64»
creation_date: 1616849590
properties:
architecture: «x86_64»
description: «Ubuntu 20.04 (focal) with preconfigured Node.js 14 (20210327)»
os: «ubuntu»
release: «focal»
y luego creamos un tar.gz con el mismo:
tar -cvzf metadata.tar.gz metadata.yaml
3. Crear la imagen
Finalmente creamos la imagen usado el archivo metadata y el entorno chroot comprimido:
lxc image import metadata.tar.gz rootfs.tar.gz –alias ubuntu-focal-nodejs
Para probar nuestra nueva imagen LXC/LXD con Ubuntu 20.04 y Node.js podemos iniciar un contenedor, e ingresar a este para verificar su contenido. En el siguiente paso crearemos un contenedor llamado ‘test’.
lxc launch ubuntu-focal-nodejs testnodejs
Podemos listar nuestros contenedores en ejecución con el comando lxc list:
Si deseamos, podemos además ingresar al contenedor y comprobar que tiene node.js instalado verificando su versión.
lxc exec testnodejs bash
node -v
v14.16.0
Ya está, tenemos una imagen LXC/LXD personalizada de Ubuntu 20.04 con nuestros cambios con la que crear nuestros contenedores.