Conceptos de contenedores
Introducción
Los contenedores son una forma de virtualización a nivel de sistema operativo que permite ejecutar procesos aislados compartiendo el mismo kernel del host. Son más ligeros que las máquinas virtuales y se han convertido en la base de la infraestructura moderna de aplicaciones y microservicios.
¿Qué son los contenedores?
Un contenedor agrupa una aplicación junto con todas sus dependencias (bibliotecas, configuración, binarios) en una unidad aislada y portable. A diferencia de las VMs, los contenedores no virtualizan hardware: comparten el kernel del sistema operativo anfitrión.
- Imagen: plantilla de solo lectura con el sistema de ficheros del contenedor
- Contenedor: instancia en ejecución de una imagen
- Runtime: motor que ejecuta los contenedores (Docker, containerd, crun)
- Registry: repositorio donde se almacenan y distribuyen imágenes (Docker Hub, ghcr.io)
Tecnologías del kernel que los hacen posibles
Namespaces
Los namespaces aíslan los recursos del sistema operativo para cada contenedor. Cada contenedor tiene su propia vista de:
- pid: árbol de procesos independiente (el proceso 1 del contenedor no es el init del host)
- net: interfaces de red, tablas de rutas y puertos propios
- mnt: sistema de ficheros montado independiente
- uts: hostname y nombre de dominio propios
- ipc: comunicación interproceso aislada
- user: mapeo de UIDs/GIDs entre host y contenedor
cgroups (Control Groups)
Los cgroups limitan y controlan el uso de recursos (CPU, memoria, disco, red) de cada contenedor. Gracias a ellos se puede garantizar que un contenedor no consuma más recursos de los asignados.
# Ver cgroups en uso por contenedores Docker
ls /sys/fs/cgroup/system.slice/ | grep docker
Union filesystems
Las imágenes de contenedor se construyen en capas superpuestas mediante sistemas de ficheros como OverlayFS. Cada instrucción del Dockerfile añade una capa de solo lectura; el contenedor en ejecución añade una capa de escritura encima. Esto permite compartir capas entre imágenes y ahorrar espacio en disco.
Contenedores vs Máquinas Virtuales
- Kernel: las VMs tienen kernel propio; los contenedores comparten el del host
- Arranque: contenedor en milisegundos; VM en segundos o minutos
- Tamaño: imagen de contenedor desde MB; imagen de VM desde GB
- Aislamiento: la VM ofrece aislamiento más fuerte (kernel separado)
- Densidad: caben muchos más contenedores que VMs en el mismo hardware
- SO guest: los contenedores Linux solo corren en hosts Linux (mismo kernel)
En la práctica, contenedores y VMs son complementarios: es habitual ejecutar contenedores dentro de VMs para combinar el aislamiento de las VMs con la ligereza de los contenedores.
Tipos de contenedores
- Contenedores de aplicación (Docker, Podman): diseñados para ejecutar un único proceso o servicio. La imagen contiene solo lo necesario para esa aplicación. Son efímeros y sin estado por defecto.
- Contenedores de sistema (LXC, LXD): emulan un sistema operativo completo con init, servicios, múltiples procesos... Se comportan más como una VM ligera que como un contenedor de aplicación.
Casos de uso
- Empaquetado y distribución de aplicaciones con sus dependencias
- Entornos de desarrollo reproducibles
- Microservicios y arquitecturas distribuidas
- Integración y entrega continua (CI/CD)
- Escalado horizontal de servicios (con Kubernetes u orquestadores)
- Entornos de prueba aislados