10.2 Contenedores en Linux: Docker y Virtualización Ligera¶
Introducción¶
La evolución natural de la virtualización tradicional (KVM) ha llevado a un modelo más eficiente y ligero: los contenedores. A diferencia de las máquinas virtuales, los contenedores no virtualizan hardware, sino que comparten el kernel del sistema operativo, permitiendo ejecutar aplicaciones de forma aislada con un consumo de recursos mínimo.
En entornos modernos, los contenedores son la base de arquitecturas cloud-native, microservicios y despliegues continuos. Herramientas como Docker han simplificado enormemente su adopción.
Para un Sysadmin senior, dominar contenedores implica ser capaz de desplegar aplicaciones de forma reproducible, portable y escalable.
Objetivos de aprendizaje¶
Al finalizar este capítulo serás capaz de:
- Comprender qué son los contenedores y cómo funcionan internamente.
- Diferenciar entre virtualización tradicional y contenedores.
- Instalar y configurar Docker en Linux.
- Crear, ejecutar y gestionar contenedores.
- Aplicar buenas prácticas en entornos de producción.
Conceptos Teóricos¶
1. ¿Qué es un contenedor?¶
Un contenedor es una unidad estándar de software que incluye:
- código de aplicación
- dependencias
- librerías
- configuración
Todo ello aislado del sistema mediante características del kernel:
- namespaces → aislamiento
- cgroups → control de recursos
Concepto clave
Un contenedor no incluye un sistema operativo completo, solo lo necesario para ejecutar la aplicación.
2. Contenedores vs Máquinas Virtuales¶
| Característica | VM (KVM) | Contenedor |
|---|---|---|
| Kernel propio | Sí | No |
| Peso | Alto | Ligero |
| Arranque | Minutos | Segundos |
| Aislamiento | Fuerte | Medio |
3. Docker como estándar de facto¶
Docker proporciona:
- runtime de contenedores
- construcción de imágenes
- gestión de redes y almacenamiento
Componentes principales:
- docker daemon (dockerd)
- docker CLI
- imagenes
- contenedores
4. Imágenes y contenedores¶
- Imagen → plantilla inmutable
- Contenedor → instancia en ejecución
Ejemplo:
5. Ciclo de vida de un contenedor¶
- Crear imagen
- Ejecutar contenedor
- Modificar/usar
- Detener
- Eliminar
6. Almacenamiento y persistencia¶
Por defecto, los contenedores son efímeros.
Opciones:
- volúmenes
- bind mounts
Laboratorio Práctico¶
Escenario¶
Desplegar un contenedor web con Docker:
- instalar Docker
- ejecutar nginx
- exponer servicio
- persistir datos
Parte 1: Instalación de Docker¶
Verificación:
Paso 2: Habilitar servicio¶
Paso 3: Añadir usuario¶
Parte 2: Ejecutar contenedor¶
Explicación¶
-d→ modo detached-p→ mapeo de puertos--name→ nombre contenedornginx→ imagen
Verificación¶
Acceso:
Parte 3: Gestión de contenedores¶
Detener:¶
Arrancar:¶
Eliminar:¶
Parte 4: Persistencia con volúmenes¶
Parte 5: Crear imagen propia¶
Construir imagen:
Ejecutar:
Output esperado¶
Errores Comunes y Troubleshooting¶
1. Permiso denegado¶
Solución:
2. Puerto ocupado¶
3. Contenedor se detiene¶
4. Imagen no encontrada¶
Solución:
verificar nombre imagen.
5. Problemas de red¶
Buenas Prácticas (Nivel Senior)¶
1. Imágenes mínimas¶
Usar imágenes ligeras:
- alpine
- distroless
2. No usar root¶
3. Persistencia adecuada¶
Nunca almacenar datos críticos dentro del contenedor.
4. Versionado de imágenes¶
Evitar latest en producción.
5. Logs centralizados¶
No depender de logs internos.
6. Seguridad¶
- escanear imágenes
- limitar capacidades
- usar namespaces correctamente
7. Resource limits¶
8. Networking controlado¶
- redes custom
- aislamiento
9. Integración con CI/CD¶
Construcción automática de imágenes.
Resumen y Siguiente Paso¶
Has aprendido a trabajar con contenedores en Linux utilizando Docker, comprendiendo su arquitectura, ciclo de vida y operación en entornos reales. Esto te permite desplegar aplicaciones de forma eficiente, portable y escalable.
Los contenedores son solo el primer paso. En entornos complejos, necesitas orquestación para gestionar múltiples instancias y servicios.
➡️ Siguiente tema: 10.3 Kubernetes (K8s) — Orquestación de contenedores a escala.