Primeiros passos com docker swarm
Tags: devops, docker, kubernetes
Published: 2020-09-25 11:46:18

> Nesse artigo, não irei explicar muita teoria e sim colocar a mão na massa para os primeiros passos com o swarm.

Primeiramente meu nome é Gabriel, e o conteúdo a ser abordado é para iniciantes em containers docker e orquestração com o swarm,  vamos utilizar o [Play with docker](https://labs.play-with-docker.com/) com ele conseguimos simular algumas instâncias com o docker já instalado.

Vamos começar, criando duas instâncias, e rodar no terminal: `docker swarm init` (aconselho sempre que aprender algum comando novo, digita o `— help` para ver todas opções possíveis).

![1](https://dev-to-uploads.s3.amazonaws.com/i/66qd1l31tk604wwmuta5.png)

Note que não foi possível iniciar nosso cluster swarm e o próprio swarm nos avisou que devemos especificar a rede a ser utilizada. No caso vamos utilizar a eth0 que é o ip externo de nossa instância, outro ponto a se atentar é quais portas de acesso devemos liberar, no caso como estamos utilizando PwD já vem configurado.

Digite no terminal: `docker swarm init — advertise-addr 192.168.0.23`, esse é meu ip o seu certamente será diferente.

![2](https://dev-to-uploads.s3.amazonaws.com/i/4ocs7xx9q327sgd8yrsb.png)

Note-se que nos foi retornado um comando com um token de acesso, utilizaremos ele para conectar as instâncias nesse nosso cluster criado. Dê um `docker node ls` no node(instância) que iniciou o swarm, em seguida rode o comando de acesso na outra instância criada, volte para a node leader(iniciou o swarm) e novamente rode o comando `docker node ls`, agora temos dois nodes, um leader e o outro worker.

Agora com as duas instâncias fazendo parte de nosso cluster, no node leader vamos criar um serviço com o seguinte comando: `docker service create — name primeiros-passos -p 8080:80 nginx` , no terminal digite `docker container ls` nas duas instâncias, viu a diferença? temos apenas um container em execução em apenas 1 node.

Volte para o node **leader** e rode o comando: `docker service scale primeiros-passos=4` e depois `docker service ls` você verá que o numero de replicas passou a ser 4/4, isso quer dizer que existe 4 containers em execução, agora de um `docker container ls`, legal né, em cada instância existe 2 containers em execução e como estamos com a porta 8080 do container exposta, conseguimos fazer a requisição a esses containers e a cada chamada a requisição cairá em um container diferente.

Enfim, finalizamos a parte prática que queria mostrar nesse artigo, passarei algumas informações a seguir sobre o swarm e containers:

1. Os **containers** diminuem diferenças entre ambiente de dev e prod, facilita o deploy, melhorar a produtividade pois é mais rápido a configuração e acabar de vez com o *“funciona na sua maquina mas na minha não”*.
2. Em produção precisamos lidar melhor com os containers, ele são feitos para morrer, iniciar outro, então o container não deve manter estados, e para lidar melhor com a inicialização desses containers, trabalhar com micro serviços, alta disponibilidade e resiliência, precisamos orquestrar o comportamento dos containers e o **swarm** é uma boa ferramenta para isso.
3. Uma curiosidade sobre os nodes é que o swarm utiliza uma conta simples, que é a divisão dos nodes leaders por dois, caso o resultado seja maior que 51% dos nodes leader totais, ele manterá o cluster rodando, ou seja em produção é recomendado ter sempre um número impar de nodes leader, exemplo: tenho 5 nodes leader, meu cluster estará em execução mesmo que caia até 2 nodes.

Em breve terá mais artigos sobre o swarm, e no final vamos aprender a subir uma aplicação real para produção e manter ela escalável e em alta disponibilidade.

![3](https://dev-to-uploads.s3.amazonaws.com/i/d8zv6l8hs249z9w3dj3v.png)
 
### Referências
[Jeferson Fernando do Linux Tips](https://www.linuxtips.io/)
[Artigo de Cristian Trucco](https://imasters.com.br/desenvolvimento/vamos-conhecer-o-docker-swarm)
[Documentação do swarm](https://docs.docker.com/engine/swarm/)