Conecta varias piezas sin complicaciones: con Docker Compose como miniorquestador local, levantas un balanceo de cargas con nginx y múltiples servicios en minutos. Un único archivo docker-compose.yml centraliza puertos, redes y builds, ahorrando comandos y ofreciendo más control y personalización del despliegue.
¿Qué es Docker Compose y por qué acelera microservicios?
Docker Compose se ejecuta en local y es una excelente práctica para microservicios. No se limita a un contenedor: pueden ser veinticinco o más y se publican y organizan de forma coherente. Gracias a un archivo en YAML, defines qué despliegas y cómo, sin repetir configuraciones manuales. El resultado: menos fricción, más claridad y una sola línea para construir y levantar todo.
¿Cómo organiza múltiples contenedores y puertos?
Define un servicio proxy basado en nginx que expone los puertos necesarios.
Mantiene servicios de sitio uno, dos y tres sin puertos expuestos, atendidos por nginx en el proxy.
Ajusta el archivo nginx.conf para que el upstream apunte a sitio uno, dos y tres e incluya el puerto interno de cada contenedor.
Usa una red compartida para que proxy y sitios se comuniquen sin exponer más de lo necesario.
¿Cómo preparar carpetas y el archivo docker-compose.yml?
Primero organiza tu proyecto. Crea la carpeta Compose y copia las carpetas del ejercicio de balanceo de cargas (incluyendo el proxy y los sitios). Abre el archivo del proxy, nginx.conf, y actualiza el bloque de upstream para sitio uno, dos y tres, agregando el puerto de comunicación interna de cada contenedor. Luego, en la raíz, crea el archivo docker-compose.yml (nombre exacto) y define servicios, puertos y red.
Estructura del archivo en YAML con lo esencial que se mencionó:
version:"3"services:proxy:build: ./proxy
ports:-"PUERTO_HOST:PUERTO_CONTENEDOR"networks:- red_balance
sitio1:build: ./sitio1
networks:- red_balance
sitio2:build: ./sitio2
networks:- red_balance
sitio3:build: ./sitio3
networks:- red_balance
networks:red_balance:{}# nombre: red balance; define aquí el tipo de red si aplica.
Claves de aprendizaje y habilidades:
Crear y nombrar correctamente archivos: docker-compose.yml con nombre exacto.
Configurar services, ports, build y networks en YAML.
Editar nginx.conf para el balanceo de cargas entre múltiples backends.
Organizar carpetas y reutilizar componentes previos para acelerar el setup.
¿Cómo ejecutar y verificar con Docker Compose?
Desde la terminal, cambia a la carpeta Compose y ejecuta el comando que compila y levanta todos los servicios en una sola pasada. Observa los logs: cada contenedor aparece con un color distinto, facilitando la lectura.
Comando único para construir y desplegar.
docker-compose up --build
Verifica en el navegador: abre localhost:8080 y comprueba la rotación entre la primera, segunda y tercera versión de la página.
Beneficios directos: te ahorras muchos comandos manuales, centralizas la configuración en YAML y tienes más control sobre qué y cómo se despliega.
¿Te gustaría comentar cómo estructurarías más servicios o qué variables agregarías al YAML para tu caso?
Si no funciona el balanceo al actualizar el navegador, desactivar los cachés desde el Devtool -- red(networking) porque el navegador NO crea una conexión nueva por cada recarga, sino que:
Reutiliza conexiones TCP (HTTP keep-alive)
Cada conexión queda “pegada” a un backend
O modificar el nginx.conf
server { listen 80; # Desactivar cache en el navegador
add_header Cache-Control"no-store, no-cache, must-revalidate, max-age=0" always; add_header Pragma"no-cache" always; add_header Expires0; # Desactivar keep-alive
keepalive_timeout 0; # Opcional: asegurar que NginxNO use conexiones persistentes con los backends
proxy_http_version 1.1; proxy_set_header Connection"close";location/{ proxy_pass http://backend_servers;}}
Para los casos donde solo usamos Docker, si es importante desplegar con ayuda de docker compose para agrupar servicios y optmizar tiempos de build y despliegues de servicios uno por uno
¿Quieres diferenciar el nombre del contenedor del nombre del servicio?
Utiliza el atributo container_name dentro de la definición del servicio. Por ejemplo: