>> 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!
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
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
>> 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)….
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!
30/08/2018 at 6:46 pm
Excelente material!
CurtirCurtir