>> Apresentação e considerações

Fala ChurrOpeiros!!!

Bora pra mais um artigo de Docker, esse artigo é sobre algo sensacional, pois vamos falar um pouco do nosso querido Docker Machine e o Docker Swarm, isso mesmo, vamos mostrar na prática o funcionamento e como gerenciamos um cluster de Docker.

O assunto é extremamente extenso e temos MUITO conteúdo a explorar, nesse post não vou falar de Containers, mais sim dos Docker Hosts.

Esse Post é destinado para aqueles que já estão começando a brincar com Docker e querem conhecer um pouco mais sobre essa ferramenta magnífica.

*** PARA VOCÊ QUE ESTÁ COMEÇANDO AGORA EM DOCKER ***

DICA 1: Surigo a leitura dos nossos outros artigos, temos uma sequência de posts que visam justamente essa introdução ao Docker de forma prática

https://churropsondevops.tech/category/docker/

DICA 2: Sigam o canal LinuxTips no Youtube, foi através dos vídeos sensacionais do Jeferson é que tive o meu primeiro contato com Docker, e ainda fiz o curso presencial…recomendo fortemente!

YouTube-LinuxTips

DICA 3: Adquira o livro “Docker para Desenvolvedores” do Rafael Gomes (Gomex), o livro está disponível online gratuitamente, mais você tem a opção de prestigiar o excelente trabalho do Gomex no famoso jeito do “Quer pagar quanto?”, veja o site:

Livro-Docker_para_Desenvolvedores

