Guía introductoria a Docker. Contenedores vs máquinas virtuales, imágenes, docker-compose, Dockerfile y casos prácticos para desarrollo y producción.
El problema que Docker resolvió
"En mi máquina funciona" era la frase más repetida en desarrollo de software. Docker eliminó ese problema permitiendo empaquetar una aplicación con todas sus dependencias en un contenedor portátil.
¿Qué es un contenedor?
Un contenedor es un entorno aislado que incluye tu aplicación y todo lo que necesita para ejecutarse: sistema operativo base mínimo, bibliotecas, dependencias, archivos de configuración. Es ligero porque comparte el kernel del host, a diferencia de una máquina virtual que virtualiza hardware completo.
**Máquina virtual**: Hypervisor → SO invitado completo → Bibliotecas → App. Pesa GBs.
**Contenedor**: Docker Engine → Contenedor (App + dependencias). Pesa MBs.
Conceptos clave
**Imagen**: Una plantilla de solo lectura con las instrucciones para crear un contenedor. Como un snapshot de sistema de archivos. Se crean con un Dockerfile.
**Dockerfile**: Un archivo de texto con instrucciones para construir una imagen:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
**docker-compose.yml**: Define múltiples servicios que trabajan juntos. Ejemplo típico: app Node.js + PostgreSQL + Redis + Nginx. Un solo comando levanta todo el stack.
¿Por qué usar Docker?
### En desarrollo
### En producción
Casos de uso prácticos
### Base de datos desechable para desarrollo
En vez de instalar PostgreSQL localmente:
docker run -d --name pg-dev -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:16-alpine
### WordPress local con Docker Compose
Levantas WordPress + MySQL en 30 segundos para probar plugins o temas sin riesgo.
### CI/CD con GitHub Actions + Docker
Cada push a main construye la imagen, corre tests, y si pasan, despliega automáticamente en el VPS de producción.
### Microservicios
Cada parte de tu sistema (API auth, API productos, procesador de pagos, worker de emails) corre en su propio contenedor, independiente y escalable.