En el entorno de las tecnologías un servicio es una aplicación que proporciona un recurso. Aquí vamos a aprender a escalar un servicio y balancear la carga entre los contenedores creados.

Para hacer esto, básicamente crearemos varios contenedores con el mismo servicio trabajando (podemos decir) en “paralelo” para que se puedan repartir la carga entre ellos. Para realizar esto tenemos dos alternativas:

  1. Crear varios contenedores (cada uno de diferentes servicios) en un solo host anfitrión con el archivo docker-compose.yml.
  2. Usar a nuestro “amigo” SWARM (Colmena o enjambre en inglés) para crear varios contenedores de uno o de diferentes servicios (balanceo de carga).

Swarm es ahora parte integral del engine y no tendremos que instalar elementos adicionales. Swarm es un protocolo de aglomeración nativo a Docker. Convierte un grupo de hosts anfitriones con docker engine en un solo host virtual de Docker. Ya que Swarm sirve a la API estándar de Docker, cualquier herramienta que se comunique con el «daemon» de Docker puede usar Swarm para «distribuirse» de forma transparente y proporcional entre varios hosts. En un clúster de Swarm existen dos tipos de nodo, Manager y Worker. Ls características de estos dos nodos son las siguientes:

  • Los nodos Manager (puede haber mas de uno) son los encargados de gestionar el clúster. Entre todos los Manager se elige automáticamente un líder y éste es el encargado de mantener el estado del clúster.
  • Los Manager son también los encargados de distribuir las tareas o tasks (unidades básicas de trabajo) entre todos los nodos Worker, los cuales reciben estas tareas y las ejecutan.

Los nodos Manager por defecto también actúan como nodos Worker aunque se puede cambiar su configuración para que sólo asuman tareas de Manager. La explicación mas en profundidad de Swarm la veremos en otra entrada, aquí nos centraremos en la alternativa «1», varios contenedores balancean la carga en un solo host anfitrión.

docker-compose-yml

Docker-compose (cuando se ejecuta en un solo host) sirve para «lanzar» un «stack», es decir un solo contenedor de cada servicio diferente (varios servicios diferentes a la vez), esto cambia con SWARM que permite varios contenedores de cada servicio y balanceo de carga.

Aunque ya hemos hablado anteriormente algo sobre docker-compose quería volver a incidir sobre sus grandes ventajas:

  • docker-compose puede «lanzar» uno o varios contenedores de un mismo servicio (varios solo con SWARM). Bien a través de una imagen existente (o en el propio host o en un repositorio como Hocker Hub) o bien creándola a través de un archivo «Dockerfile» (como ya se ha visto en otras entradas).
  • docker-compose puede «lanzar» un solo contenedor de cada servicio diferente a la vez en un mismo host (NO necesita SWARM).
  • Cada servicio lanzado (imaginemos que con varios contenedores cada uno) balancea la carga por defecto (round-robin es el comportamiento de SWARM por defecto).
  • Debemos lanzar nuestro docker-compose.yml en un nodo «manager» si queremos usar SWARM.
Funcionamiento de un archivo docker-compose lanzando dos servicios (web y redis)

Instalación de docker-compose

En Ubuntu 18.04 la instalación de docker-compose es:

sudo apt update
sudo curl -L «https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)» -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
###Para comprobarlo###
docker-compose –version

Ejemplo de una ejecución con docker-compose

El archivo “docker-compose.yml” es un archivo que define como se ha de comportar un servicio (de varios contenedores Docker) en producción (es decir “corriendo”). Un ejemplo que usaremos es el siguiente:

version: «3»
services:
web:
# hemos usado un «build» a traves de «Dockerfile»
build: .
ports:
– «8080:80»
networks:
– webnet

redis:
image: «redis:alpine»

networks:
webnet:

El ejemplo siguiente genera un contenedor (servicio web de apache como hemos creado antes con nuestro «Dockerfile» añadiéndole CMD [«apachectl», «-D», «FOREGROUND»]) y otro del servicio REDIS (Que comprueba el numero de visitas que tiene esa pagina web). El servicio REDIS solo lo vamos a lanzar acomo ejemplo y no nos va ha funcionar adecuadamenbte.

Lo más interesante es la respuesta en caso de fallo (condition: on-failure) que reinícia el contenedor que falle. Además, se mapea el puerto 8080 al 80 balanceando la carga en una red que se ha llamado “webnet” (podríamos haberla llamado de cualquier otra manera).

Este archivo puede ser configurado con muchos más parámetros como volúmenes de acceso (para hacer los datos permanentes), links, servidores proxy, etc.

Las instrucciones de docker-compose más empleadas son:

  • docker-compose up — > Da instrucciones a Docker para crear el contenedor, y ejecutarlo según docker-compose.yml (busca ese archivo por defecto). La opción «-d» es «detached».
  • docker-compose down — > Apaga todo los servicios que levantó con docker-compose up.
  • docker-compose ps — > Permite ver los contenedores funcionando.
  • docker-compose exec — > Permite ejecutar un comando a uno de los servicios levantados de Docker-compose.

A continuación vemos la ejecución de nuestro ejemplo.