viernes, 2 de marzo de 2018

Docker (7): Stacks

1. Introducción

Estamos siguiendo al pie de la letra docs-docker.

Recordamos los tres niveles

  1. Stack (pila)
  2. Services (servicios)
  3. Containers (contenedores)
Nos vamos a centrar en el primer nivel (stack)

Un "stack" es un grupo d servicios interrelacionados que comparten dependencias y se pueden orquestar y escalar juntos.

2. Añadir un servicio nuevo

Vamos a añadir servicios a nuestro docker-compose.yml.

El servicio que vamos a añadir es un visualizador de servicios que nos permite ver como nuestro swarn planifica los contenedores. Y le sustituimos el contenido anterior por este otro, donde lo que se añade tiene un fondo color rosa:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: ximodante/get-started:part2
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

Destacamos:
  • Hemos añadido el servicio visualizer que está a la par con web.
  • La clave volume permite acceso al visualizador al socket del host para Docker.
  • La clave placement que asegura que el servicio solamente corre en un "swarm manager", y nunca en un "worker"
Verificar que las VMs del post anterior están corriendo

docker-machine ls


NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.102:2376           v17.12.1-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.103:2376           v17.12.1-ce   


Volvemos a ejecutar este comando para desplegar las variaciones efectuadas.

docker stack deploy -c docker-compose.yml getstartedlab
Contestando


artedlab
Updating service getstartedlab_web (id: 10kgd7crugh60vcivekjzwdx2)
Creating service getstartedlab_visualizer

En el navegador metemos 192.168.99.102:8080 y vemos


Como podemos ver hay una instancia del "getstartedlab_visualizer" y 5 instancias de "getstartedlab_web" dentro del swarm.

Ejecutemos este comando para verificarlo:

docker stack ps getstartedlab


ID                  NAME                         IMAGE                             NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
dj97yb5q551o        getstartedlab_visualizer.1   dockersamples/visualizer:stable   myvm1               Running             Running 5 minutes ago                       
lf3vepnhivp4        getstartedlab_web.1          ximodante/get-started:part2       myvm2               Running             Running 2 hours ago                         
s0y522grwgyp        getstartedlab_web.2          ximodante/get-started:part2       myvm1               Running             Running 2 hours ago                         
p6l9njwxhbrx        getstartedlab_web.3          ximodante/get-started:part2       myvm2               Running             Running 2 hours ago                         
3phjbcb63xx8        getstartedlab_web.4          ximodante/get-started:part2       myvm1               Running             Running 2 hours ago                         
o6um4bt8aoen        getstartedlab_web.5          ximodante/get-started:part2       myvm2               Running             Running 2 hours ago                         



3. Añadir otro servicio nuevo

Añadimos ahora un nuevo servicio con una dependencia: El servicio Redis que nosa facilita un contador de visitas.

Para ello modificamos el fichero docker-compose.yml con este otro, donde hemos añadido la parte rosa:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: ximodante/get-started:part2

    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:
Temenos que destacar:

  • Redis tiene una imagen oficial en la librería Docker y ha cedido la imagen con el nombre de redis, por eso no hace falta la nomenclatura username/repo
  • El puerto 6379 ha sido preconfigurado por Redis para ser mostrado desde el contenedor al host, y desde nuestro fichero yml lo mostramos desde  el host al resto del mundo.
  • Redis persiste los datos, ya que corre en el manager, por eso siempre utiliza el mismo sistema de ficheros y..
  • Redis accede a un directorio arbitrario del sistema de ficheros del host como /data dentro del contenedor que es donde Redis almacena los datos.
  • El comando placement guarda la información en el host y no en los contenedores
Se está creando una "Source of Truth" (SSOT) para los datos de Redis. Si no utilzara este sistema, y se almacenara dentro del contenedor, cada vez que desplegaramos los contenedores, la información de redis se barrería del mapa.

Creemos el directorio ./data en el manager

docker-machine ssh myvm1 "mkdir ./data"
Verifiquemos que nuestra shell está configurada para hablar con myvm1

docker-machine ls


NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.102:2376           v17.12.1-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.103:2376           v17.12.1-ce   

Vamos a desplegar

docker stack deploy -c docker-compose.yml getstartedlab


Updating service getstartedlab_visualizer (id: ljnvsbb8evthgftubytk16st6)
Creating service getstartedlab_redis
Updating service getstartedlab_web (id: 10kgd7crugh60vcivekjzwdx2)

Vemos que nuestro servicio Redis se ha creado y ahora vamos al navegador y tecleamos 192.168.99.102 



Como vemos, el contador de visitas está funcionando. Y si miramos al visualizador de servicios 192.168.99.102:8080 




Como se puede ver, el servicio "getsatartedlab_redis" está activo





No hay comentarios :

Publicar un comentario