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
Docker Swarm
By Jose Gabriel Giron
Docker Swarm
- 311