>_Docker Engine V1.12 + Swarm

Docker Engine + Swarm

docker-swarm

O Docker Swarm é uma ferramenta nativa do Docker que permite a criação de um ou mais Cluster de Docker, ou seja, podemos fazer com que diversos hosts com o Docker estejam dentro do mesmo pool de recursos, facilitando assim o deploy dos containers.

É possível por exemplo criar um container sem necessariamente saber em qual host ele está, pois o Swarm disponibiliza uma API de integração, onde é possível realizar grande parte do seu gerenciamento.
Fonte: http://www.mundodocker.com.br/docker-swarm/

Para utilizar o Swarm basta instalar o Docker Engine v1.12. O Swarm possui nativamente um conjunto de recursos para criação de um Cluster Docker Engine.

Alguns recursos importantes do Swarm:

Modelo de serviço declarativo: Docker Engine usa uma abordagem declarativa para permitem definir o estado desejado dos vários serviços em sua pilha de aplicativos. Por exemplo, você pode descrever uma aplicação composta por um serviço de front-end web com serviços de enfileiramento de mensagens e um banco de dados backend.

Escalonamento: Para cada serviço, você pode declarar o número de tarefas que você deseja executar.

Monitoração do Cluster: O nó de gerenciamento monitora todo o Cluster e reconcilia as diferenças entre cada estado.

Network multi-host: Você pode especificar diversas redes para o Cluster.

Serviço de DNS: O nóde gerenciamento atribui um nome para cada container do Cluster.

Balanceamento de carga: Você pode expor as portas para os serviços a um balanceador de carga externa.

O Swarm possui diversos parâmetros na sua CLI, segue os mais importantes:

Cenário téccnico:

Instância: teste1 – 192.168.56.101
Instância: teste2 – 192.168.56.102
Instância: teste3 – 192.168.56.103

Passo 1 – Criando o Cluster na instância teste1.

root@teste1:/home/evandrocouto# docker swarm init --advertise-addr 192.168.56.101

Passo 2 – Adicionando as demais instâncias teste2 e teste3 ao Cluster.
instância teste2

root@teste2:/home/evandrocouto# docker swarm join --token SWMTKN-1-4bs8vyj025kq0uc60pln4lynbprnqvi66ydy7sb2ov97his3k2-95b6eic6ls8qdters632avraw 192.168.56.101:2377
This node joined a swarm as a worker.

instância teste3

root@teste3:/home/evandrocouto# docker swarm join --token SWMTKN-1-4bs8vyj025kq0uc60pln4lynbprnqvi66ydy7sb2ov97his3k2-95b6eic6ls8qdters632avraw 192.168.56.101:2377
This node joined a swarm as a worker.

Passo 3 – Listando os nodes (instâncias) do Cluster.

root@teste1:/home/evandrocouto# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2i6s8ebmr4oi1reybi7fceaim *  teste1    Ready   Active        Leader
7tvkcwm4vuh60y3ertv4b2b10    teste3    Ready   Active        
ar47oof94jxnistaldy5dwd3p    teste2    Ready   Active        

Passo 4 – Listando os serviços do Cluster.

root@teste1:/home/evandrocouto# docker service ls
ID  NAME  REPLICAS  IMAGE  COMMAND

Passo 5 – Criando a network multi-rede (overlay).

Obs: O Swarm faz com que a rede de sobreposição esteja disponível apenas para os containers que estão sobre o Cluster.  Quando você cria um serviço que usa uma rede sobreposta, o nó (instância) do gerenciador estende automaticamente a rede de sobreposição.

root@teste1:/home/evandrocouto# docker network create --driver overlay --subnet 192.168.100.0/24 mynet
9zq7swetllow9j24c2cxi8y0d

Passo 6 – Listando as networks

root@teste1:/home/evandrocouto# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
32f3594c7065        bridge              bridge              local               
4dce570747e8        docker_gwbridge     bridge              local               
38e6f7a45b0b        host                host                local               
395alndcwwco        ingress             overlay             swarm               
9zq7swetllow        mynet               overlay             swarm               
7744881e14a5        none                null                local 

Passo 7 – Criando o primeiro serviço. O serviço nada mais é que disparar uma série de tarefas para o Cluster. No serviço abaixo, será criado 6 container Nginx (Web Service), informando que será utilizado a network mynet (overlay) e que será publicado as portas 80 e 443.

root@teste1:/home/evandrocouto# docker service create --replicas 6 --network mynet --name my-web --publish 80:80 --publish 443:443 nginx
04jcmjed6783vd2nwgd3zz5el

Passo 8 – Listando o primeiro serviço criado chamado (my-web).
Obs: Percebam que as imagens estão sendo baixadas do repositório oficial em cada nó (instância) do Cluster. Por isso estão no no modo (Preparing).

