Aplicação Node.js (Express) que insere e lista nomes em um banco MySQL, containerizada com Docker Compose. O projeto inclui:
- Serviço
app(Express) rodando na porta 3000 - Serviço
database(MySQL) - Serviço
nginx(proxy reverso) exposto na porta 8080
- Ao acessar
/a aplicação insere um nome humano aleatório (gerado comunique-names-generator) no MySQL e retorna a lista de nomes com a escrita Full Cycle Rocks !. - A aplicação aguarda o banco ficar pronto usando um mecanismo de retry (
waitForDb) e há healthchecks configurados paradatabaseeapp.
- Node.js + Express
- MySQL
- Docker, Docker Compose
- unique-names-generator (para gerar nomes)
- Reconstruir sem cache (recomendado após alterações em
package.json):
docker-compose build --no-cache --progress=plain- Subir os serviços:
docker-compose up --build- Verificar logs e health:
docker-compose logs -f app
docker-compose logs -f database
docker-compose ps # mostra estado de health (healthy/unhealthy)- Testar a aplicação:
curl http://localhost:3000
# ou via nginx
curl http://localhost:80803000— exposto pelo serviçoapp(mapeado para o host)8080— exposto pelonginx3306— não é exposto por padrão (não é necessário para comunicação entre containers). Exponha apenas se precisar acessar o DB a partir do host.
- Conexão com o banco: use
host: 'database'dentro do container (nome do serviço do Compose). Não uselocalhost. - Inicialização resiliente: o app tem
waitForDb()que faz retries; o Compose tem healthchecks configurados para melhorar a ordem de inicialização. - Se a instalação de dependências não acontecer no build, reconstrua sem cache (
--no-cache) para forçarnpm install.
- Verifique se
appestáhealthyemdocker-compose ps. - Se o app não conectar ao DB, veja
docker-compose logs -f databaseedocker-compose logs -f app. - Para testar conectividade TCP do container
appaodatabase:
docker-compose exec app node -e "require('net').createConnection(3306,'database').on('connect',()=>console.log('ok')).on('error',e=>console.error(e))"- Atualize
docker/app/package.jsoncom a nova dependência (ex.:unique-names-generator). - Rebuild da imagem para instalar a nova dependência:
docker-compose build --no-cache --progress=plain- Para builds mais rápidos: no
docker/Dockerfilecopie apenaspackage*.json, rodenpm ci, depois copie o restante dos arquivos e rode build — isso permite aproveitar cache nas dependências. - Ajuste healthchecks/retries se estiver enfrentando tempo de inicialização variável.
A aplicação Node.js (Express) insere um nome humano aleatório no banco MySQL a cada acesso à rota / e retorna a lista de nomes (a saída inclui Full Cycle Rocks! no HTML). O projeto foi feito para ser executado com Docker Compose e inclui healthchecks e lógica de retry para esperar o banco ficar pronto.
.
├── docker-compose.yml
├── README.md
├── docker/
│ ├── Dockerfile # Dockerfile principal para o serviço app
│ ├── scripts/
│ │ └── docker-entrypoint.sh
│ └── app/
│ ├── index.js # código da aplicação
│ ├── package.json
│ └── healthcheck.js # checagem de saúde usada pelo Compose
├── nginx/
│ ├── Dockerfile
│ └── nginx.conf
└── .git/
Obs: pequenos detalhes (arquivos extras) podem variar conforme o histórico do repositório.
- Reconstrua a imagem quando alterar dependências:
docker-compose build --no-cache --progress=plain- Suba os serviços:
docker-compose up --build- Teste a aplicação:
curl http://localhost:3000
# via nginx
curl http://localhost:8080- Instale dependências:
cd docker/app
npm install- Ajuste variáveis de ambiente se necessário (p.ex.,
DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) e rode:
npm startA aplicação assume que o MySQL está acessível em database (quando em Compose) ou no host configurado via variáveis de ambiente.