1. Introducción
Estamos siguiendo al pie de la letra docs-docker.Recordamos los tres niveles
- Stack (pila)
- Services (servicios)
- 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
Contestandoartedlab 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