Deploy via Docker Swarm + Vagrant
![Docker Swarm + Vagrant](./swarm-vagrant.png)
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
emanager03
: Managers adicionais;worker01
aworker04
: 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:
IP | Hostname |
---|---|
172.20.20.11 | manager01 |
172.20.20.12 | manager02 |
172.20.20.13 | manager03 |
172.20.20.101 | worker01 |
172.20.20.102 | worker02 |
172.20.20.103 | worker03 |
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.
Porta | Serviço |
---|---|
80 | Front-End |
9000 | API REST |
8484 | PgAdmin 4 |
8585 | Visualizador do cluster |
8686 | Mongo Express |
8787 | Redis Commander |
5672 | RabbitMQ (Serviço) |
15672 | RabbitMQ (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