Contenedores de sistema con LXC
Introducción
LXC (Linux Containers) es una tecnología de contenedores de sistema que emula un sistema operativo completo, incluyendo init, servicios y múltiples procesos. A diferencia de Docker, que ejecuta un proceso por contenedor, LXC se comporta de forma similar a una VM ligera: tiene su propio sistema de init, puede gestionar servicios con systemd y se administra como un sistema Linux convencional.
LXC vs Docker
- LXC: contenedor de sistema — ejecuta un SO completo con múltiples procesos
- Docker: contenedor de aplicación — ejecuta un único proceso o servicio
- LXC es más adecuado para consolidar servidores o aislar entornos de desarrollo completos
- Docker es más adecuado para empaquetar y distribuir aplicaciones individuales
- Ambos usan los mismos mecanismos del kernel: namespaces y cgroups
Instalación
Debian/Ubuntu
apt install lxc lxc-utils
RHEL / Rocky Linux
dnf install epel-release
dnf install lxc lxc-libs lxc-templates
Verificar instalación
lxc-checkconfig # comprobar soporte del kernel para LXC
lxc-ls # listar contenedores
Comandos básicos de LXC
Crear y gestionar contenedores
# Crear un contenedor con Ubuntu 22.04
lxc-create -n mi-contenedor -t download -- -d ubuntu -r jammy -a amd64
# Listar contenedores y su estado
lxc-ls --fancy
# Arrancar el contenedor
lxc-start -n mi-contenedor
# Ver estado
lxc-info -n mi-contenedor
# Abrir una shell dentro del contenedor
lxc-attach -n mi-contenedor
# Parar el contenedor
lxc-stop -n mi-contenedor
# Eliminar el contenedor
lxc-destroy -n mi-contenedor
Arranque automático
# Editar la configuración del contenedor
# /var/lib/lxc/mi-contenedor/config
# Añadir para arranque automático con el host:
lxc.start.auto = 1
lxc.start.delay = 5
Ejecutar comandos sin abrir shell
lxc-attach -n mi-contenedor -- systemctl status ssh
lxc-attach -n mi-contenedor -- apt update
Configuración del contenedor
La configuración de cada contenedor se almacena en
/var/lib/lxc/nombre-contenedor/config. Parámetros más habituales:
# Memoria máxima
lxc.cgroup2.memory.max = 512M
# CPUs permitidas
lxc.cgroup2.cpuset.cpus = 0,1
# Red: interfaz veth conectada a un bridge del host
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
# Montar directorio del host dentro del contenedor
lxc.mount.entry = /datos/compartido /var/lib/lxc/mi-contenedor/rootfs/mnt/host none bind 0 0
Red en LXC
LXC crea por defecto el bridge lxcbr0 (10.0.3.0/24) con NAT, similar al virbr0 de libvirt.
Los contenedores obtienen IP por DHCP.
# Ver la IP del contenedor
lxc-info -n mi-contenedor -iH
# Ver el bridge del host
ip addr show lxcbr0
# Comprobar conectividad desde el host
ping 10.0.3.X
LXD — Interfaz moderna de LXC
LXD es un daemon y CLI de alto nivel construido sobre LXC que simplifica la gestión de contenedores y añade soporte para VMs (usando QEMU). Es el equivalente a libvirt pero enfocado en LXC. En Ubuntu se distribuye como snap.
# Instalar LXD
snap install lxd
lxd init --minimal # configuración inicial básica
# Comandos LXD (sintaxis diferente a LXC)
lxc launch ubuntu:22.04 mi-vm # crear y arrancar (nombre lxc es el CLI de LXD)
lxc list # listar instancias
lxc exec mi-vm -- bash # abrir shell
lxc stop mi-vm # parar
lxc delete mi-vm # eliminar
lxc snapshot mi-vm snap1 # crear snapshot
lxc restore mi-vm snap1 # restaurar snapshot
lxc copy mi-vm mi-vm-clon # clonar
Nota: el comando CLI de LXD se llama lxc (sin la 'd'), lo que puede causar confusión con el CLI de
LXC tradicional. Son herramientas distintas.