Salve! Não sou o mais expert em Docker Swarm mas tive uma experiência considerável, vou tentar ajudar.
No GCP tenho acesso normal a porta 80, então no firewall eu liberei o acesso as portas 15672 (rabbit management) e 3000 (api). Teria alguma maneira "correta" de fazer isso, ou seria só liberar essas portas mesmo?
Lembre-se que a magia do Docker Swarm seria montar um cluster com vários nós, pelo que me lembro a porta em que os nós se "conversam" é a 2377 (TCP), essa tem que ser liberada. Um adendo é a porta do RabbitMQ, o correto seria só a porta da aplicação web (Nginx no caso), para casos de desenvolvimento é tranquilo, mas o mínimo de portas que você expor, melhor.
Também gostaria de saber, o correto é criar um load balancer pra tudo isso (ai aponta o dominio pro ip do loadbalancer)?
Ao criar um cluster Docker Swarm, o próprio cluster funciona como um Load Balancer, o que eu utilizava era um Load Balancer em outro servidor sem ser Docker Swarm que fazia um RoundRobin diretamente nos servidores, faz um booom tempo que não mexo nisso (nem estou na empresa mais), mas configurei um Traefik como rede interna do Docker também, é relativamente complexo de você precisa pesquisar bem.
Leitura recomendada: How is load balancing done in Docker-Swarm mode
Outra coisa que você precisa se atentar é sobre a persistência dos dados, vamos ao caso do PostgreSQL:
...
volumes:
- postgres_volume:/var/lib/postgresql/data
...
Ao utilizar um Cluster, caso você reinicie a aplicação e não especifique em qual nó ela irá subir, o Docker escolherá algum nó utilizando alguma política (por exemplo, para equilibrar o uso dos recursos) e poderá subir uma instância em um nó onde não tinha o volume, criando inconsistência nos dados, você pode utilizar um storage em rede como o GlusterFS, veja aqui. Lembrando que há várias abordagens para estes casos.
Configurações do NGINX (como o nome da stack no swarm é application, ele cria os serviços com o prefixo application_, então no proxy_pass passei o nome dos serviços, está correto?):
Sobre a abordagem, creio que esteja correto assim, depende muito como você quer fazer isso, sobre o application_<serviço>
você pode especificar o hostname
no manifesto da stack, o Docker internamente resolve o hostname
, nâo o container_name
, novamente se atentando ao utilizar replicas, já que ele criaria algo do tipo aplicacao-1
, aplicacao-2
...
Espero ter ajudado e nâo complicado mais as coisas, o Docker Swarm é muito massa e dá uma experiência bacana sobre escalabilidade, além de ter uma curva de aprendizado menor em comparação ao Kubernetes.
Divirta-se! 😄