Balanceo de Carga con Docker y Proxy Reverso en NginX

Clase 20 de 34Curso de Docker Avanzado

Resumen

¿Cómo interactúan los contenedores de Docker con la red?

Docker ofrece un entorno versátil para crear y manejar contenedores que permiten establecer interacciones específicas entre ellos. Al implementar redes dentro de Docker, los contenedores pueden comunicarse y compartir recursos. Este artículo explica cómo configurar la red en Docker al desplegar múltiples sitios web variando solamente una palabra en su contenido, usando un proxy inverso con Nginx.

¿Cómo construir contenedores de sitios web personalizados?

Primero, es esencial entender cómo crear contenedores para diferentes sitios web. El objetivo es lograr tres versiones de un sitio web utilizando contenedores Docker.

  1. Crear directorios para los sitios web: En Visual Studio, se crea una carpeta llamada carga y dentro de ella tres subcarpetas: sitio1, sitio2, y sitio3.
  2. Configurar Dockerfile para cada sitio: En cada carpeta de sitio, se incluye un Dockerfile que usa una imagen base de Nginx y despliega una sencilla página HTML. Esta página debe indicarse como "mi página de inicio personalizada" seguida de su versión para distinguir entre las tres.

Aquí un ejemplo de cómo podría verse un Dockerfile para uno de los sitios:

FROM nginx

COPY ./index.html /usr/share/nginx/html/index.html

EXPOSE 80

3. Crear imágenes Docker: Empleando el terminal, se crean imágenes Docker para cada sitio. Ejemplo para sitio1:

docker build -t server1 ./sitio1

¿Cómo configurar un proxy inverso con Nginx?

El siguiente paso es establecer un proxy inverso que distribuya el tráfico entre las versiones de los sitios usando Nginx.

  1. Crear una carpeta de proxy: Se crea una nueva carpeta llamada proxy.
  2. Configurar el Dockerfile para Nginx: En esta carpeta proxy, se define un Dockerfile que incluya Nginx como base y copie un archivo de configuración nginx.conf al contenedor.

Aquí un ejemplo simplificado del Dockerfile:

FROM nginx

COPY ./nginx.conf /etc/nginx/nginx.conf

3. Escribir el archivo de configuración nginx.conf: Este archivo dirige las solicitudes al proxy reverso y distribuye la carga entre los contenedores.

Ejemplo del contenido básico del archivo nginx.conf:

events {}

http {
    upstream backend {
        server backend1;
        server backend2;
        server backend3;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

¿Cómo ejecutar los contenedores y el proxy?

  1. Crear la red en Docker: Configura un entorno de red con el comando:

    docker network create red_balance

  2. Desplegar los sitios web en red: Luego, ejecuta cada contenedor del sitio en segundo plano, asegurándose de conectarlo a la red creada:

    docker run -d --name backend1 --network red_balance server1

Repita el mismo proceso para los otros contenedores backend2 y backend3.

  1. Implementar el proxy: Crear la imagen y el contenedor del proxy, asegurando que este conectado a la misma red:

    docker build -t proxy ./proxy docker run -d --name load_balance -p 8080:80 --network red_balance proxy

¿Cómo verificar la configuración?

Para encontrar las imágenes y contenedores creados, utilizamos comandos como docker images y docker ps. Los listados confirmarán si los contenedores están operativos y enlazados correctamente:

  • Docker Images: Confirma la existencia de las imágenes de los sitios y el proxy.
  • Docker PS: Muestra los contenedores operativos, permitiendo supervisar el estado del sistema.

Consejos prácticos:

  • Aprovecha Docker Desktop para una interfaz visual del entorno creado.
  • Refresca el navegador para observar cómo cambia la versión de la página.
  • Experimenta añadiendo más sitios para robustecer la experiencia y observar el balanceo de carga.

Finalmente, si bien el ejemplo es educativo, resulta útil para entender el concepto de balanceo de carga en aplicaciones desarrolladas con contenedores. En un entorno productivo, un orquestador como Kubernetes podría facilitar la gestión del tráfico entre contenedores.