¿Qué problema resuelve Docker?
Imagina este escenario (que pasa TODO el tiempo):
| Situación | Lo que escuchas |
|---|---|
| Desarrollador | "En mi máquina funciona perfecto" |
| Servidor de producción | Error 500, crash, dependencias faltantes |
| Nuevo desarrollador | "Llevo 2 días configurando el entorno" |
| DevOps | "¿Qué versión de Node usaste? ¿Y de Python?" |
Docker resuelve esto empaquetando tu aplicación CON TODO lo que necesita: código, runtime, librerías, configuración. Si funciona en Docker, funciona en cualquier lado.
🖥️ Máquinas Virtuales vs Contenedores
MÁQUINA VIRTUAL CONTENEDOR (DOCKER)
───────────────── ────────────────────
┌─────────────────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ App │ │ App1 │ │ App2 │ │ App3 │
├─────────────────┤ ├──────┴─┴──────┴─┴──────┤
│ Libs/Binaries │ │ Libs/Binaries │
├─────────────────┤ ├────────────────────────┤
│ Guest OS │ ← SO completo│ Docker Engine │
│ (Ubuntu 8GB) │ │ (~100MB) │
├─────────────────┤ ├────────────────────────┤
│ Hypervisor │ │ Host OS │
├─────────────────┤ ├────────────────────────┤
│ Host OS │ │ Hardware │
├─────────────────┤ └────────────────────────┘
│ Hardware │
└─────────────────┘
🐢 Pesado: 10-20 GB por VM 🚀 Ligero: 100-500 MB
⏱️ Boot: 1-2 minutos ⏱️ Boot: 1-2 segundos
📦 Aislamiento completo 📦 Aislamiento a nivel proceso
💰 Ahorro de recursos
| Métrica | VM Tradicional | Contenedor Docker |
|---|---|---|
| RAM por instancia | 1-8 GB | 50-500 MB |
| Disco | 10-40 GB | 100 MB - 2 GB |
| Tiempo de inicio | 30s - 2min | 1-5 segundos |
| Apps por servidor | 5-10 VMs | 50-100+ contenedores |
| CPU overhead | 15-20% | 1-5% |
💡 En un servidor con 32GB RAM: puedes correr ~4 VMs o ~50 contenedores haciendo lo mismo.
¿Por qué es esencial para el desarrollador moderno?
| Uso | Beneficio |
|---|---|
| Desarrollo local | El mismo entorno que producción |
| Onboarding | Nuevo dev productivo en minutos, no días |
| CI/CD | Tests en ambiente idéntico a producción |
| Microservicios | Cada servicio en su contenedor |
| Experimentar | Probar tecnologías sin ensuciar tu sistema |
| Escalabilidad | Kubernetes orquesta miles de contenedores |
🔧 Alternativas a Docker
Docker popularizó los contenedores, pero no es la única opción:
| Tecnología | Creador | Características |
|---|---|---|
| Docker | Docker Inc | El más popular, Docker Hub, Docker Desktop |
| Podman | Red Hat | Sin daemon, rootless, compatible con Docker CLI |
| containerd | CNCF | Runtime usado por Docker y Kubernetes |
| LXC/LXD | Canonical | Contenedores de sistema (más parecido a VMs) |
| Colima | Open Source | Docker en macOS/Linux sin Docker Desktop |
💡 Tip: Si usas Linux y quieres evitar Docker Desktop, Podman es la alternativa más popular. Los comandos son casi idénticos:
podman runen lugar dedocker run.
Conceptos clave
| Concepto | Qué es | Analogía |
|---|---|---|
| Imagen | Plantilla inmutable | Receta escrita |
| Contenedor | Instancia de una imagen | Platillo preparado |
| Dockerfile | Instrucciones para crear imagen | Pasos de la receta |
| Registry | Repositorio de imágenes | Biblioteca de recetas |
| Volumen | Datos persistentes | Ingredientes que guardas |
| Red | Comunicación entre contenedores | Conexión entre cocinas |
Instalación
| Sistema | Opción recomendada | Alternativa ligera |
|---|---|---|
| macOS | brew install --cask docker | Colima + Docker CLI |
| Windows | Docker Desktop (WSL2) | Podman Desktop |
| Linux | Docker Engine | Podman (sin daemon) |
# Verificar instalación
docker --version
docker run hello-world
Ciclo de vida de un contenedor
Dockerfile docker build Imagen docker run Contenedor
────────── ─────────────────▶ ──────── ───────────────────▶ ──────────
(receta) (platillo (servido)
congelado)
docker push docker pull
───────────▶ Docker Hub ◀───────────────────
(registro)
Tu primer contenedor
# Prueba que Docker funciona
docker run hello-world
# Ejecutar Ubuntu interactivo
docker run -it ubuntu bash
# Dentro del contenedor:
cat /etc/os-release # Ubuntu!
exit # Salir
Comandos esenciales
# ===== CONTENEDORES =====
docker ps # Ver corriendo
docker ps -a # Ver todos
docker run -d nginx # Ejecutar en background
docker run -p 8080:80 nginx # Mapear puerto
docker stop <id> # Parar
docker rm <id> # Eliminar
docker logs <id> # Ver logs
docker exec -it <id> bash # Entrar a contenedor
# ===== IMÁGENES =====
docker images # Ver imágenes locales
docker pull node:20 # Descargar imagen
docker rmi <imagen> # Eliminar imagen
# ===== LIMPIEZA =====
docker system prune # Eliminar todo lo no usado
Ejemplo práctico: Servidor web en 10 segundos
# Nginx sirviendo archivos de tu carpeta actual
docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx
# Abre http://localhost:8080
Tu primer Dockerfile
# Imagen base
FROM node:20-alpine
# Directorio de trabajo
WORKDIR /app
# Copiar dependencias primero (mejor cache)
COPY package*.json ./
RUN npm ci
# Copiar código
COPY . .
# Puerto que expone
EXPOSE 3000
# Comando al iniciar
CMD ["npm", "start"]
# Construir imagen
docker build -t mi-app .
# Ejecutar
docker run -p 3000:3000 mi-app
Casos de uso comunes
# Base de datos PostgreSQL (datos persistentes)
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=secreto \
-v pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16
# Redis para cache
docker run -d --name redis -p 6379:6379 redis:alpine
# Adminer (interfaz web para DBs)
docker run -d -p 8081:8080 adminer
¿Cuándo NO usar Docker?
| Situación | Por qué |
|---|---|
| Apps GUI desktop | Docker es para servicios, no para apps visuales |
| Máximo rendimiento | El overhead es mínimo pero existe |
| Scripts simples | Overkill para un script de 10 líneas |
| Hardware específico | GPUs requieren configuración extra |
Siguiente nivel
→ Docker Compose — Orquesta múltiples contenedores
🍳 Practica
→ Docker Hello World — Tu primer contenedor
Enlaces útiles
- 📖 Docker Docs
- 📖 Podman — Alternativa de Red Hat
- 🎓 Docker Getting Started
- 📖 Awesome Docker