Crear un contenedor LXC en Proxmox: guía paso a paso

Crear un contenedor LXC en Proxmox: guía paso a paso

Crear un contenedor LXC en Proxmox: guía paso a paso

Proxmox VE incluye soporte nativo para LXC y crear tu primer contenedor es más inmediato de lo que parece. Esta guía recorre el proceso completo: desde descargar la plantilla hasta gestionar el contenedor desde la CLI con <code>pct</code>.

Por Javier · Actualizado: 2025-02-21

Crear un contenedor LXC en Proxmox VE consiste en lanzar un entorno Linux aislado que comparte el kernel del host —sin emular hardware— arrancando en segundos. Desde la web UI de Proxmox 8.x, el asistente guía la creación en varios pasos: elegir plantilla oficial (Debian, Ubuntu, Alpine…), asignar VMID único, configurar disco, CPU, RAM y red.

Proxmox instalado. ¿Y ahora qué?

Si acabas de instalar Proxmox y llevas un rato mirando la interfaz web sin saber muy bien por dónde empezar, esto es para ti. La pantalla está ahí, el nodo aparece en verde, pero la pregunta es obvia: ¿cómo paso de tener un servidor vacío a tener algo funcionando dentro?

Los contenedores LXC son probablemente el mejor primer paso. Arrancan en segundos, consumen pocos recursos y te permiten experimentar sin comprometer el host. Dicho esto, la primera vez que ves el asistente de creación con sus pestañas de plantilla, disco, red y demás, es normal que no quede claro qué toca elegir y por qué.

En este post vamos paso a paso: desde descargar la plantilla hasta tener el contenedor corriendo y accesible. Sin saltar pasos, explicando qué hace cada opción y cuándo importa cambiarla.

Por qué importa

Arranca en segundos

Sin POST ni carga de firmware: un contenedor LXC está operativo casi al instante, a diferencia de una KVM completa.

Plantillas oficiales incluidas

Proxmox descarga Debian, Ubuntu, Alpine y más desde su repositorio; las encontrarás en el storage local, sección Templates.

UID 0 sin privilegios reales

En modo no privilegiado, el root del contenedor se mapea a un UID ≥100000 en el host, reduciendo la superficie de ataque.

CLI con pct

Cada contenedor tiene un VMID único; `pct start 100`, `pct enter 100` — control total desde terminal sin tocar la web UI.

Qué necesitas antes de empezar

Para seguir este tutorial necesitas Proxmox VE 8.x instalado y accesible desde el navegador. La interfaz web corre en https://[ip-del-nodo]:8006. Nada especial más allá de eso: el instalador de Proxmox ya prepara el entorno para trabajar con LXC.

Comprueba que el nodo tiene salida a internet —para descargar la plantilla— y que tienes un storage activo. Por defecto Proxmox crea local (para plantillas e ISOs) y local-lvm (para discos de VMs y contenedores). El VMID lo sugiere Proxmox automáticamente; si es tu primer contenedor probablemente proponga el 100 o el 101.

  • Proxmox VE 8.x con acceso a la UI web
  • Storage local disponible (viene por defecto tras la instalación)
  • Conectividad a internet desde el nodo

Descargar la plantilla del contenedor

Antes de crear el contenedor necesitas la imagen base, que Proxmox llama CT template. Son archivos comprimidos de entre 100 y 300 MB según la distribución, descargables directamente desde la UI sin salir del panel de administración.

En el panel izquierdo, navega a Datacenter > [nodo] > local > CT Templates. Arriba aparece el botón Templates. Al hacer clic se abre un listado con las imágenes disponibles en los repositorios oficiales de Proxmox: Debian, Ubuntu, Alpine, Fedora, Arch y unas cuantas más. Selecciona la que quieras y pulsa Download. Proxmox descarga el archivo y lo guarda en /var/lib/vz/template/cache/ del nodo. El tiempo depende de tu ancho de banda.

Si prefieres la terminal, pveam available lista todas las imágenes disponibles y pveam download local debian-12-standard_12.7-1_amd64.tar.zst descarga la que elijas directamente. El nombre exacto cambia con cada versión, así que consulta primero la lista para ver qué hay disponible.

Crear el contenedor desde la UI web

Con la plantilla lista, haz clic en Create CT en la esquina superior derecha de la UI. Se abre un asistente de varios pasos que va de lo general a lo específico. Aquí está lo que relleno en cada pantalla.

General

