Ao iniciar um projeto, é muito importante conhecer os requisitos do sistema, bem como saber qual carga de acesso que ele deve suportar. O Node.JS é uma ótima solução para criar aplicações onde ocorrem entrada e saída de muitos dados, pois possui uma grande facilidade de escalonamento horizontal. Neste artigo, vamos demonstrar como configurar o ambiente de desenvolvimento para a criação de projetos escalonáveis com o Docker. Utilizando essa plataforma aberta, é possível realizar deploys e escalonar aplicações com tranquilidade. Além disso, o Docker providencia um ambiente isolado e leve para sua aplicação, graças à virtualização por containers.
A grande diferença entre a virtualização por containers e a de uma VM (Virtual Machine) é o consumo de espaço e recursos utilizados pela máquina. O motivo dessa disparidade é o fato de a VM emular o hardware de uma máquina utilizando uma camada denominada hypervisor, enquanto um container faz a virtualização pelo próprio sistema operacional. Em outras palavras, um container faz o agrupamento e o isolamento de recursos. Tudo o que está dentro de um container não enxerga o que está fora (Host).
A virtualização por container já existe há algum tempo, mas o Docker acrescenta um grande diferencial ao processo. No Docker, cada imagem contém várias camadas, sendo assim, ele utiliza o UnionFS para reunir todas as camadas. Esse é um processo que concede rapidez, pois não há a necessidade de fazer rebuild para atualizar as imagens.
Dito isso, vamos configurar um ambiente em Docker para uma aplicação NodeJs. Um proxy reverso na frente das instâncias da aplicação é uma das configurações padrão que vamos utilizar. Não será necessário realizar qualquer tipo de configuração manual. Graças à comunidade, as imagens já estão prontas, sendo necessário apenas realizar pequenos ajustes para sua aplicação rodar. Para iniciar o proxy (vamos assumir que você já tenha instalado o Docker), basta executar o seguinte comando:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t jwilder/nginx-proxy
Ao executar o “run”, o daemon do Docker irá procurar pela imagem “jwilder/nginx-proxy” na sua máquina. Caso não encontre, ele irá baixar diretamente do Docker Hub. O comando “-v /var/run/docker.sock:/tmp/docker.sock” faz com que os dois arquivos fiquem sincronizados, tanto no host quanto no container. Mais informações sobre a imagem você pode verificar no link https://hub.docker.com/r/jwilder/nginx-proxy/. Agora é possível subir o container da aplicação com o seguinte comando:
$ docker run -d -e VIRTUAL_HOST=<HostDoSeuApp> --expose 8888 -v "<CaminhoDoSeuApp>":/usr/src/app -w /usr/src/app node:4.4 node index.js
Esse comando é similar ao primeiro, sendo a passagem da variável VIRTUAL_HOST a diferença-chave para o funcionamento dessa configuração. O comando deve conter o host que aponta para sua máquina – essa variável é utilizada para a configuração do proxy. Será necessário deixar a porta em que o servidor node está rodando aberta para o host (comando “–expose”).
Com isso, você tem seu ambiente pronto para ser executado localmente ou em produção. Além disso, você pode executar o comando para iniciar outro container da aplicação e, assim, escalar mais instâncias.
O Docker possui um sistema de versionamento de imagens pelo Docker Hub. Assim, se o autor da imagem fizer alguma atualização na configuração da imagem, ele pode fazer um commit e um push. Da mesma forma, as pessoas que possuem a imagem podem usar o comando pull para atualizar a sua versão. Além disso, é possível realizar rollbacks em alterações efetuadas no container.
Como foi demonstrado acima, é possível realizar a configuração de ambientes de maneira simples e rápida. Mesmo não sendo ainda recomendada a utilização dessa tecnologia (Docker) em produção, acreditamos que seja muito importante o desenvolvimento do seu estudo. Consideramos que pelo poder de automação, fácil configuração e gerenciamento que o método propõe, em um futuro próximo, ele fará parte do desenvolvimento das aplicações web e serviços cloud.