Docker :: Containerizando o NodeJS e o MongoDB de forma rápida

Share:


Esse post vai ser mais um exemplar explicativo do meu repositório Cinto de Utilidades Docker. Basicamente vamos utilizar o Docker para construir um ambiente de uma API REST utilizando NodeJS e MongoDB, com exemplos práticos de praticamente tudo que você precisa para construir um ambiente completo para seu Backend em Node e Mongo. Basicamente nosso diretório irá conter uma pasta app, onde iremos deixar o código da nossa API, uma Dockerfile para o container do Node e um docker-compose.yml que vai orquestrar nossa aplicação. Basicamente, a estrutura de diretório é esta:



Link dos Exemplos no Github

Node 

Vamos containerizar uma API completa. Nesta caso, no diretório do projeto, vamos criar a pasta app, dentro dela devem existir dois arquivos, um package.json que irá guardar todos os componentes que iremos utilizar na nossa aplicação e o arquivo app.js, que irá conter todo o código da nossa aplicação necessariamente.

./app/app.js

Este é o Código da API que vamos trabalhar com o Docker. Pode parecer grande demais para um exemplo, mas é uma forma de mostrar o funcionamento de ponta a ponta de um código no Docker. 
Basicmente é uma API Rest bem simples com um schema de tasklist já definido que vai gerenciar as informações do MongoDB. Usei essa API na POC do meu TCC na FATEC Itu. Pode ver aqui.

./app/package.json


Aqui iremos satisfazer todas as dependências do nosso projeto. Sem segredo por aqui.


Docker 

Dockerfile 

Veremos a Dockerfile, neste exemplo estaremos baixando uma máquina já preparada com o Node direto do Dockerhub. Pegaremos a versão Latest, que atualmente faz referência a versão 7.1 do Node, copiaremos o arquivo package.json do nosso projeto e irá instalar todas as dependências do mesmo globalmente, e vamos expor a porta 8080 para construção da nossa API e a porta 5858 para debug.
 FROM node:latest  
   
 RUN mkdir -p /usr/src/app  
 RUN npm install nodemon -g  
   
 WORKDIR /usr/src/app  
 COPY app/package.json /usr/src/app/package.json  
 RUN npm install -g  
   
 EXPOSE 8080  
 EXPOSE 5858  
   
 CMD ["npm", "start"]  


Docker Compose

Usaremos o arquivo docker-compose.yml para baixar a versão 3.0 do Mongo, e liberar a porta 27017 do mesmo para a nossa máquina. Em seguida vamos criar/mapear o diretório data, que se não existir será criada no diretório do projeto para pasta /data/db de dentro do container. Essa pasta irá gravar o conteúdo das collections do Mongo, e mapeando para um diretório externo, irá garantir a persistência dos dados do mesmo.
Em seguida iremos buildar nosso Dockerfile, mandando nosso local de build para a pasta local(.), customizando o comando de execução do container para satisfazer as dependências do projeto com o npm install e executar o nodeamon no nosso arquivo servidor do Node.
A pasta que vai ser mapeada para dentro do container é pasta app, que contém todo o nosso projeto do Node. Por ultimo, linkamos o serviço da nossa aplicação para se comunicar com o container do Mongo.
 mongo:  
  image: mongo:3.0.4  
  ports:  
   - "27017:27017"  
  volumes:  
   - './data:/data/db'  
 application:  
  build: .  
  command: bash -c "npm install; nodemon app.js --color=always"  
  ports:  
   - "8080:8080"  
   - "5858:5858"  
  volumes:  
   - ./app:/usr/src/app  
  links:  
   - mongo  

Testando 

Para buildar nosso projeto, iremos utilizar o Docker Compose como de costume. 
 # docker-compose build   
 # docker-compose up  

Agora com ajuda do Postman, ou qualquer cliente REST, podemos fazer requisições para todos os Endpoints da API, pra ver funcionando. Por exemplo, uma requisição POST para o endpoit /api/add com o conteúdo decricacao e concluido por POST, Ou pegar todos registros por GET via /api/all. Exemplificando, o comportamento é esse, mas você pode explorar todos os métodos da API pra ver que funciona. ;)


 Espero ter ajudado ;)


Um comentário: