Automatización Linux, scripting Bash y herramientas para sysadmins

systemd-nspawn: contenedores ligeros sin Docker, sin daemons, sin tonterías

#linux#systemd#containers#virtualization

¿Para qué quiero contenedores si ya tengo Docker?

Buena pregunta. Docker es excelente para producción y orquestación. Pero para desarrollo local o entornos de prueba, tiene tres molestias:

  1. El demonio (dockerd) consume recursos aunque no uses contenedores
  2. La red de Docker a veces interfiere con tu red local
  3. Necesitas un Dockerfile hasta para probar un script

systemd-nspawn viene con systemd. No necesita demonio. No necesita imágenes. No necesita red virtual. Es un chroot con esteroides, nativo del sistema. Si systemd corre en tu máquina, ya lo tienes.

Lo más básico: ejecutar un comando en un rootfs

# Crear un entorno mínimo con debootstrap
sudo debootstrap stable /var/lib/machines/debian-stable

# Ejecutar un shell dentro
sudo systemd-nspawn -D /var/lib/machines/debian-stable

Eso es todo. Tienes un Debian aislado corriendo en una terminal. Sin Docker, sin daemons, sin configurar nada.

Lanzar como servicio (máquina)

En vez de ejecutar manualmente, lo defines como una “máquina” que systemd gestiona:

# Colocas el rootfs en /var/lib/machines/
# systemd lo detecta automáticamente
sudo machinectl list-images

# Iniciar la máquina
sudo machinectl start debian-stable

# Entrar a su consola
sudo machinectl login debian-stable

# Ver todas las máquinas corriendo
machinectl list

La máquina se inicia al boot (si está habilitada) y systemd la gestiona como cualquier otro servicio. systemctl status systemd-nspawn@debian-stable.

Modo efímero: probar sin ensuciar

Para pruebas rápidas donde no quieres conservar nada:

sudo systemd-nspawn -D /var/lib/machines/debian-stable --ephemeral

Al salir, todos los cambios se descartan. El rootfs original queda intacto. Como un docker run --rm pero sin Docker.

Compartir archivos con el host

# Montar un directorio del host dentro del contenedor
sudo systemd-nspawn -D /var/lib/machines/debian-stable \
    --bind=/home/usuario/proyecto:/mnt/proyecto

Útil cuando quieres probar un script en un entorno limpio sin copiar archivos.

Red sin complicaciones

Por defecto, el contenedor comparte la red del host. Si el host tiene internet, el contenedor también. Sin puentes, sin iptables, sin docker network:

sudo systemd-nspawn -D /var/lib/machines/debian-stable
# Dentro del contenedor:
ping example.com   # Funciona

Para aislar la red (modo privado):

sudo systemd-nspawn -D /var/lib/machines/debian-stable --private-network

El contenedor solo tiene loopback. Ideal para probar cosas que no deberían tocar la red.

Crear un entorno de desarrollo reproducible

# Crear el rootfs
sudo debootstrap stable /var/lib/machines/dev-env

# Instalar herramientas dentro
sudo systemd-nspawn -D /var/lib/machines/dev-env bash -c "
    apt update && apt install -y build-essential git python3
"

# Usarlo como entorno de build
sudo systemd-nspawn -D /var/lib/machines/dev-env \
    --bind=$(pwd):/workspace \
    bash -c "cd /workspace && make"

Tienes un entorno de build limpio, idéntico para todos los desarrolladores, sin YAML, sin layers, sin registry.


Si tu flujo es “necesito probar esto en un entorno limpio y ayer”, systemd-nspawn está a un comando de distancia. Sin demonios, sin configuraciones, sin dependencias.