Deploy via Docker Swarm + Vagrant

Docker Swarm + Vagrant

Além do deploy via Docker Compose, também é possível disponibilizar a stack do Sistema Minerva em um cluster do Docker Swarm.

Para tanto, é necessário inicializar o cluster. Isso pode ser feito, por exemplo, com máquinas virtuais para finalidade de teste (neste caso, pode ser utilizado o VirtualBox para prover essa facilidade).

Nesse capítulo, veremos como fazer isso de forma automatizada através de uma configuração do Vagrant. Essa configuração criará máquinas virtuais e também inicializará o sistema no cluster.

Pré-requisitos

  • Vagrant versão 2.2.19 ou superior;
  • VirtualBox versão 6.1 ou superior.

Você pode utilizar outro provider além de VirtualBox (como libvirt), mas precisará alterar o arquivo Vagrantfile.

NOTA: Qualquer comando do Vagrant deve ser executado no diretório deploy/swarm, para que o Vagrant tenha acesso ao Vagrantfile.

Reinicializando o cluster

Caso você já tenha iniciado o cluster com Vagrant, basta ir até o diretório deploy/swarm e executar vagrant up. Isso reiniciará as máquinas virtuais, mas também executará o docker stack deploy novamente para o arquivo de configuração, o que forçará uma atualização em todos os serviços.

Criando o cluster

Para criar o cluster, vá até o diretório deploy/swarm e execute o Vagrant.

cd deploy/swarm
vagrant up

Isso utilizará o arquivo Vagrantfile para criar sete máquinas virtuais (dois managers e dois workers), e também realizará automaticamente o deploy do sistema Minerva usando o arquivo docker-stack.yml.

Alguns arquivos extras serão criados na pasta. Eles dizem respeito respectivamente ao IP do primeiro gerente e aos tokens de ingresso no cluster para gerentes e trabalhadores.

Em geral, a relação das máquinas virtuais do cluster será:

  • manager01: Manager, líder, inicializador original dos serviços;
  • manager02 e manager03: Managers adicionais;
  • worker01 a worker04: Workers.

Para verificar o formato do cluster e as informações acima, use o comando:

vagrant status

Fazendo deploy do Sistema Minerva

Caso você realize modificações no arquivo docker-stack.yml, poderá querer fazer deploy novamente dos serviços de forma manual.

Para tanto, entre em qualquer um dos managers via SSH. Por exemplo, para o primeiro manager:

vagrant ssh manager01

O diretório deploy/swarm fica montado dentro de todas as máquinas virtuais em /vagrant (que é mutável apenas durante a criação do cluster). Todavia, você ainda poderá modificar os arquivos no host e terá acesso a eles.

Para aplicar manualmente o arquivo docker-stack.yml:

# Em manager01
docker stack deploy --compose-file /vagrant/docker-stack.yml minerva

Gerenciando a stack

Podemos gerenciar a stack facilmente dentro de uma VM manager.

Para listar as stacks ativas:

# Em manager01
docker stack ls

Se quisermos observar os serviços de uma stack em específico:

# Em manager01
docker stack services minerva

Ou, em último caso, se quisermos remover uma stack:

# Em manager01
docker stack rm minerva

Acessando os serviços

Os serviços que podem ser acessados de forma externa estarão disponíveis normalmente assim como no Docker Compose, porém sob um IP diferente.

Por padrão, todos os managers possuem um IP começado com 172.20.20.1X, algo definido através do Vagrantfile. Os workers terão um IP iniciado com 172.20.20.10X. A variável X será sempre um número contado a partir de 1.

Seguindo essas regras, as VMs possuirão os seguintes IPs:

IPHostname
172.20.20.11manager01
172.20.20.12manager02
172.20.20.13manager03
172.20.20.101worker01
172.20.20.102worker02
172.20.20.103worker03

Para acessar os serviços, use qualquer IP do cluster. A descoberta do serviço será realizada através do routing mesh do Docker Swarm.

Abaixo, temos uma relação das portas utilizadas para cada um dos serviços disponíveis no cluster.

PortaServiço
80Front-End
9000API REST
8484PgAdmin 4
8585Visualizador do cluster
8686Mongo Express
8787Redis Commander
5672RabbitMQ (Serviço)
15672RabbitMQ (Gerenciador)

Encerrando o serviço

Para encerrar todas as máquinas virtuais sem perder o estado das mesmas, use:

vagrant suspend

Ou, se você desejar destruir o cluster completamente:

vagrant destroy -f