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.

LXC es la opción adecuada cuando se necesita un entorno de sistema operativo completo con menor overhead que una VM. LXD moderniza esta experiencia con una CLI más amigable y añade funcionalidades avanzadas como clustering y soporte de VMs.

Principios básicos de hardening

Índice de la sección

Índice del curso