root@teste1:/home/evandrocouto# docker service ps my-web
ID                         NAME      IMAGE  NODE    DESIRED STATE  CURRENT STATE             ERROR
8i2tzv2pk4siljixhceep4j99  my-web.1  nginx  teste1  Running        Preparing 25 seconds ago  
8l0fbxaptn43x82lqtnbro0bl  my-web.2  nginx  teste3  Running        Preparing 25 seconds ago  
8m3a0y3rthwiapg8sfvtvpwh3  my-web.3  nginx  teste2  Running        Preparing 24 seconds ago  
2kvei3x8p4lj04bterze6cpex  my-web.4  nginx  teste2  Running        Preparing 24 seconds ago  
3j1p88qayp549fsime9kmnias  my-web.5  nginx  teste1  Running        Preparing 25 seconds ago  
9vy7oeoggdi6d6a91r7q1wg0i  my-web.6  nginx  teste3  Running        Preparing 25 seconds ago  

Passo 9 – Listando novamente o serviço my-web após o download da imagem Nginx (Web Service).
Obs: Percebam que os containers já estão em execução (Running)

root@teste1:/home/evandrocouto# docker service ps my-web
ID                         NAME      IMAGE  NODE    DESIRED STATE  CURRENT STATE           ERROR
8i2tzv2pk4siljixhceep4j99  my-web.1  nginx  teste1  Running        Running 22 seconds ago  
8l0fbxaptn43x82lqtnbro0bl  my-web.2  nginx  teste3  Running        Running 12 seconds ago  
8m3a0y3rthwiapg8sfvtvpwh3  my-web.3  nginx  teste2  Running        Running 12 seconds ago  
2kvei3x8p4lj04bterze6cpex  my-web.4  nginx  teste2  Running        Running 12 seconds ago  
3j1p88qayp549fsime9kmnias  my-web.5  nginx  teste1  Running        Running 22 seconds ago  
9vy7oeoggdi6d6a91r7q1wg0i  my-web.6  nginx  teste3  Running        Running 12 seconds ago  

Passo 10 -Listando os containers.
Obs: Em cada instância teremos 2 containers em execução.

root@teste1:/home/evandrocouto# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea1546cb3cdd        nginx:latest        "nginx -g 'daemon off"   2 minutes ago       Up About a minute   80/tcp, 443/tcp     my-web.5.3j1p88qayp549fsime9kmnias
1e483f70a311        nginx:latest        "nginx -g 'daemon off"   2 minutes ago       Up About a minute   80/tcp, 443/tcp     my-web.1.8i2tzv2pk4siljixhceep4j99

Passo 11 – Fazendo o teste de ping entre os containers.
Obs: Vou enviar o comando ping da instância my-web5 para a instância my-web1. Por padrão o Docker Engine Swarm já configura o serviço de DNS (Domain Name Server).

root@teste1:/home/evandrocouto# docker exec -it my-web.5.3j1p88qayp549fsime9kmnias ping my-web.1.8i2tzv2pk4siljixhceep4j99
PING my-web.1.8i2tzv2pk4siljixhceep4j99 (192.168.100.3): 56 data bytes
64 bytes from 192.168.100.3: icmp_seq=0 ttl=64 time=0.051 ms
64 bytes from 192.168.100.3: icmp_seq=1 ttl=64 time=0.353 ms
^C--- my-web.1.8i2tzv2pk4siljixhceep4j99 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.051/0.202/0.353/0.151 ms

Passo 12 – Listando todos os serviços criados com o comando docker service ls.

root@teste1:/home/evandrocouto# docker service ls
ID            NAME    REPLICAS  IMAGE  COMMAND
04jcmjed6783  my-web  6/6       nginx

Passo 13 – Escalando de 6 para 12 containers.
Obs: hehehe fácil em….

root@teste1:/home/evandrocouto# docker service scale my-web=12
my-web scaled to 12

Passo 14 -Verificando se houve o escalonamento do serviço my-web.

root@teste1:/home/evandrocouto# docker service ps my-web
ID                         NAME       IMAGE  NODE    DESIRED STATE  CURRENT STATE           ERROR
8i2tzv2pk4siljixhceep4j99  my-web.1   nginx  teste1  Running        Running 6 minutes ago   
8l0fbxaptn43x82lqtnbro0bl  my-web.2   nginx  teste3  Running        Running 6 minutes ago   
8m3a0y3rthwiapg8sfvtvpwh3  my-web.3   nginx  teste2  Running        Running 6 minutes ago   
2kvei3x8p4lj04bterze6cpex  my-web.4   nginx  teste2  Running        Running 6 minutes ago   
3j1p88qayp549fsime9kmnias  my-web.5   nginx  teste1  Running        Running 6 minutes ago   
9vy7oeoggdi6d6a91r7q1wg0i  my-web.6   nginx  teste3  Running        Running 6 minutes ago   
4rne0mi4934viaddrh5d6nnr7  my-web.7   nginx  teste3  Running        Running 34 seconds ago  
f2mpc5p9pl2hytrg2b5iyp0z2  my-web.8   nginx  teste2  Running        Running 34 seconds ago  
dhskyo4amj82kjmoslxrz6gcb  my-web.9   nginx  teste1  Running        Running 34 seconds ago  
5qtulxu10kcs2f1kebtxy0ez0  my-web.10  nginx  teste1  Running        Running 34 seconds ago  
4zyoprkzuok6lo5t8az8gs7mq  my-web.11  nginx  teste3  Running        Running 34 seconds ago  
dt6sbqn2qgm3fydn5yvrwq9pi  my-web.12  nginx  teste2  Running        Running 34 seconds ago  

