Docker e JavaScript: conteinerização de aplicações Node.js

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Docker e JavaScript: Guia Completo para Containerização de Aplicações Node.js



O desenvolvimento web moderno é impensável sem containerização. O Docker se tornou o padrão de facto para empacotar, entregar e executar aplicações. Para desenvolvedores JavaScript que trabalham com Node.js, entender o Docker não é apenas uma vantagem, mas uma necessidade. Neste artigo, vamos analisar como containerizar eficientemente aplicações Node.js, criar Dockerfiles otimizados e gerenciar ambientes com múltiplos contêineres.



O que é Docker e por que um desenvolvedor JavaScript precisa dele?



Docker é uma plataforma para desenvolvimento, entrega e execução de aplicações em ambientes isolados, chamados contêineres. O contêiner inclui tudo o que é necessário para a aplicação funcionar: código, ambiente de execução, bibliotecas do sistema e dependências.



Para o desenvolvedor Node.js, o Docker resolve vários problemas-chave:

  • Reprodutibilidade do ambiente: A aplicação funciona da mesma forma na máquina local do desenvolvedor, no servidor CI/CD e em produção.
  • Isolamento de dependências: Projetos diferentes podem usar versões diferentes do Node.js, pacotes globais e bibliotecas do sistema sem conflitos.
  • Simplicidade de implantação: Em vez de instruções complexas para instalar Node.js, npm, configurar o ambiente — uma única imagem que é executada com um único comando.
  • Escalabilidade: Os contêineres são facilmente escaláveis usando orquestradores (Kubernetes, Docker Swarm).


Criando um Dockerfile para uma aplicação Node.js



Vamos começar com uma aplicação Node.js simples em Express. Criaremos um server.js básico:



const express = require('express');const app = express();const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => { res.json({ message: 'Hello from Dockerized Node.js!' });});

app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});


Agora, criaremos o Dockerfile:



# Imagem base do Node.jsFROM node:18-alpine

# Definir diretório de trabalhoWORKDIR /app

# Copiar package.json e package-lock.jsonCOPY package*.json ./

# Instalar dependênciasRUN npm ci --only=production

# Copiar o código fonteCOPY . .

# Expor a portaEXPOSE 3000

# Executar a aplicaçãoCMD ["node", "server.js"]


Vamos analisar os pontos-chave:

  • FROM node:18-alpine: Usamos a imagem Alpine mínima do Node.js 18 — isso reduz significativamente o tamanho da imagem final.
  • WORKDIR /app: Definimos o diretório de trabalho dentro do contêiner.
  • COPY package*.json ./: Copiamos os arquivos de dependências separadamente do código — isso permite que o Docker armazene em cache a camada de dependências quando apenas o código é alterado.
  • RUN npm ci --only=production: Instalamos apenas as dependências de produção (sem devDependencies) para reduzir o tamanho da imagem.
  • COPY . .: Copiamos todo o código fonte após a instalação das dependências.


Vamos construir a imagem e executar o contêiner:



docker build -t my-node-app .docker run -d -p 3000:3000 --name my-app my-node-app


Otimizando o Dockerfile para produção



Para o ambiente de produção, usamos a construção em múltiplos estágios (multi-stage build) para criar uma imagem final o mais leve possível:



# Estágio de construçãoFROM node:18-alpine AS builder

WORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build # se houver um estágio de construção (TypeScript, Webpack, etc.)

# Estágio de produçãoFROM node:18-alpine

WORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/package.json ./

EXPOSE 3000CMD ["node", "dist/server.js"]


Adicionais o

Blogs

Book Recommendations