Docker Swarm: treballant amb stacks

Docker Swarm: treballant amb stacks

Prerequisits: conèixer Docker i Docker Swarm.

Els stacks son arxius de configuració de serveis per a Docker Swarm, amb la mateixa sintaxi que el docker-compose però amb alguns paràmetres afegits, en particular a través de l'etiqueta deploy.


Primer docker stack amb traefik

Primer docker stack amb traefik

Anem a posar en marxa una xarxa amb dos serveis:

  • whoami : container que mostra la IP i algunes dades internes per a fer proves.
  • traefik : conegut load balancer i proxy invers per gestionar el balanceig de càrrega.

Traefik és un balancejador de càrrega i proxy invers basat en el llenguatge de programació Go! de Google molt emprat en orquestradors de contenidors.

Podràs visualitzar 2 webs (l'exemple és amb la IP que tenim configurada al Vagrantfile de Docker Swarm:

  • 10.100.199.200:8080 : veuràs el panell d'administració de traefik.
  • 10.100.199.200 : port 80 on podràs veure el frontend de traefik, però de moment ens mostra un Error 404: page not found.
    • Si volem veure la web, caldrà que configureu l'arxiu /etc/hosts i apuntar el domini whoami.docker.local a la IP de la màquina swarm.
    • OJU perquè el /etc/hosts que s'ha d'actualitzar és el de la màquina on estiguem executant el browser, probablement serà la teva màquina física.
    • Ara sí que podem visualitzar la web de whoami al navegador a:
      http://whoami.docker.local
whoami.stack.yml
version: '3'

services:
  traefik:
    image: traefik:v1.7
    command: --web \
      --docker \
      --docker.swarmmode
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - net
    deploy:
      placement:
        constraints: [node.role==manager]
        
  whoami:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    deploy:
      labels:
      - "traefik.enable=true"
      - "traefik.backend=whoami"
      - "traefik.docker.network=net"
      - "traefik.port=80"
      - "traefik.frontend.rule=Host:whoami.docker.local"
      #- "traefik.backend.loadbalancer.sticky=true"
    networks:
      - net

networks:
  net:

Per posar en marxa el stack ho podem fer d'aquestes dues maneres (amb una basta!):

docker stack deploy --compose-file whoami.stack.yml who
docker stack deploy -c whoami.stack.yml who

I ara, escalem el servei whoami:

docker service scale who_whoami=5
docker stack ls

Sticky sessions

Sticky sessions

Mira el backend d'administració del traefik

Posa en marxa el servei whoami a través del stack i visualitza la web del whoami.

  • Quan refresques t'apareix una IP diferent?

Ara descomenta la línia amb - «traefik.backend.loadbalancer.sticky=true» i posa en marxa de nou el stack.

  • Quan refresques t'apareix ara una IP diferent?
  • Canvia la IP si accedeixes a la web via curl?
    • ULL SPOILER ;) amb el curl la IP ha de variar. Si no ho fa pot ser que no hagis escalat el servei whoami (o que hagis actualitzat amb docker stack deploy i s'haurà resetejat a 1 instància).
    • Assegura't que tens diverses instàncies del servei whoami.
  • Què creus que significa el paràmetre sticky i perquè creus que funciona al browser però no amb curl?


Wordpress en swarm

Wordpress en swarm

Anem a fer una implementació de Wordpress amb Docker Swarm seguint l'arquitectura proposada en aquest diagrama:

Elabora un stack per allotjar una configuració de Wordpress.

Tingues en compte que la BD cal que estigui fixa al mateix node, ja que els volums NO es comparteixen entre màquines. Busca quina restricció ens ho permet realitzar.

Com a load balancer pots optar entre fer servir el propi de Docker Swarm (no cal crear cap servei específic, el mateix sistema ho facilita) o bé pots afegir un load balancer propi com traefik (en aquest cas sí que cal crear un servei, tens un exemple en l'anterior configuració).

  • Escala a, al menys, 3 instàncies del contenidor wp.
  • Instal·la el Wordpress i entra al panell d'administració.
  • Entra Penja un post amb una imatge.
  • Comprova què passa si visualitzem el post des de diferents finestres privades. Què creus que està passant?
  • Explica perquè es dona aquest error i proposa alguna solució raonant-la.


Docker secrets

Docker secrets

Docker Swarm ens permet no deixar la contrasenya en els arxius de configuració, utilitzant DOCKER SECRETS. Mitjançant aquest mecanisme posarem les contrasenyes, claus i altres dades sensibles a la RAM del Swarm, el què significarà un nivell més alt de seguretat.

Aquest és un exemple:

$ echo "micontraseña" | docker secret create mysql_password -

Els contenidors poden veure les contrasenyes accedint a, per exemple: /run/secrets/mysql_password.

Les podem utilitzar al fitxer de stack així:

services:
  ...
  db:
    ...
    environment:
      ...
      MYSQL_USER: wordpress
      MYSQL_PASSWORD_FILE: /run/secrets/mysql_password
    secrets:
      - mysql_password
...
secrets:
  - mysql_password
    - external: true


Gluster Filesystem

Gluster Filesystem

Per tal de facilitar la interoperativitat dels nodes en un Swarm es pot utilitzar un sistema d'arxius distribuit com GlusterFS.

Tens aquí algunes referències per instal·lar-lo: