Docker
¿Qué es Docker?
Docker es una plataforma de contenedores que te permite empaquetar aplicaciones junto con todas sus dependencias (librerías, configuraciones, runtime) en contenedores ligeros y portables. Los contenedores se ejecutan de manera consistente en cualquier entorno: desarrollo, staging, producción, nube o local.
¿Para qué sirve Docker?
Docker es esencial para:
- Crear entornos de desarrollo consistentes entre equipos.
- Simplificar el deployment de aplicaciones.
- Aislar aplicaciones y sus dependencias.
- Escalar aplicaciones de manera eficiente.
- Facilitar la integración continua y deployment continuo (CI/CD).
- Ejecutar múltiples servicios en un solo servidor.
¿Cómo funciona Docker?
Docker funciona como contenedores de envío para software. Imagina que tienes que enviar productos frágiles: en lugar de preocuparte por cómo cada camión, barco o tren manejará tu producto, lo pones en un contenedor estándar que protege el contenido y funciona en cualquier medio de transporte.
La analogía perfecta: Si tu aplicación fuera una planta, Docker sería como crear un invernadero portátil con el suelo, clima y nutrientes exactos que necesita. Puedes mover ese invernadero a cualquier lugar y la planta crecerá igual de bien.
Conceptos fundamentales
Imagen vs Contenedor:
- Imagen: Es como una “receta” o plantilla. Define qué ingredientes necesitas y cómo prepararlos.
- Contenedor: Es el “plato preparado”. La imagen ejecutándose en vivo.
Dockerfile: El archivo de receta que describe cómo construir tu imagen.
Docker Hub: Como un “supermercado” de imágenes pre-hechas que otros han creado y compartido.
Ejemplo práctico: una aplicación Node.js
Imagina que tienes una aplicación Node.js que funciona perfectamente en tu computadora, pero cuando tu compañero la ejecuta, obtiene errores porque tiene una versión diferente de Node.js.
Con Docker, creas un “paquete completo”:
# Dockerfile - La receta
FROM node:18-alpine # Usar Node.js versión 18
WORKDIR /app # Crear carpeta de trabajo
COPY package*.json ./ # Copiar archivos de dependencias
RUN npm install # Instalar dependencias
COPY . . # Copiar el resto del código
EXPOSE 3000 # Decir que usa puerto 3000
CMD ["npm", "start"] # Comando para ejecutar la app
Ahora cualquiera puede ejecutar tu app con:
docker build -t mi-app . # Construir la imagen
docker run -p 3000:3000 mi-app # Ejecutar el contenedor
Ventajas de usar Docker
🎯 “Funciona en mi máquina” → “Funciona en todas las máquinas” Ya no más problemas de “en mi computadora sí funciona”. Si funciona en Docker, funciona en cualquier lugar.
⚡ Desarrollo más rápido Nuevos desarrolladores pueden levantar todo el proyecto con un solo comando, sin instalar dependencias manualmente.
🔒 Aislamiento perfecto Cada aplicación vive en su propio “mundo” sin afectar a otras aplicaciones o al sistema principal.
📦 Portabilidad total El mismo contenedor funciona en tu laptop, en el servidor de producción, en AWS, Google Cloud, o donde sea.
🚀 Escalado sencillo ¿Necesitas manejar más tráfico? Solo ejecuta más copias del mismo contenedor.
Casos de uso comunes
1. Desarrollo en equipo Todo el equipo usa el mismo entorno, sin importar si usan Windows, Mac o Linux.
2. Microservicios Cada servicio (base de datos, API, frontend) vive en su propio contenedor, pero pueden comunicarse entre sí.
3. Testing Crear entornos de prueba idénticos a producción sin configuración compleja.
4. CI/CD Pipelines Automatizar el proceso de build, test y deploy usando la misma imagen en cada paso.
Docker Compose: aplicaciones con múltiples servicios
Cuando tu aplicación necesita varios componentes (base de datos, cache, API), Docker Compose te permite definirlos todos juntos:
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: password
Un solo comando levanta todo:
docker-compose up
Comandos Docker esenciales
# Construir y ejecutar
docker build -t mi-app . # Crear imagen
docker run -p 3000:3000 mi-app # Ejecutar contenedor
# Gestión básica
docker ps # Ver contenedores activos
docker stop nombre-contenedor # Parar contenedor
docker rm nombre-contenedor # Eliminar contenedor
# Limpieza
docker system prune # Limpiar recursos no utilizados
¿Cuándo usar Docker?
✅ Perfecto para:
- Aplicaciones web modernas
- Microservicios
- Equipos de desarrollo
- Deployment en la nube
- CI/CD automatizado
- Aplicaciones que necesitan múltiples servicios
❌ Tal vez no necesario para:
- Scripts simples de una sola vez
- Aplicaciones desktop tradicionales
- Proyectos muy pequeños con un solo desarrollador
Docker vs Máquinas Virtuales
| Característica | Docker | Máquina Virtual |
|---|---|---|
| Velocidad de inicio | Segundos | Minutos |
| Uso de recursos | Mínimo | Alto |
| Tamaño | MB | GB |
| Portabilidad | Excelente | Buena |
| Aislamiento | Proceso-level | Hardware-level |
Docker es más ligero porque comparte el kernel del sistema operativo, mientras que las VMs necesitan un sistema operativo completo para cada una.
Mejores prácticas simples
1. Usa imágenes oficiales
FROM node:18-alpine # ✅ Oficial y ligera
FROM ubuntu # ❌ Muy pesada para Node.js
2. No ejecutes como root
RUN adduser -D appuser
USER appuser
3. Usa .dockerignore
node_modules
.git
README.md
4. Mantén las imágenes pequeñas
- Usa imágenes Alpine cuando sea posible
- Instala solo lo necesario
- Limpia después de instalar paquetes
Errores comunes de principiantes
❌ No usar .dockerignore Resultado: Imágenes gigantes con archivos innecesarios.
❌ Ejecutar como root Resultado: Problemas de seguridad.
❌ No usar layers de cache Resultado: Builds lentos porque no aprovecha el cache.
❌ Poner todo en un solo contenedor Resultado: Contenedores difíciles de escalar y mantener.
El ecosistema Docker
Docker Desktop: Aplicación visual para Windows/Mac que facilita el uso.
Docker Hub: Repositorio público donde puedes encontrar imágenes pre-hechas.
Docker Compose: Para aplicaciones multi-contenedor.
Kubernetes: Para orquestación avanzada de contenedores en producción.
¿Por qué todos hablan de Docker?
Docker ha democratizado el deployment. Antes, configurar un servidor para tu aplicación era un proceso complejo que requería conocimiento profundo de sistemas. Ahora, si tu aplicación funciona en Docker localmente, funcionará igual en cualquier servidor.
Ha cambiado la industria porque:
- Reduce el tiempo de setup de proyectos de días a minutos
- Elimina la mayoría de problemas relacionados con entornos
- Hace que el scaling sea mucho más sencillo
- Permite a desarrolladores enfocarse en código, no en configuración de servidores
Conclusión
Docker no es solo una herramienta, es una mentalidad. Cambia la forma en que piensas sobre aplicaciones: en lugar de “instalar cosas en un servidor”, piensas en “empaquetar todo lo que necesito y ejecutarlo donde sea”.
Para desarrolladores modernos, Docker es tan esencial como Git. No solo mejora tu productividad individual, sino que te permite colaborar efectivamente en equipos y desplegar aplicaciones con confianza.
La inversión en aprender Docker se paga rápidamente: menos tiempo configurando entornos, menos bugs relacionados con diferencias ambientales, y deployment más confiables. Es una de esas tecnologías que, una vez que la dominas, no puedes imaginar trabajar sin ella.