Mongodb, Nodejs e Docker
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:
![¢RDBE "OQ LOE
2
5
a
a
2
@ Coogle Chrome v
nauros@nauroslucto:
> tutorialgl.0.8
> nodenon index
13
n] watching p
n] watching e:
app running on url h
Document
+// local
er
mauros@mauroslucios: ~/Documentos/node pr...
t /hone/mauros/Docunentos/node project
21dejul 1653 ©
mauros@mauroslucios: ~/Documentos/node projects tutorial
mauros@mauroslucios: ~/Documentos/node pr... mauros@mauroslucios: ~/Documentos/node pr.
tortal$ npa run
torial](https://contents.bebee.com/users/id/DsrZL61dc5ebd3eab8/article/postgresql-pgadmin-e-docker-3EWnknxnz4Wk/BcuyR.png)
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:
![Atdades @ Coogle Chrome v 21dejud 1700 ©
mauros@mauroslucios: ~/Documentos/node projects tutorial Q : @
mauros@mauroslucios: ~/Documentos/node pr... ~ mauros@mauroslucios: ~/Documentos/node pr... mauros@mauroslucios: ~/Documentos/node pr...
nauros@naurosluctos
dcunen
node_projec
ETI] build context to Docker daemon 17.6248
tep 1/12 : FROM node:16.14.8
> 101513154291
tep 2/12 : MAINTAINER mauroslucios
ortals docker bulld -t mauroslucios/tu
ortal:1.e .
> Using cache
> bcdeas33s7ey
tep 3/12 : RUN mkdir -p /var/www/app/node nodules 88 chown -R node:node [var /www/app
> Using cache
> Bc3Bace37503
tep 4/12 : WORKDIR [var /www/app
> Using cache
> 697b389cb02
tep 5/12 : COPY package. json .
5 > badbfdrbfoe
tep 6/12 : RUN npm in: 188
> Running in 773e58100850
added 117 packages, and audited 118 packages in 11s
14 packagy
+ are looking for funding
run npn fund for details
found 8 vulnerabilities
»
3g EERE Res Trot Cong el rests tae
Bs.
Removing intermediate container 773e58108850
> 9385¢34debss
tep 7/12 : COPY . .
> 271263548090
Step 8/12 : COPY --chown=nod
> 696dbsb114c7
Step 9/12 : USER node](https://contents.bebee.com/users/id/DsrZL61dc5ebd3eab8/article/postgresql-pgadmin-e-docker-3EWnknxnz4Wk/s91qE.png)
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:
![Atmdades 2 Tecminal +. 21dejul 1725 © PA -
© mauros@mauroslucios: ~/Documentos/node_projects/tutorial Q a @
mauros@mauroslucios: ~/Documentos/node pr... « mauros@mauroslucios: ~/Documentos/node pr... mauros@mauroslucios: ~/Documentos/node pr... -
maurosgnaurosluctos:~/Docune node projects/tutorials docker-compose up
Creating network “tutorial default” with the default driver
Creating mongodb ... dor
Creating tutorial web 1 ... dor
E Attaching to mongodb, tutorial web 1
1
1 | > tutorialgl.e.e start
1 | > nodemon index. js “node” “app. js”
1
web 1 node=on
1 on s
1 on] watching
1 on] watching extensi
1 " n] starting node in app. §
db | {Tt7:{"Sdate":72022-07-21720:22:44.469+00:00}," 5": TCTITHETWORKT, “1dT:4915701, Tctx™:T-, "msg: Initlalized wire specificati
. on”, attr=: {spec :{~incomingExternalClient™: {~ninWireversion™:0, "maxWireversion”:13}, incontngInternalClient™: {~ninWireversion™
slon:13}, outgoing: {“minWireversion:0, “maxwireversion=:13},"sInternalClient =: true} }}
9 {7t7:{"Sdate~:72022-07-21720:22:44.780+00:007},s™: "1", Cc”: CONTROL, ~1d~:23285, “ctx™:"-~,"msg”: Automatically disabling TLS
1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols ‘none’ ~}
TT {TSdate”:T2022-07-21T20:22:45.203400:007}, 5":
red during Networkinterface startup”)
godt {"t7:{"Sdate 2027-07-21720:22:45.245400:007},757:717, “CcT:TNETWORK™, “{d”:4648601, “ctx”
vatlable. If TCP FastOpen is required, set tcpFastOpenServer, tcpiastOpenClient, and tcpfastOpenQueuesize.”}
{"t7:{"Sdate”:72022-07-21720:22:45.537+00:007},7s" ©, TeTiTAsIOT, “idT:22001, TetxT:T
red during Networkinterface startup”)
-as1oT, “tdT:22681, -
,"Rsg™: No Transportiayer configu
597: TImplicit TCP FastOpen una
597: No Transportiayer configu
godt {"t7:{"Sdate”:72022-07-21720:22:45.56800:007},7s":"1", “cT:iTREPLT, “1dT:5123008, “ctx”: 597: "Successfully registered P
fs rinaryOnlyService”,attr=:{ “service”: ~TenantMigrationDonor Service, ns”: “config. tenantMigrationDanors™}}
j0db | {Tt7:{"Sdate":"2022-87-21720:22:45.568+00:007},5": "1", “c": REPL”, 1d7:5123008, “ctx™:“main”, msg”: "Successfully registered P
rinaryOnlyService”,"attr™:{“service”:~TenantMigrationRecipientservice™, ns": "config. tenantiigrat ionReciplents™}
9 {7t7:{"Sdate~:72022-07-21720:22:45.569+00:007},"s™: "1", “Cc”: CONTROL, ~1d~:4615611, -“ctx”:~initandlisten”, ongod8 starting
fume "QO LOE
TL TattrTi{TpidTi1, “port”
27017, dbPath™:~/data/db", “architecture” :"64-bit~, host": "6573182df8a9" }}
jodb | {Tt7:{"Sdate~:2022-07-21720:22:45.569+00:007},5": "1, ~c*: CONTROL®, -1d~:23483, “ctx":"{nitandlisten”,"msg™: Build Info", "at
=: {~butldInfo™: {version 37,gltversion™:~657feasa61a74d7a79df 7af fBeabc fObc 742b748", ~opensSiversion™: "OpenSSL 1.1.11 31 Mar 20207, mod
“tcmalloc”, “environment”: {~distnod™:~ubuntu2004~,"distarch™: "x86 64", target arch: x86 64-}}}}
2022-07-21720:22:45.569+00:007},"5™: "1", ~c i CONTROL™, ~1d~:51765, -ctx”:"initandlisten”
397: Operating System](https://contents.bebee.com/users/id/DsrZL61dc5ebd3eab8/article/postgresql-pgadmin-e-docker-3EWnknxnz4Wk/rUjOA.png)
Se você for bem atento e olhar no log do terminal, irá ver a mensagem: “Mongodb conectado”, conforme imagem abaixo:
![Atdades Terminal v 21dejul 1728 © 0) PAE v
© mauros@mauroslucios: ~/Documentos/node_projects/tutorial Q a @
mauros@mauroslucios: ~/Documentos/node pr... « mauros@mauroslucios: ~/Documentos/node pr... mauros@mauroslucios: ~/Documentos/node pr... -
attr t172.19.8.
{“remote’ 0348”, "wuld": "aeccoelc-1f7e-4169-8ce8-efa17599cad3”, “connect ionid”
17, TCTiTNETWORKT, "id
“name”: “node Js | Mongoose”, “version
,"connectionCount™:1}
51800, “ctx:"connl”, msg”: client metadata”, attr”:
4.7.87),70s":{"type~: “Linux, “name”: "linux"
{"t7:{"Sdate™:"2022-87-21720:22:49.699+00:00"}, 5"
conn1, “doc
{“remote”:"172.19.0.3
03487, “client”
L"architecture:"x647, “version” :"5.15.0-41 generic"), "platforn: "Node. js v16.14.8, LE (unified)”, version=:74.7.0(6.4.67}}}
web 1 | Mongodb conectado. ..
godt {"t7:{"Sdate":"2022-87-21720: ST, TeT:iTINDEXT, at) 0345, “ctx”:"LoglcalSessionCacheRefresh™ 5g”: "Ind
ex bulld: done building”, attr™:{~bullduuID™ :null, names config. systen. sessions”, "index™:" td ~, commitTinestanp™:null}}
godt {"t7:{"Sdate” ©22-07-21720:22:50.062 +0! 07 },"s" ST, TeT:iTINDEXT, “idT:iz0345, “ctx”:"LoglcalSessionCacheRefresh™, “msg”: "Ind
ex bulld: done building”, attr™:{bullduUUID" :null, namespace”: "config. systen. sessions”, index: LsidTTL Index", connitTinestanp™ inull}}
jodb | {Tt7:{"Sdate":2022-07-21720:22:50.062+00:007}, 5": "1", ~c": COMMAND™, -1d~:51883, “ctx”: LogicalSessionCacheRefresh”, msg”: Slo
w query”, "attr :{“type:" config. systen. sessions”, “command”: {createIndexes™: “system. sessions”, v™:2, indexes”: [ {key :{~lastuse
“:1), name”: "Ls{dTTLIndex", “expireAfter Seconds”: 1800} 1,” ignoreUnknownndexOpt ions”: false, “wr iteConcern™:{}, Sdb™: "config™},“nunvields”:0, resl
en:114," locks”: {~ParallelBatchur i termode™ : {~acquireCount™:{“r=:4}},"ReplicationStateTransition™: {~acquireCount™: {*w":5}}, Global~: {~acquireCo
unt=:{7r7:5,"w":1}}, “Database”: {~acquireCount™:{~r~:3,7w:1}}, Collection: {~acquireCount™:{ r~:3, w":1}}, Mutex:{"acquireCount :6}1),7s
torage™:{}, protocol=: “op msg”, durationMillis":476}
{7t7:{"Sdate":72022-07-21720:23:00.212+00:007} "5": "1", “CT: NETWORK™, ~1d":22943, “ctx”: listener”, msg
{“remote”:7172.19.0.3:60350", “uid”: ~8bebd13c-1cas- 4586-905 9a8adad37fd3”, “connect ionid™:2, “connect ionCount
{"t7:{"Sdate":"2022-07-2112 5.214400:007} "57:71, “CT: NETWORK™, ~1d”:51808, “ctx :"conn2”,"msg”: client metadata”, attr”:
172.19.8.3:603507, "client": "conn2~, “doc: { “driver =: {“nane™:~node)s Mongoose”, “version” :4.7.07}, 70s": {~type™: Linux", name”: "linux"
L"architecture:"x64", version” :"5.15.0-41 generic"), "platforn™: "Node. js v16.14.8, LE (unified)”,"version=:74.7.0(6.4.67}}}
jodb | {Tt7:{"Sdate~:2022-07-21720:23:48.315+00:007},"5": "1", ~c™: STORAGE™, -1d~:22438, ~ctx":"Checkpointer™, msg” :"WiredTiger messag
e-, "attr ~:7[1658435028:315556][1:0x71891368d700], WT_SESSION.checkpoint: [WT_VERS CHECKPOINT PROGRESS] saving checkpoint snapshot m
in: 34, snapshot max: 34 snapshot count: 0, oldest timestamp: (8, 0) , meta checkpoint timestamp: (8, 8) base write gen: 17}}
jodb | {Tt7:{ $date" :"2022-07-21720:24:48.629+00:007},"5": "1", ~c*: STORAGE™, ~1d~:22438, “ctx”: Checkpointer™, msg”: "WiredTiger messag
€", "attr": { “message :"[1658435088:629381](1:0x7891368d700], WT _SESSION.checkpoint: [WT VERB CHECKPOINT PROGRESS] saving checkpoint snapshot m
tn: 37, snapshot max: 37 snapshot count: 0, oldest timestamp: (8, 0) , meta checkpoint timestamp: (8, 8) base write gen: 17}}
jodb | {Tt7:{"Sdate":2022-07-21720:25:48.883+00:007},"5": "1", ~~: STORAGE™, ~1d~:22438, “ctx”: Checkpointer™, msg”: "WiredTiger messag
€", "attr" :{“message:"[1658435148:883292](1:0x77891368d700], WT _SESSION.checkpoint: [WT VERB CHECKPOINT PROGRESS] saving checkpoint snapshot m
in: 39, snapshot max: 39 snapshot count: 0, oldest timestamp: (8, 0) , meta checkpoint timestamp: (8, 8) base write gen: 17}}
jodb | {Tt7:{ $date" :"2022-07-21720:26:48.960+00:007},"5": "1", ~c~: STORAGE™, ~1d~:22438, “ctx”: Checkpointer™, msg”: -WiredTiger messag
€", "attr": (“message :"[1658435208:960876](1:0x7891368d700], WT SESSION.checkpoint: [WT VERB CHECKPOINT PROGRESS] saving checkpoint snapshot m
in: 41, snapshot max: 41 snapshot count: 0, oldest timestamp: (8, 0) , meta checkpoint timestamp: (8, 8) base write gen: 17}}
4b | {Tt7:{"Sdate":2022-87-21720:27:49.130+00:007},"5": "1", ~c*: STORAGE™, ~1d~:22438, “ctx”: Checkpointer™, msg”: "WiredTiger messag
ess © attro:{ message” :"[1658435269:130044](1:0x718913684700], WT_SESSION.checkpoint: [WT VERS CHECKPOINT PROGRESS] saving checkpoint snapshot m
43, snapshot max: 43 snapshot count: 8, oldest timestamp: (8, 8) , meta checkpoint timestamp: (9, 0) base write gen: 1°}}
Connection accepted”,
attr
}
{ remote
BE QQ LO0FB](https://contents.bebee.com/users/id/DsrZL61dc5ebd3eab8/article/postgresql-pgadmin-e-docker-3EWnknxnz4Wk/UShY9.png)
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
Ciência e TecnologiaArtigos de mauro pereira
Ver blog
Hoje iremos criar um simples container docker com Apache “Tomcat/10.0.23” de maneira rápida e com po ...

No Console do AWS, Acesse o RDS Management Console · No painel de navegação esquerdo, clique em Data ...
Profissionais relacionados
Você pode estar interessado nestes trabalhos
-
Desenvolvedor Full Stack
há 1 semana
Innolevels São Paulo, São Paulo, BrazilDesenvolvedor Fullstack · Estamos buscando um profissional talentoso para atuar em nosso time de tecnologia. O candidato ideal é aquele que tem experiência em desenvolvimento fullstack, com habilidades em React, Nodejs, Jest, Restify ou similar e API Rest. · Familiaridade com met ...
-
Tech lead
há 1 semana
NetVagas São Paulo, São Paulo, BrazilDescrição do Cargo · O nosso sistema de recrutamento busca profissionais experientes para ocupar o cargo de Engenheiro de Software, responsável por liderar e gerenciar a equipe de desenvolvimento. · Responsabilidades · Liderar a equipe de desenvolvimento e garantir a entrega de p ...
-
Desenvolvedor Sênior
há 1 dia
beBeeCareers Araras, SPVagas de desenvolvimento em NodeJS, bancos de dados relacional e não relacional são oportunidades para profissionais motivados. · Cadastre-se se você é um especialista em desenvolvimento de sistemas com experiência em linguagens como NodeJS, banco de dados relacional e não relac ...
Comentários