Mongodb, Nodejs e Docker
mauro pereira
Integration developer

A AWS web services, nos dá uma gama muito grande de serviços, onde pode-se apenas preocupar-se com o desenvolvimento e gestão do seu aplicativo, deixando as configurações de modo automático e fixando-se em outros pontos.
Neste tutorial, vamos montar um ambiente sem uso do AWS RDS em uma máquina local com nodejs, mongodb e docker.
Pré-requisitos:
- nodejs e npm instalados
- docker e docker-compose instalados
- conhecimento em linha de comando neste caso linux, mas pode ser o sistema que estiver usando
- conhecimento em javascript
- conhecimento em node e npm (node package manager) -
- conhecimento básico de redes
- conhecimento básico de banco de dados
Na linha de comando do seu computador onde queira ter seu workspace digite o seguinte comando:
- npm init -
Siga as instruções e construa o esqueleto da sua aplicação node conforme imagem abaixo:
Vamos instalar as dependências node via npm:
- npm install --save express mongoose

Para fazermos o “live reload da aplicação” iremos usar o nodemon, use o comando abaixo para instalar sua dependência:
- npm install --save-dev nodemon

Vamos criar um ponto de start para o nodemon no package.json para iniciar a aplicação no ambiente de dev, abra a aplicação no seu editor preferido. No meu caso uso visual studio code.
- “start”: “nodemon index.js”
Seu arquivo package.json deverá estar desta forma depois da alteração:

Agora iremos criar uma rota na aplicação usando express, mas para isto temos de criar um arquivo de entrada da nossa aplicação chamado “index.js” na raiz do projeto:
- index.js
Este arquivo index.js deverá ter o sequinte conteúdo abaixo:
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/',(req,res) =>{
res.json({mesage: ‘Hello API com nodejs, mongodb e docker’});
})
app.listen(PORT,()=>{
console.log(`app running on url http://localhost:${PORT}`);
})

Agora já temos uma aplicação funcional com 1(um) endpoint e para testar vamos executar o seguinte comando na sua CLI:
- npm run start (irá chamar o nodemon para fazer o live reload da aplicação)
Veja uma tela igual a abaixo:

Vá no seu browser até http://localhost:3000 e veja a tela abaixo:

Execute “CTRL+C” no seu terminal para finalizar sua aplicação.
Com sua aplicação funcional agora é hora de inserir o docker no projeto.
Neste momento temos o projeto inicial em nodejs criado e vamos adicionar o docker na aplicação. Para isto iremos criar 2(dois) arquivos na raiz do projeto:
- docker-compose.yml
- Dockerfile (exatamente com este nome e sem extensão)
O conteúdo destes arquivos serão:
Dockerfile:
- FROM node:16.14.0
- MAINTAINER mauroslucios
- RUN mkdir -p /var/www/app/node_modules && chown -R node:node /var/www/app
- WORKDIR /var/www/app
- COPY package.json ./
- RUN npm install
- COPY . .
- COPY --chown=node:node . .
- USER node
- EXPOSE 3000
- CMD ["node","app.js"] ENTRYPOINT ["npm","start"]

Nesta etapa, temos que fazer o build da aplicação para gerar a imagem que será usada no docker-compose.yml para criar o container do nodejs, use o comando abaixo, mas troque pelo seu usuário(mauroslucios) dockerhub.
- docker build -t mauroslucios/tutorial:1.0 .
- docker build -t <seu-usuario-dockerhub>/tutorial:1.0 .
O comando acima deverá produzir a seguinte saída abaixo no terminal:

Ao final deverá aparecer a mensagem de sucesso do build conforme imagem abaixo:
- Successfully tagged <seu-usuario-dockerhub>/tutorial:1.0

Execute o comando abaixo para ver a imagem docker do nodejs criada:
- docker images
Vamos criar a conexão com o banco de dados mongo. Crie uma pasta chamada database na raiz do seu projeto e nesta pasta crie um arquivo chamado: “connection.js”. Adicione o conteúdo abaixo no mesmo.
const mongoose = require('mongoose')
mongoose.connect('mongodb://mongodb:27017/apirest').then(()=>{
console.log('Mongodb conectado...')
}).catch((err)=>{
console.log('Houve um erro ao conectar: '+ err)
})
mongoose.Promise = global.Promise
module.exports = mongoose

No arquivo docker-compose.yml na raiz do projeto insira o conteúdo abaixo:
version: "3.7"
services:
web:
image: mauroslucios/tutorial:1.0
ports:
- 3000:3000
volumes:
- ./:/var/www/app
environment:
NODE_ENV: development
depends_on:
- db
links:
- db
db:
image: 'mongo'
container_name: mongodb
ports:
- '27017:27017'
volumes: - ./data/db:/data/db

Agora é monento de rodar a aplicação em um container docker, para isto execute o comando abaixo:
- docker-compose up (aqui não usei a flag -d para ver o resultado do log no console)
Veja uma tela parecida com a mesma abaixo:

Se você for bem atento e olhar no log do terminal, irá ver a mensagem: “Mongodb conectado”, conforme imagem abaixo:

Volte ao browser na url: http://localhost:3000 e veja sua aplicação docker em funcionamento. "Isto é magnífico!" I love you docker.

Na sua CLI execute os seguintes comandos de verificação docker:
- docker ps (verás os containers em execução)
- docker inspect <id-container> (mostrará as configurações do container)
- docker stop <id-container> (para o container em execução)
- docker exec -it <id-container-mongo> /bin/bash (entrará no terminal do container)
- dentro do terminal do container mongo execute: mongo (entrará no shell do mongo)
- execute “show databases” e verá os bancos criados no mongo
- CTRL + P + Q sai do shell do container

Com estes passos, temos um ambiente nodejs com mongo funcionado dentro do docker. Se quiser pode trocar pelo banco de dados que seu projeto se adaptar melhor, conforme necessidade.
OBS: o backup do seu banco mongo está na pasta “data/db” na raiz do seu projeto.
Isto é apenas uma forma de mostrar a utilização desta ferramenta fantástica chamada docker. “I love You Docker”.
github de um exemplo mais completo: “mauroslucios/restapi-nodejs”
Até a próxima!
Mauro Lúcio Pereira da Silva
Comentários
Complete seu perfil (mínimo 30%) para comentar