Defines el CT ID (VMID), el hostname del contenedor y la contraseña de root. Puedes también pegar una clave SSH pública si prefieres autenticarte sin contraseña desde el primer momento. El CT ID debe ser único en todo el clúster; Proxmox sugiere el siguiente libre automáticamente.

Template

Selecciona el storage (local) y luego la plantilla descargada. Si tienes varias, aquí aparecen todas listadas. Para empezar, Debian 12 o Ubuntu 24.04 son opciones sólidas: documentación abundante y soporte a largo plazo.

Disks, CPU y Memory

El disco por defecto suele ser 8 GB, suficiente para la mayoría de servicios ligeros. Un core de CPU y 512 MB de RAM son el punto de partida habitual; puedes ajustar en caliente más adelante sin recrear el contenedor. En cuanto al swap, en contenedores prefiero dejarlo en 0 o muy bajo: si el servicio se queda sin memoria prefiero que falle rápido antes de que el sistema se ponga a swappear de forma silenciosa.

Network

El bridge vmbr0 conecta con la red física del host y es la opción habitual para contenedores que necesitan acceso a la LAN o a internet. Para la IP puedes usar DHCP en un primer momento; si luego quieres IP fija, es más cómodo reservarla en el router por MAC que editar la configuración del contenedor.

DNS y confirmación final

En la pestaña DNS puedes dejar que el contenedor herede la configuración del nodo host. En la pantalla de confirmación hay una casilla Start after created: si la marcas, el contenedor arranca solo al terminar el asistente. El resumen previo muestra todos los parámetros antes de confirmar.

Privilegiado vs no privilegiado

En la pestaña General hay un checkbox Unprivileged container, marcado por defecto. En modo no privilegiado, el UID 0 del contenedor se mapea a un UID igual o mayor a 100000 en el host mediante user namespaces del kernel. Si alguien consiguiera escapar del contenedor, llegaría al host como un usuario sin privilegios.

Para la mayoría de servicios de homelab —nginx, Pi-hole, Gitea, bases de datos— el modo no privilegiado funciona sin fricciones. Donde puedes tener problemas es con servicios que necesitan módulos de kernel específicos o ciertas syscalls que el namespace no permite. En esos casos puede que necesites un contenedor privilegiado, o directamente una VM KVM.

Un matiz importante: un contenedor privilegiado tiene más superficie de ataque que una KVM bien configurada. LXC y KVM son modelos de aislamiento distintos con trade-offs distintos; no hay respuesta absoluta sobre cuál es más seguro en todos los casos.

Arrancar el contenedor y dar los primeros pasos

Si no marcaste Start after created, selecciona el contenedor en el panel izquierdo y pulsa Start. En pocos segundos está corriendo: sin POST, sin carga de firmware, sin grub. El contenedor comparte el kernel del host, así que no hay nada que inicializar a ese nivel.

Para acceder tienes dos opciones inmediatas:

  • Consola web: botón Console en la UI de Proxmox. Abre una terminal en el navegador, útil para la configuración inicial sin necesitar red configurada.
  • SSH: si la red funciona y la plantilla incluye SSH activo (Debian y Ubuntu lo traen por defecto), ssh root@[ip-del-contenedor] desde tu máquina.

Lo primero que hago al entrar en un contenedor Debian o Ubuntu recién creado:

apt update && apt upgrade -y
apt install -y curl wget nano

Actualizar antes de instalar cualquier servicio evita conflictos raros con versiones de paquetes que a veces aparecen con plantillas no recientes.

Gestión del día a día con pct

La UI de Proxmox está bien para crear y supervisar contenedores, pero para el día a día la CLI es más ágil. pct es el Proxmox Container Toolkit y cubre prácticamente todo lo que necesitas sin abrir el navegador.

Comandos que uso con más frecuencia, con VMID 101 en los ejemplos:

  • pct list — lista todos los contenedores del nodo con su estado
  • pct start 101 — arranca el contenedor
  • pct shutdown 101 — apagado limpio enviando la señal al OS del contenedor
  • pct stop 101 — corte forzado, equivalente a desenchufar
  • pct enter 101 — abre una consola interactiva sin necesitar red
  • pct exec 101 -- bash -c "apt update && apt upgrade -y" — ejecuta un comando sin entrar en la consola
  • pct snapshot 101 antes-de-liarse — snapshot antes de cambios relevantes
  • pct config 101 — muestra la configuración completa del contenedor

Los snapshots de LXC son rápidos si usas LVM-Thin o ZFS como storage. En storage de directorio plano no están disponibles a menos que uses subvolúmenes Btrfs. La configuración de cada contenedor vive en /etc/pve/lxc/[vmid].conf; puedes editarla a mano cuando ya tienes experiencia, pero para empezar usa pct set para no dejar el fichero en un estado inconsistente.

Qué tiene sentido meter en un LXC (y qué no)

LXC es ideal para servicios que se comportan como un sistema operativo normal pero no necesitan un kernel propio ni acceso directo al hardware. En mi homelab llevo años con contenedores corriendo sin tocarlos más que para actualizar paquetes.

Servicios que funcionan bien en LXC no privilegiado:

  • Servidores web: nginx, Caddy, Apache
  • Bases de datos: PostgreSQL, MariaDB, Redis
  • DNS y filtrado de anuncios: Pi-hole, AdGuard Home
  • Gestión de código: Gitea, Forgejo
  • Monitorización: Prometheus, Grafana, Uptime Kuma
  • Proxies inversos: Traefik, Nginx Proxy Manager

Donde conviene pensárselo antes de lanzarse:

  • Docker dentro de LXC: es posible habilitando el anidamiento (features: nesting=1 en la config del contenedor), pero en modo no privilegiado hay quirks adicionales. Si tu objetivo principal es correr Docker, una VM limpia te ahorra horas de depuración.
  • Servicios con módulos de kernel no estándar: si el servicio necesita cargar un módulo que no está cargado en el host, el contenedor no puede hacerlo por su cuenta. WireGuard lleva tiempo en el kernel mainline y ya no es problema habitual, pero hay otros servicios donde sí lo es.
  • Syscalls especiales o runtimes con JIT: algunos servicios de seguridad o entornos de ejecución con compilación JIT pueden chocar con las restricciones de seccomp en contenedores no privilegiados.

La regla práctica que aplico: si el servicio funciona en un VPS estándar de cualquier proveedor cloud, probablemente funciona en LXC no privilegiado. Si necesita acceso a dispositivos, módulos de kernel propios o privilegios del host, evalúa si una VM KVM no es más directo y menos dolor de cabeza.

Por último: LXC y Docker no son equivalentes ni directamente comparables. LXC gestiona un sistema operativo completo con su propio proceso de init; Docker gestiona procesos aislados con sus dependencias. Puedes tener Docker dentro de un LXC, pero son tecnologías con modelos de uso distintos y no deberían tratarse como sinónimos.

Javier — Maker, sysadmin y trastero serial

Preguntas frecuentes

Q: ¿Cuánto tarda en arrancar un contenedor LXC recién creado?

A: En segundos, literalmente. Al no haber emulación de hardware ni fase POST como en una VM, el contenedor levanta el proceso init directamente sobre el kernel del host. En un nodo Proxmox con SSD, estar dentro del contenedor en menos de 3 segundos desde el botón 'Start' es lo habitual.

Q: ¿Qué diferencia hay entre contenedor privilegiado y no privilegiado?

A: En el no privilegiado, el root del contenedor se mapea a un UID ≥100000 en el host mediante user namespaces, así que si algo escapa del contenedor no tiene privilegios reales en el host. El privilegiado comparte UID 0 con el host, lo que da más compatibilidad pero mayor superficie de ataque. Para empezar, no privilegiado es la opción sensata.

Q: ¿Dónde se guardan las plantillas que descargo en Proxmox?

A: En el propio nodo, en '/var/lib/vz/template/cache/'. Las descargas se gestionan desde la UI en la sección Templates del storage 'local', y Proxmox tira directamente de sus repositorios oficiales. El tiempo de descarga depende de tu ancho de banda; las plantillas base de Debian o Alpine pesan poco, Ubuntu algo más.

Q: ¿Qué pasa si el servicio que quiero necesita módulos de kernel?

A: Depende del módulo. Los contenedores LXC comparten el kernel del host, así que si el módulo ya está cargado en Proxmox el servicio funcionará. Si necesita algo que el host no tiene o requiere cargar un módulo en un contenedor no privilegiado, puede fallar o necesitar configuración adicional. En esos casos una KVM es la opción sin fricciones.

Q: ¿Vale LXC para correr cualquier distro Linux que quiera?

A: Las plantillas oficiales de Proxmox incluyen Debian, Ubuntu, Alpine, Fedora, Arch y algunas más. Fuera de esas, puedes importar plantillas de terceros, aunque la compatibilidad no está garantizada. Para contenedores no privilegiados, algunas distribuciones o servicios con syscalls especiales pueden necesitar ajustes adicionales respecto a un contenedor privilegiado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *