1. Introducción. Swarn, swarn manager, node, worker
Estamos siguiendo las instrucciones de docs-docker.Un "swarn" es un grupo de múltiples máquinas formando un cluster "dockerizado". Así una aplicación puede ser multi-container y multi-máquina.
Un "swarn" es un grupo de máquinas que están corriendo Docker y están unido formando un cluster.
Hay un "swarn manager" que ejecuta los comandos de docker. Las máquinas del "swarn" pueden ser físicas o lógicas. Después de unirse a un swarn, se les referirá como "nodes".
Los swarn managers son las únicas máquinas que pueden ejecutar órdenes docker. Tambien pueden autorizar a otras máquinas a unirse al swarn como "workers", sin que estas tengan la autoridad de un swarn manager frente a otras máquinas.
Docker puede correr en una máquina o varias máquinas (swarm mode). En este modo, nuestra máquina actua como swarm manager.
2. Prerequisito :Instalar Docker Compose
Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-container. Se configura con YAML.
Descargamos el producto
Damos permisos de ejecución a los binarios
Opcionalmente si utilizamos la bash podemos instalar el command completion que se instalara en /etc/bash_completion.d/
Descargamos el producto
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
Damos permisos de ejecución a los binarios
sudo chmod +x /usr/local/bin/docker-compose
Opcionalmente si utilizamos la bash podemos instalar el command completion que se instalara en /etc/bash_completion.d/
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.19.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
Basta con abrit un nuevo terminal para que funcione
3. Prerequisito :Instalar docker-machine
Para ello nos bajamos el software:
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
Comprobamos la instalación:
docker-machine version
Y sale:
docker-machine version 0.13.0, build 9ba6da9
4. Configurar el swarm
Para permitir el "swarm mode" y que nuestra máquina sea un "swarm manager":docker swarm init
y que otras máquinas se unan como "workers" , se ejecuta en cada máquina (no olvidar el puntito):
docker swarm join .
Debemos tener instalado el Virtual Box de Oracle y creamos 2 máquinas virtuales myvm1 y myvm2
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
Creating CA: /home/eduard/.docker/machine/certs/ca.pem Creating client certificate: /home/eduard/.docker/machine/certs/cert.pem Running pre-create checks... (myvm1) Image cache directory does not exist, creating it at /home/eduard/.docker/machine/cache... (myvm1) No default Boot2Docker ISO found locally, downloading the latest release... (myvm1) Latest release for github.com/boot2docker/boot2docker is v17.12.1-ce (myvm1) Downloading /home/eduard/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso... (myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100% Creating machine... (myvm1) Copying /home/eduard/.docker/machine/cache/boot2docker.iso to /home/eduard/.docker/machine/machines/myvm1/boot2docker.iso... (myvm1) Creating VirtualBox VM... (myvm1) Creating SSH key... (myvm1) Starting the VM... (myvm1) Check network to re-create if needed... (myvm1) Found a new host-only adapter: "vboxnet0" Error creating machine: Error in driver during machine creation: This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory
Como vemos sale un error que nos dice que hay que permitir el VT-x. Para ello rearrancamos el ordenador, entramos en la BIOS: Security-System Security- VT-x le damos a enable.
Voy a eliminar las máquinas:
docker-machine rm myvm1
docker-machine rm myvm2
Para listar las máquinas para ver si se han eliminado:
docker-machine ls
Y vuelvo a repetir los pasos para crear otra vez las máquinasdocker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
Y para la primera máquina sale:Running pre-create checks... Creating machine... (myvm1) Copying /home/eduard/.docker/machine/cache/boot2docker.iso to /home/eduard/.docker/machine/machines/myvm1/boot2docker.iso... (myvm1) Creating VirtualBox VM... (myvm1) Creating SSH key... (myvm1) Starting the VM... (myvm1) Check network to re-create if needed... (myvm1) Waiting for an IP... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env myvm1
Para listar las máquinas
docker-machine ls
Y sale: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
Como vemos, las máquinas estan corriendo sin errores.
5. Inicializar el swarm y añadir nodes
La primera máquina actuará de "manager" y la segunda de "worker".Vamos a decirle a la primera máquina que sea manager, para ello le enviamos la orden
docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.102:2376"
- docker-mashine ssh se utiliza para enviar comandos a una máquina
- docker swarm init .. es para hacerla manager
- 192.168.00.102:2376 es la URL de la primera máquina
Contesta:
Swarm initialized: current node (766cvl4wmayrwn7ly1tk92oi8) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2376 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Dándonos el comando para añadir la segunda máquina como worker. Y ejecutamos el código amarillo pero enviándoselo por ssh a myvm2:
docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2376"
Y contesta:Error response from daemon: rpc error: code = Internal desc = connection error: desc = "transport: remote error: tls: bad certificate" exit status 1
Y según este link, hay que cambiar el puerto 2376 por 2377 y funciona
docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2377"
Contestando:
qdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2377" This node joined a swarm as a worker.
Si se quiere salir del swarn se puede teclear para cada nodo.
docker swarn leave
6. Desplegar la aplicacion en el swarm cluster
Para ejecutar comandos en una máquina virtual hacíamos uso de docker-mashine ssh, Pero ahora vamos a utilizar otra opción que es docker-mashine env <machine> , que nos pormite utilizar ficheros de configuración docker-compose.yml, para desplegar la aplicacion de forma remota sin tenerla que copiar a ninguna parte.Vamos a ejecutar
docker-machine env myvm1
export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.102:2376" export DOCKER_CERT_PATH="/home/eduard/.docker/machine/machines/myvm1" export DOCKER_MACHINE_NAME="myvm1" # Run this command to configure your shell: # eval $(docker-machine env myvm1)
Y ejecutamos la orden de amarillo:
eval $(docker-machine env myvm1)
Y comprobamos que myvm1 es la máquina activa ya que tiene el asterisco
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 la aplicación en el swarm manager. Para ello sabemos que el comando docker stack deploy despliega las aplicaciones, y tenemos un fichero de configuración docker-compose.yml . Tenemos nuestra maquina myvm1 activa. Nos situamos en el directorio donde reside el docker-compose.yml y ejecutamos
docker stack deploy -c docker-compose.yml getstartedlab
y nos contesta:Creating network getstartedlab_webnet Creating service getstartedlab_web
Veamos como se ejecuta:
docker stack ps getstartedlab
Y vemos que los servicios se distribuyen en ambas máquinas
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lf3vepnhivp4 getstartedlab_web.1 ximodante/get-started:part2 myvm2 Running Running 7 minutes ago s0y522grwgyp getstartedlab_web.2 ximodante/get-started:part2 myvm1 Running Running 7 minutes ago p6l9njwxhbrx getstartedlab_web.3 ximodante/get-started:part2 myvm2 Running Running 7 minutes ago 3phjbcb63xx8 getstartedlab_web.4 ximodante/get-started:part2 myvm1 Running Running 7 minutes ago o6um4bt8aoen getstartedlab_web.5 ximodante/get-started:part2 myvm2 Running Running 7 minutes ago
Vamos a acceder al cluster, ya sea por la dirección IP de myvm1 o myvm2, todas repiten las 5 instancias cíclicamente de hostname cuando refrescamos el navegador, demostrando la carga balanceada. Se dice pues que hay un "routing mesh"
Si ahora cambiamos el docker-compose.yml para cambiar el comportamiento del programa, al igual que hicimos en un post anterior hacemos
docker stack deploy -c docker-compose.yml getstartedlab
7. Parar el swarm y eliminarlo
Para parar el swarm ejecutamos:
docker stack rm getstartedlab
Para eliminar el swarm, tras haberlo parado en elpunto anterior:
Ejecutamos para el "worker":
docker-machine ssh myvm2 "docker swarm leave"
Ejecutamos para el "manager":
docker-machine ssh myvm1 "docker swarm leave --force"
Si queremos eliminar las variables de entorno de nuestra shell ejecutamos
eval $(docker-machine env -u)
Cosa que desconecta la shell de las máquinas virtuales creadas con "docker-machine create", y nos permite continuar trabajando con la misma shell, pero ahora usando los comandos "docker"
Si queremos rearrancar la máquinas docker ejecutamos:
docker-machine start <machine-name>
8. Cheat sheet
Ahí va un resumen:
docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # View basic information about your node
docker-machine ssh myvm1 "docker node ls" # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>" # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker" # View join token
docker-machine ssh myvm1 # Open an SSH session with the VM; type "exit" to end
docker node ls # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave" # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1 # Start a VM that is currently not running
docker-machine env myvm1 # show environment variables and command for myvm1
eval $(docker-machine env myvm1) # Mac command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app> # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u) # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q) # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images
No hay comentarios :
Publicar un comentario