Oi Pessoal,

Hoje queremos trazer para vocês mais uma das ferramentas que o Docker disponibiliza em seu ecossistema, chegou a hora de conhecermos o Docker Swarm. O Docker Swarm é uma ferramenta nativa do Docker que permite a criação de clusters de Docker, ou seja, podemos fazer com que diversos hosts de Docker estejam dentro do mesmo pool de recursos, facilitando assim o deploy de containers. É possível por exemplo criar um container sem necessariamente saber em qual host ele está, pois o Swarm disponibilidade uma API de integração, onde é possível realizar grande parte das atividades administrativas de um container. Quer ver na prática?

Requisitos:

  • Estar com a versão 1.6+ do Docker
  • Abrir a API do Docker para o Swarm Manager

 

Mãos a obra:

1 – Baixando a imagem oficial:

$ docker pull swarm

2 – Criando o cluster:

$ docker run --rm swarm create 
4765653423fdecsdfe875954a6e2h78ed # 

 

O retorno desse comando será o ID do Cluster, armazena essa informação pois será importante nas próximas etapas.

3 – Adicionando nós ao cluster:

$ docker run -d swarm join --addr=<node_ip:2375> token://4765653423fdecsdfe875954a6e2h78ed

4 – Configurando o Manager:

$ docker run -d -p <porta_manager>:2375 swarm manage token://4765653423fdecsdfe875954a6e2h78ed

Lembrando que <porta_manager> será a porta que você utilizará para se comunicar com o Swarm Manager, responsável pela administração do cluster, a arquitetura ficará da forma como a imagem abaixo:

5 – Verificando o Cluster:

$ docker -H tcp://ip:porta_manager> info

O retorno será algo parecido com isso:

Containers: 0 
Nodes: 3 
agent-2: 172.31.0.1:2375 
  └ Containers: 0 
  └ Reserved CPUs: 0 / 1 
  └ Reserved Memory: 0 B / 514.5 MiB 
agent-1: 172.31.0.2:2375 
  └ Containers: 0 
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 514.5 MiB 
agent-0: 172.31.0.3:2375 
  └ Containers: 0 
  └ Reserved CPUs: 0 / 1 
  └ Reserved Memory: 0 B / 514.5 MiB

Você pode enfrentar alguma dificuldade relacionada a TLS, principalmente se estiver apenas testando, para resolver isso basta executar: unset DOCKER_TLS_VERIFY, com isso não será verificado se os hosts possuem acesso via TLS ativado.

Para administrar seu cluster (criar containers, etc) basta utilizar o IP e Porta do Swarm Manage, dessa forma:

$ docker -H tcp://<manager_ip:manager_port> info 
$ docker -H tcp://<manager_ip:manager_port> run ... 
$ docker -H tcp://<manager_ip:manager_port> ps 

Para listar os nós que fazem parte do cluster, bata utilizar o comando abaixo:

$ docker run --rm swarm list token://4765653423fdecsdfe875954a6e2h78ed
172.31.0.1:2375 
172.31.0.2:2375 
172.31.0.3:2375

 

É claro que isso é apenas o início, tendo o cluster montado é possível criar filtros de identificação por tipo de serviço, isso é muito útil para criar containers com o mesmo tipo de serviço em um mesmo local sem a necessidade de saber onde. Mas isso é história para um próximo post 😉

Fique atento as novidades do Blog, e ajude divulgando o mundodocker.com.br.

Abraço!

 

Entusiasta Open Source, seu principal foco é ir atrás de ideias novas e torna-las realidade através de soluções simples e eficientes, o menos é mais, e o dividir é multiplicar.
  • Rodrigo Gattermann

    Usando swarm, basta que a imagem a ser rodada nos nodes esteja somente no manager ou cada node deve possuir essa imagem?

  • Oi Rodrigo,
    A imagem deve estar local em cada servidor, essa é uma das dificuldades que se tem em utilizar o Swarm.

  • Rodrigo Gattermann

    Sim, foi o que eu comprovei. Tive um pouco de dificuldades mas consegui utilizar o docker registry para montar um repositorio de imagens local, no mesmo host do swarm-manager. Com isso cada host ainda baixa a imagem a ser executada, mas acaba ficando automático com o uso do docker-registry.

  • Odravison Amaral

    Acho que faltou um print do resultado do comando “docker ps”. Por que, por exemplo, não ficou muito claro se eu devo subir o nó antes do comando de associar o nó no swarm, ou se esse comando de associar o nó ao swarm já sobe o nó com o serviço, e se sim, do que é preciso… Ficou meio vago, ao menos pra mim, mesmo assim tá de parabéns só pela iniciativa, pois o assunto é consideravelmente novo e temos pouco material em português.

  • Julio Arruda

    Como funciona o Swarm? pelo que entendi, não preciso me preocupar em onde meus containers serão criados, se no agente 1 ou no agente n. Entretanto, e escalabilidade disso, como funciona? é possivel automatizar também a criação de mais containers para atender mais demandas que possam ter surgido no momento?

  • Oi Julio,
    Atualmente o Swarm ainda não tem um escalonador baseado em consumo de recurso. Você deve escalar o serviço manualmente, você deve basicamente subir um cluster de Swarm e em cima disso subir seu serviço, com isso os containers serão alocados nos nós que o algoritmo do Swarm achar melhor.
    Veja um pouco sobre o service: https://www.mundodocker.com.br/docker-service/

  • Renato Ruis

    Oi tenho uma duvida, mas não sei se o blog esta ativo??

    Como faço para ter dois swarm manager e se um deles morrer? como eu faço o DR para não perder os nodes que estavam abaixo dele?

  • Olá @renatoruis:disqus estamos ativo sim 😀

    Quando você adiciona um nó ao Swarm você escolhe se ele será Worker ou Manager, então quando vocễ quiser adicionar algum nó como manager você deve executar esse comando no seu manager:

    docker swarm join-token manager

    Ele vai gerar o comando para você adicionar o seu outro servidor como manager, é só copiar a saida do comando acima e colar no seu nó que deseja ser manager. Caso queira que outro nó seja worker é só executar:

    docker swarm join-token manager

    E colar a saida do comando no seu nó worker.

    O que o Docker recomenda é que você tenha no mínimo 3 Manager para seu cluster ficar altamente dísponivel.

    Espero ter ajudado, qualquer dúvida é só chamar.

    Obrgiado e um grande abraço!

  • Olá @mundodocker:disqus,

    Seria interessante já começar montando um cluster Swarm se tenho pretenção futura para escalonar meu serviço OU seria melhor iniciar meu serviço em um container docker normal e no futuro, qdo necessário, migrar para uma solução escalonável tipo Swarm?

    A propósito, poderia criar um cluster Swarm em uma única máquina e, quando for o momento, criar novos nós (workers) e adicionar ao cluster?

  • Olá @bombonato:disqus,

    Repondendo a sua primeira pergunta, o ideal seria você ja começar a utilizar uma solução escalável, pois te possibilita estar pronto para escalar de forma fácil.

    E sobre a segunda pergunta, é possivel criar sim um cluster de swarm com apenas um nó e depois ir adicionando os workers, porém não é uma boa prática por questões de disponibilidade dos seus serviço.

    Abçs