¿Qué es un Contenedor?
Un contenedor es un entorno de ejecución ligero que empaqueta una aplicación y todas sus dependencias necesarias para ejecutarse. Comparte el kernel del sistema operativo host mientras ejecuta procesos de forma aislada.
Beneficios de los contenedores: Ligeros, arranque rápido, consistencia del entorno, eficiencia de recursos
Diferencias con las Máquinas Virtuales
Máquinas Virtuales (VM)
- Virtualizan completamente el sistema operativo guest sobre un hipervisor
- Cada VM tiene su propio kernel
- Toma varios minutos iniciar
- Consume recursos en el orden de GB
Contenedores
- Comparten el kernel del sistema operativo host
- Aislamiento a nivel de proceso
- Inician en segundos
- Consumen recursos en el orden de MB
Tecnologías del Kernel Linux
Los contenedores Docker utilizan dos características principales del kernel Linux:
1. Namespaces (Espacios de nombres)
Funcionalidad que aísla el alcance visible para los procesos:
- Namespace PID: Aísla los IDs de proceso
- Namespace Network: Aísla la pila de red
- Namespace Mount: Aísla el sistema de archivos
- Namespace UTS: Aísla el nombre de host
- Namespace User: Aísla los IDs de usuario
2. cgroups (Control Groups)
Funcionalidad que limita los recursos que los procesos pueden usar:
- Limitación del uso de CPU
- Limitación del uso de memoria
- Limitación de I/O de disco
- Limitación de ancho de banda de red
# Ejemplo de limitación de recursos de contenedor
docker run -d \
--cpus="1.5" \
--memory="512m" \
nginx
Estructura de una Imagen Docker
Las imágenes Docker están compuestas por capas de solo lectura:
- Imagen base: Sistema operativo (ubuntu, alpine, etc.)
- Dependencias: Librerías y runtime
- Aplicación: Código a ejecutar
Beneficios de las capas: Las capas comunes se comparten entre múltiples imágenes, mejorando la eficiencia del almacenamiento.
Resumen
Los contenedores Docker aprovechan namespaces y cgroups de Linux para proporcionar entornos de aislamiento ligeros y rápidos. Comparados con las máquinas virtuales, tienen significativamente menos overhead, siendo ideales para la arquitectura de microservicios moderna.
← Volver a la lista