Usando Swarm como Orquestrador de Containers para o Rancher
Rancher é um ótimo Gerenciador de Container, mas sua orquestração padrão faz com que ele perca o seu valor. Entretanto, existe nele a opção de integrar com outros provedores de orquestração de containers, como o Docker Swarm.
O Docker Swarm provê uma orquestração de melhor qualidade e permite o uso de “networking overlay” (que seria uma única rede disponível em todos os hosts onde seus serviços podem acessar um ao outro pelo nome).
O primeiro passo para usar o Swarm como orquestrador de containers é instalar o Rancher:
docker pull rancher/server
sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server
Acesse o rancher por http://{ip-da-maquina}:8080 (não use localhost)
Após instalar o rancher será necessário criar um novo environment. Para isso, basta clicar em Manage Environments e então em Add Environment.
Vamos colocar o nome do Environment de Swarm e escolher o Swarm como orquestrador.
Após isso o Swarm vai pedir pelo menos um host.
Você pode adicionar um host clicando em Infrastructure > Add Host > Custom
Se você acessou com localhost deve trocar para o IP da máquina antes de salvar.
Copie o link que o Rancher gerou, com ele será possível adicionar um novo host.
Após esse passo, ao clicar em Swarm>Infrastructure haverá a lista de stacks padrão do rancher e será possível adicionar suas próprias stacks de serviços.
Vamos adicionar a stack do Refresh, um projeto bem simples em Go que toda vez que a página é recarregada é incrementado um valor no Redis. Usaremos o Swarm para subir os containers e sua network overlay para que eles comuniquem entre si sem a necessidade de um link ou de expor portas.
Clique em Add stack, dê um nome para a stack e insira o seguinte docker-compose e rancher-compose:
version: '2'
services:
api-refresh:
image: walissoncasonatto/go-refresh
environment:
REDIS_HOST: redis-refresh
stdin_open: true
tty: true
ports:
- 8282:80/tcp
labels:
io.rancher.container.pull_image: always
redis-refresh:
image: redis
stdin_open: true
tty: true
labels:
io.rancher.container.pull_image: alwaysversion: '2'
services:
api:
scale: 1
start_on_create: true
redis:
scale: 1
start_on_create: true
Veja que no Redis nenhuma porta é publicada. A única porta publicada está na API. Há uma variável de ambiente passando o host do redis, que é o nome do serviço, é a partir deste nome o Rancher vai resolver para o container do Redis por isso ainda é necessário informar a porta. Ao desenvolver API’s dentro do container elas podem responder sempre na porta 80 evitando a preocupação com portas.
Após baixar as imagens do e subir os containers a aplicação estará disponível na porta 8282.