Passo 15 – Diminuindo o escalonamento para 3 containers.
Obs: hehehe mais fácil ainda…

root@teste1:/home/evandrocouto# docker service scale my-web=3
my-web scaled to 3

Passo 16 – Listando novamente o serviço my-web

root@teste1:/home/evandrocouto# docker service ps my-web
ID                         NAME       IMAGE  NODE    DESIRED STATE  CURRENT STATE                    ERROR
8i2tzv2pk4siljixhceep4j99  my-web.1   nginx  teste1  Shutdown       Shutdown 1 seconds ago           
8l0fbxaptn43x82lqtnbro0bl  my-web.2   nginx  teste3  Shutdown       Shutdown less than a second ago  
8m3a0y3rthwiapg8sfvtvpwh3  my-web.3   nginx  teste2  Shutdown       Shutdown less than a second ago  
2kvei3x8p4lj04bterze6cpex  my-web.4   nginx  teste2  Running        Running 6 minutes ago            
3j1p88qayp549fsime9kmnias  my-web.5   nginx  teste1  Running        Running 7 minutes ago            
9vy7oeoggdi6d6a91r7q1wg0i  my-web.6   nginx  teste3  Shutdown       Shutdown less than a second ago  
4rne0mi4934viaddrh5d6nnr7  my-web.7   nginx  teste3  Running        Running about a minute ago       
f2mpc5p9pl2hytrg2b5iyp0z2  my-web.8   nginx  teste2  Shutdown       Shutdown less than a second ago  
dhskyo4amj82kjmoslxrz6gcb  my-web.9   nginx  teste1  Shutdown       Shutdown 1 seconds ago           
5qtulxu10kcs2f1kebtxy0ez0  my-web.10  nginx  teste1  Shutdown       Shutdown 1 seconds ago           
4zyoprkzuok6lo5t8az8gs7mq  my-web.11  nginx  teste3  Shutdown       Shutdown less than a second ago  
dt6sbqn2qgm3fydn5yvrwq9pi  my-web.12  nginx  teste2  Shutdown       Shutdown less than a second ago  

Passo 17 – Aplicando os testes de desastre e recovery.
OBs: Encerrando a instância teste3 e em seguida reajustando o ambiente novamente.

root@teste3:/home/evandrocouto# /etc/init.d/docker stop
docker stop/waiting

Passo 18 – Listando os nodes.
Obs: Percebam que temos o nó (instância) teste3 em Down.

root@teste1:/home/evandrocouto# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2i6s8ebmr4oi1reybi7fceaim *  teste1    Ready   Active        Leader
7tvkcwm4vuh60y3ertv4b2b10    teste3    Down    Active        
ar47oof94jxnistaldy5dwd3p    teste2    Ready   Active

Passo 19 – Retirando do Cluster o node teste3.

root@teste1:/home/evandrocouto# docker node rm 7tvkcwm4vuh60y3ertv4b2b10
7tvkcwm4vuh60y3ertv4b2b10

Passo 20 – Listando novamente os nodes.

root@teste1:/home/evandrocouto# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2i6s8ebmr4oi1reybi7fceaim *  teste1    Ready   Active        Leader
ar47oof94jxnistaldy5dwd3p    teste2    Ready   Active

Passo 21 – Adicionando novamente o nó (instância) teste3 no Cluster.

root@teste3:/home/evandrocouto# docker swarm leave
Node left the swarm.
root@teste3:/home/evandrocouto# docker swarm join --token SWMTKN-1-4bs8vyj025kq0uc60pln4lynbprnqvi66ydy7sb2ov97his3k2-95b6eic6ls8qdters632avraw 192.168.56.101:2377
This node joined a swarm as a worker.

Passo 22 – Listando os nodes do Cluster.

root@teste1:/home/evandrocouto# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2i6s8ebmr4oi1reybi7fceaim *  teste1    Ready   Active        Leader
2nlay2cr1v5dggxu6r5oxuzqe    teste3    Ready   Active        
ar47oof94jxnistaldy5dwd3p    teste2    Ready   Active      

Passo 23 – Ajustando o escalonamento para rodar um container em cada instância.

root@teste1:/home/evandrocouto# docker service scale my-web=2
my-web scaled to 2
root@teste1:/home/evandrocouto# docker service scale my-web=3
my-web scaled to 3

Feito.
No próximo tutorial vou abordar como devemos montar um volume dentro de um Cluster de Docker Engine Swarm.

Mais …
https://docs.docker.com/engine/reference/commandline/

>_Docker Engine V1.12 + Swarm
Tagged on:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

%d blogueiros gostam disto: