Docker Swarm

Que es docker swarm

Swarm es una herramienta desarrollada por el equipo de docker que nos permite gestionar un cluster de servidores docker.

Nos ayuda en el ordenamiento de las tareas y la asignación de recursos por contenedor dentro de un pool de servidores.

Su interés reside en que con él podemos gestionar el cluster como una única máquina Docker.

Arquitectura con Docker

Arquitectura con Swarm

Cliente Docker

Swarm

Que necesitamos para formar el cluster?

Un store

Vamos a necesitar nodos los cuales vamos agregar al cluster. Estos nodos deben de comunicarle al store para así mantener información sobre ellos.

Nodos

Vamos a necesitar un Key/Value store que almacene la información de nuestros nodos. Al final el store es nada mas que un service discovery y failure detection .

Vamos a necesitar un manager el cual sera el encargado de asignar contenedores dentro del cluster.

Manager

Dockerfile

FROM python:2.7.11-slim

MAINTAINER Jose Gabriel Giron <jgiron@mediainteractiva.net>

RUN apt-get update
RUN apt-get install -y build-essential --fix-missing --no-install-recommends
RUN apt-get install -y libpq-dev
RUN apt-get install -y postgresql-client --fix-missing --no-install-recommends
RUN apt-get install -y nginx --fix-missing --no-install-recommends
RUN apt-get install -y supervisor --fix-missing --no-install-recommends

RUN apt-get clean all

# setup project code
ENV INSTALL_PATH /usr/src/homepage
WORKDIR $INSTALL_PATH
COPY . .

# install any dependencies
RUN pip install -r requirements.txt

# configure nginx, uwsgi, supervisord
# sets nginx to run interactively for supervisord, removes the default nginx
# site, and moves your nginx and supervisord configuration in place
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/sites-enabled/default
RUN cp $INSTALL_PATH/nginx_app.conf /etc/nginx/sites-enabled/
RUN cp $INSTALL_PATH/supervisor_app.conf /etc/supervisor/conf.d/

Docker Compose

version: '2'
services:
  homepage:
    build:
      context: .
      dockerfile: Dockerfile-prod
    image: jgironmi/homepage-prod
    ports:
      - "80:80"
    volumes:
      - ./../media/files:/usr/src/homepage_media
      - ./../static/files:/usr/src/homepage_static
    depends_on:
      - postgres
    env_file:
      - ./homepage.env
    environment:
      - "constraint:node!=node-data"
    command: supervisord -n

  postgres:
    image: postgres:latest
    volumes_from:
      - appdata
    depends_on:
      - appdata
    environment:
      - "constraint:node==node-data"

  nginx:
    build:
      context: .
      dockerfile: Dockerfile-nginx
    image: jgironmi/nginx-balancer
    ports:
      - "80:80"
    environment:
      - "constraint:node==manager"

  appdata:
    image: busybox:latest
    volumes:
      - ./../postgresql/data:/var/lib/postgresql/data/
    environment:
      - "constraint:node==node-data"
docker-machine create -d virtualbox kvstore
docker $(docker-machine config kvstore) run -d --net=host progrium/consul --server -bootstrap-expect 1


docker-machine create -d virtualbox \
    --engine-opt "cluster-store consul://${kvip}:8500" \
    --engine-opt "cluster-advertise eth1:2376" \
    --swarm \
    --swarm-master \
    --swarm-discovery consul://${kvip}:8500 \
    manager


docker-machine create -d virtualbox \
      --engine-opt "cluster-store consul://${kvip}:8500" \
      --engine-opt "cluster-advertise eth1:2376" \
      --swarm \
      --swarm-discovery consul://${kvip}:8500 \
      node-[0-9]+

Como formar nuestro cluster

Importante saber

Estrategias:

  • Spread:
    • Asigna contenedores tomando en cuenta los recursos de los nodos, trata de nivelar la cantidad de contenedores en el cluster.
  • Binpack:
    • Asigna contenedores tomando en cuenta los recursos de los nodos, trata de llenar cada nodo de contenedores antes de pasar a otro nodo.
  • Random:
    • Asigna contenedores de forma aleatoria.

Importante saber

Filtros

Aparte de las estrategia que vimos anteriormente nosotros podemos decidir en que nodos colocar nuestros contenedores. Esto lo hacemos a través de filtros. 

 

 

Existen 2 tipos filtros; filtros sobre nodos y filtros sobre los contenedores.

Importante saber

En el filtro sobre nodos podemos usar estas variables de entorno:

    constraint

    health

    containerslots

En el filtro sobre contendores podemos usar estas variables de entorno:

  affinity

  dependency

  port

Docker Swarm

By Jose Gabriel Giron