Sem mais delongas, Let`s go!

>> O que precisamos pra começar?

Nesse tutorial estou utilizando as seguintes versões abaixo, com o Docker à partir da versão 1.13 já é o suficiente, mais cá pra nós, atualizar é uma mamata.

  • Docker version 17.06.0-ce, build 02c1d87
  • docker-machine version 0.12.0, build 45c69ad
  • VirtualBox 5.1.22 r115126 (Qt5.6.2)

>> O que é Docker Machine?

Uma ferramenta que permite que você instale o Docker Engine em hosts virtuais, ou seja, com o Docker Machine você instala um ou mais Docker Hosts na sua máquina com o VirtualBox por exemplo, no seu datacenter e em diversos provedores de nuvem como AWS, Azure ou Digital Ocean.

Usando comandos docker-machine, você pode iniciar, inspecionar, parar e reiniciar um host gerenciado, atualizar o cliente Docker e daemon e configurar um cliente Docker para conversar com seu host.

Segue uma representação do seu funcionamento

machine-overview

Download e instalação:

macOS:

~# curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
  chmod +x /usr/local/bin/docker-machine

Linux:

~# curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

>> Basicamente o que é o modo Swarm?

Docker Swarm é uma das ferramentas mais sensacionais do Docker pois com ela podemos criar e gerenciar clusters de várias máquinas de Docker, tornando sua utilização muito mais ampla e sem dúvida muito mais poderosas.

Segue algumas características:

• Gerenciamento de cluster integrado com o Docker Engine
• Design descentralizado
• Modelo de serviço declarativo
• Escala
• Reconciliação do estado desejado
• Rede multi-host
• Descoberta do serviço
• Balanceamento de carga
• Seguro por padrão
• Atualizações em rolo.

Nessa imagem abaixo temos um desenho de como funciona uma topologia com o Docker Swarm

swarm-diagram

Documentação Swarm Mode

>> Mão na massa

Primeiramente vamos utilizar o for para criar 3 Docker Hosts com o docker-machine em nosso lab vamos criar utilizando o ViritualBox.

~# for N in 1 2 3; do docker-machine create --driver virtualbox docker-node-$N; done;

Listando os Docker Hosts criados

~# docker-machine ls

NAME       ACTIVE  DRIVER  STATE     URL SWARM            DOCKER ERRORS
docker-node-1 - virtualbox Running tcp://192.168.99.100:2376 v17.03.2-ce
docker-node-2 - virtualbox Running tcp://192.168.99.101:2376 v17.03.2-ce
docker-node-3 - virtualbox Running tcp://192.168.99.102:2376 v17.03.2-ce

As máquinas foram criadas no VirtualBox, não acredita? ….
(esse print foi tirado ao final do procedimento)….

Captura de Tela 2017-07-02 às 16.08.55

O comando docker-machine env serve para mostrar quais são as variáveis necessárias para realizar a conexão com o Docker Host que queremos através do Docker Machine

~# docker-machine env docker-node-1

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/rodrigo/.docker/machine/machines/docker-node-1"
export DOCKER_MACHINE_NAME="docker-node-1"
# Run this command to configure your shell:
# eval $(docker-machine env docker-node-1)

No próprio output do comando é exibida a instrução do que deve ser feito para gerenciar a máquina em questão, e em seguida vamos validar em qual máquina estamos conectados

~# eval $(docker-machine env docker-node-1)

~# env |grep docker

DOCKER_MACHINE_NAME=docker-node-1
DOCKER_CERT_PATH=/Users/rodrigo/.docker/machine/machines/docker-node-1

Escolhemos a máquina “docker-node-1” para ser a máquina Manager do nosso Cluster Swarm, para isso vamos iniciar o Swarm mode, novamente o próprio output do docker mostra o que se deve fazer para adicionar os workers ao manager

~# docker swarm init --advertise-addr 192.168.99.100

Swarm initialized: current node (8vezsstb1o5bnmcnnq69q8uq6) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0124752iaqvt7uy1fcsne5u3zd3b03fupen2qlajg0f4esl1vz-1g5iclmxdpf56bgm0wlx7qmq6 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

O nosso swarm está ativo! …com isso vamos listar os nodes do nosso cluster, e com isso vemos que temos somente 1 node ativo com o Swarm

~# docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
8vezsstb1o5bnmcnnq69q8uq6 *   docker-node-1       Ready               Active              Leader

>> Adicionando os nodes ao Swarm

Vamos conectar na segunda máquina agora, para isso o mesmo processo do eval é realizado, vamos carregar as variáveis de conexão da máquina docker-node-2 e em seguida vamos ingressá-la em nosso cluster como um “Worker”

Ingressando o docker-node-2 ao cluster como um worker

~# eval $(docker-machine env docker-node-2)

~# env |grep docker

DOCKER_MACHINE_NAME=docker-node-2
DOCKER_CERT_PATH=/Users/rodrigo/.docker/machine/machines/docker-node-2

Agora vamos executar o docker swarm join

~# docker swarm join --token SWMTKN-1-0124752iaqvt7uy1fcsne5u3zd3b03fupen2qlajg0f4esl1vz-1g5iclmxdpf56bgm0wlx7qmq6 192.168.99.100:2377

This node joined a swarm as a worker.

Ingressando o docker-node-3 ao cluster como um worker

~# eval $(docker-machine env docker-node-3)

Agora vamos fazer o join

~# docker swarm join --token SWMTKN-1-0124752iaqvt7uy1fcsne5u3zd3b03fupen2qlajg0f4esl1vz-1g5iclmxdpf56bgm0wlx7qmq6 192.168.99.100:2377

This node joined a swarm as a worker.

Isso mesmo, estamos no caminho certo!

Verificando o status dos nossos nodes

Devemos entrar novamente em nosso docker-node-1

~# eval $(docker-machine env docker-node-1)

E agora vamos listar os nodes, ou seja, as máquinas host que estão rodando docker e que fazem parte do nosso cluster swarm

~# docker node ls

ID                         HOSTNAME          STATUS   AVAILABILITY MANAGERSTATUS
30ubpbzqnnpaai9ndzhlpigfq   docker-node-2     Ready          Active
8vezsstb1o5bnmcnnq69q8uq6 * docker-node-1     Ready          Active              Leader
md2favh8ld7f701sxn7x5d1o1   docker-node-3     Ready          Active

O resultado do comando acima, mostra que nosso cluster está em ativo, em funcionamento e na coluna “MANAGER STATUS” diz que o node docker-node-1 é o Leader, ou seja, é o MANAGER, a máquina central que utilizamos para gerenciar e comandar o cluster, porém temos um grande detalhe IMPORTANTE…

…TEMOS SOMENTE UM NODE COMO MANAGER!!! ….HUMMM

>> Adicionando mais Managers – Failover

É importante que quando pensarmos em um cluster de swarm pensemos também na disponibilidade desse cluster e na tolerância a falhas, afinal se o nosso node manager MORRER, isso mesmo, se a nossa máquina host que está o node manager morrer o nosso cluster QUEBRA e todo o nosso trabalho vai por água abaixo!

Para isso vamos nos certificar que estamos em nosso node manager, vamos promover os nodes “docker-node-2” e “docker-node-3″, lembrando que teremos somente 1 Manager/”Leader”

Promovendo os demais nodes como Leader

Para tal operação vamos conectar no manager, e executar o docker node promote

~# eval $(docker-machine env docker-node-1)

~# docker node promote docker-node-2
Node docker-node-2 promoted to a manager in the swarm.

~# docker node promote docker-node-3
Node docker-node-3 promoted to a manager in the swarm.
~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
30ubpbzqnnpaai9ndzhlpigfq docker-node-2 Ready Active Reachable
8vezsstb1o5bnmcnnq69q8uq6 * docker-node-1 Ready Active Leader
md2favh8ld7f701sxn7x5d1o1 docker-node-3 Ready Active

Listando nossos nodes, vemos que o status passou de Active para Reachable, ou seja, os nodes que foram promovidos estão prontos para assumir caso o manager caia, como temos 2 aleatoriamente um dos 2 assumirá mantendo o cluster ativo.

>> Perdendo o manager, e agora?

Vamos simular a MORTE do nosso do node manager, mais vamos fazer isso na linha de comando removendo com o rm, esse comando literalmente faz o Docker Host alvo deixar de existir

Removendo a máquina docker-node-1

~# docker-machine rm docker-node-1

About to remove docker-node-1
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed docker-node-1

Agora vamos listar as máquinas que estão sendo gerenciadas com o docker-machine

~# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-node-2 - virtualbox Running tcp://192.168.99.101:2376 v17.03.2-ce
docker-node-3 - virtualbox Running tcp://192.168.99.102:2376 v17.03.2-ce
~# docker node ls
ID                          HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
30ubpbzqnnpaai9ndzhlpigfq * docker-node-2  Ready     Active     Reachable
8vezsstb1o5bnmcnnq69q8uq6   docker-node-1  Down      Active     Unreachable 
md2favh8ld7f701sxn7x5d1o1   docker-node-3  Ready     Active              Leader

O docker-node-1 está down, e o docker-node-3 assumiu o posto de Manager/Leader do Cluster, ou seja, à partir de agora é conectado nele que vamos gerenciar o cluster, sabemos que o nosso docker-node-1 está down e sabemos que a máquina de fato morreu, com isso vamos removê-la

~# eval $(docker-machine env docker-node-3)
~# docker node rm docker-node-1
docker-node-1
~# docker node ls
ID                            HOSTNAME    STATUS AVAILABILITY   MANAGER STATUS
30ubpbzqnnpaai9ndzhlpigfq   docker-node-2  Ready   Active        Reachable
md2favh8ld7f701sxn7x5d1o1 * docker-node-3  Ready   Active              Leader

>> Conclusão

Nesse Post procurei colocar os passos para a gerência de um cluster swarm utilizando o Docker Machine, em próximos posts vamos explorar mais dessas funcionalidades.

É isso ae galera, COMPARTILHEM esse post nas suas redes sociais, e vamos ajudar a disseminar o conhecimento dessa ferramenta tão excepcional.

Um agradecimento para o “Caio Abreu Ferreira” fizemos curso de Docker na mesma turma e aproveitei algumas anotações que ele cedeu para montar o post!

Obrigado a todos!