Aplicação web desenvolvida em Node.js que demonstra a containerização com Docker. O projeto consiste em um servidor HTTP que gera e gerencia um arquivo JSON contendo informações de data e hora do sistema.
Esta aplicação foi desenvolvida para:
- Demonstrar a criação de uma API REST simples com Node.js puro (sem frameworks)
- Ilustrar o processo de containerização de aplicações Node.js com Docker
- Gerar e manipular arquivos JSON dinamicamente
- Servir como exemplo prático de servidor web básico
node_docker_app/
├── server.js # Código-fonte da aplicação Node.js
├── Dockerfile # Instruções para construção da imagem Docker
├── package.json # Metadados e dependências do projeto
├── data.json # Arquivo gerado automaticamente (não versionado)
└── README.md # Documentação do projeto
-
Inicialização: Quando o servidor inicia, ele:
- Importa os módulos necessários (
http,fs,path) - Define a porta 3000 como porta de escuta
- Gera imediatamente o arquivo
data.jsoncom a data/hora atual - Inicia o servidor HTTP
- Importa os módulos necessários (
-
Rotas Disponíveis:
GET /- Rota principal- Gera um novo arquivo
data.jsoncom a data/hora atual - Retorna uma resposta JSON com informações completas
- Exemplo de resposta:
{ "message": "Servidor Node.js rodando!", "data": { "timedate": "14/11/2025, 15:30:45" }, "info": "Arquivo data.json atualizado" }GET /data.json- Rota para acessar o arquivo- Lê e retorna o conteúdo do arquivo
data.json - Retorna erro 404 se o arquivo não existir
- Exemplo de resposta:
{ "timedate": "14/11/2025, 15:30:45" }Outras rotas - Retorna erro 404
{ "error": "Rota não encontrada" } - Gera um novo arquivo
A função generateDataFile() é responsável por:
- Obter a data e hora atual do sistema
- Formatar no padrão brasileiro (DD/MM/AAAA, HH:MM:SS)
- Usar o fuso horário America/Sao_Paulo
- Escrever no arquivo
data.jsonno formato JSON formatado (2 espaços) - Registrar a operação no console
A data é formatada usando toLocaleString() com as seguintes configurações:
- Localidade: pt-BR (português brasileiro)
- Fuso horário: America/Sao_Paulo
- Formato: DD/MM/AAAA, HH:MM:SS
- Sistema de horas: 24 horas (hour12: false)
FROM node:18-alpine
# Usa a imagem oficial do Node.js versão 18 baseada em Alpine Linux
# Alpine é uma distribuição Linux minimalista (apenas ~5MB)
WORKDIR /app
# Define /app como diretório de trabalho dentro do contêiner
# Todos os comandos subsequentes serão executados neste diretório
COPY server.js .
# Copia o arquivo server.js do host para /app no contêiner
EXPOSE 3000
# Documenta que o contêiner escuta na porta 3000
# Não publica a porta automaticamente, apenas documentação
CMD ["node", "server.js"]
# Define o comando padrão ao iniciar o contêiner
# Executa: node server.jsdocker build -t node_docker_app .Este comando:
- Lê o Dockerfile no diretório atual
- Baixa a imagem base
node:18-alpine(se não existir localmente) - Cria as camadas da imagem conforme as instruções
- Copia os arquivos necessários
- Gera uma imagem final com a tag
node_docker_app
docker run -d -p 3000:3000 --name meu_node_app node_docker_appEste comando:
-d: Executa em segundo plano (detached mode)-p 3000:3000: Mapeia porta 3000 do host → porta 3000 do contêiner--name meu_node_app: Atribui um nome ao contêinernode_docker_app: Usa a imagem criada anteriormente
- Docker instalado (Download aqui)
- Porta 3000 disponível no sistema
# Navegue até o diretório do projeto
cd node_docker_app
# Construa a imagem Docker
docker build -t node_docker_app .Saída esperada:
[+] Building 15.2s (8/8) FINISHED
=> [internal] load build definition from Dockerfile
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [1/3] FROM docker.io/library/node:18-alpine
=> [2/3] WORKDIR /app
=> [3/3] COPY server.js .
=> exporting to image
=> => naming to docker.io/library/node_docker_app
# Modo daemon (background)
docker run -d -p 3000:3000 --name meu_node_app node_docker_app
# Ou modo interativo (ver logs em tempo real)
docker run -p 3000:3000 --name meu_node_app node_docker_app# Listar contêineres em execução
docker ps
# Ver todos os contêineres (incluindo parados)
docker ps -a
# Verificar logs
docker logs meu_node_app
# Seguir logs em tempo real
docker logs -f meu_node_appVia cURL:
# Teste da rota principal
curl http://localhost:3000
# Teste da rota data.json
curl http://localhost:3000/data.json
# Teste com formatação bonita
curl http://localhost:3000 | json_ppVia Navegador:
- Acesse:
http://localhost:3000 - Ou:
http://localhost:3000/data.json
Via Postman/Insomnia:
- Method: GET
- URL:
http://localhost:3000
# Ver conteúdo do data.json
docker exec meu_node_app cat /app/data.json
# Listar arquivos no contêiner
docker exec meu_node_app ls -la /app
# Entrar no contêiner (shell interativo)
docker exec -it meu_node_app sh# Parar o contêiner
docker stop meu_node_app
# Iniciar o contêiner parado
docker start meu_node_app
# Reiniciar o contêiner
docker restart meu_node_app
# Remover o contêiner (precisa estar parado)
docker rm meu_node_app
# Forçar remoção (mesmo se estiver rodando)
docker rm -f meu_node_app# Listar imagens locais
docker images
# Remover a imagem
docker rmi node_docker_app
# Remover imagens não utilizadas
docker image prune
# Ver histórico de camadas da imagem
docker history node_docker_app# Remover contêineres parados
docker container prune
# Remover tudo (contêineres, redes, imagens não usadas)
docker system prune -a
# Ver uso de espaço do Docker
docker system df# Faça duas requisições consecutivas
curl http://localhost:3000
sleep 2
curl http://localhost:3000
# A data deve ser diferente em cada resposta# Acesse a rota principal (gera o arquivo)
curl http://localhost:3000
# Acesse a rota do arquivo
curl http://localhost:3000/data.json
# As datas devem ser iguais# Deve retornar erro 404
curl http://localhost:3000/rota-invalida# Ver uso de recursos do contêiner
docker stats meu_node_app
# Ver processos rodando no contêiner
docker top meu_node_app
# Inspecionar detalhes do contêiner
docker inspect meu_node_app# Verificar o que está usando a porta 3000
lsof -i :3000 # Linux/Mac
netstat -ano | findstr :3000 # Windows
# Usar outra porta
docker run -d -p 3001:3000 --name meu_node_app node_docker_app# Ver logs de erro
docker logs meu_node_app
# Verificar se a imagem foi construída corretamente
docker images | grep node_docker_app
# Reconstruir a imagem
docker build --no-cache -t node_docker_app .# Entrar no contêiner e verificar
docker exec -it meu_node_app sh
ls -la /app
cat /app/data.json
# Verificar logs do Node.js
docker logs meu_node_app- Node.js 18: Runtime JavaScript
- HTTP nativo: Módulo
httpdo Node.js - File System: Módulo
fspara manipulação de arquivos - Path: Módulo
pathpara manipulação de caminhos - Docker: Containerização da aplicação
- Alpine Linux: Sistema operacional base da imagem
- Adicionar rota para histórico de datas
- Implementar persistência de dados com volume Docker
- Adicionar testes automatizados
- Implementar API de configuração de fuso horário
- Adicionar suporte a CORS
- Criar endpoint de health check
- Adicionar variáveis de ambiente para configuração
- Implementar logging estruturado
- Adicionar Docker Compose para orquestração
- O arquivo
data.jsoné gerado dentro do contêiner e não persiste após remover o contêiner - Para persistir dados, seria necessário usar Docker Volumes
- A data/hora reflete o sistema onde o Docker está rodando
- A aplicação não tem dependências externas (usa apenas módulos nativos do Node.js)
- O formato de data pode variar dependendo da localização do sistema