Deploy de Web Service NodeJS
Para o deploy de aplicações Web Node.js, é necessário manter o servidor Node.js em execução de forma contínua. Uma maneira eficaz de conseguir isso é através do uso do Docker, que permite encapsular o servidor Node.js e qualquer serviço relacionado, como bancos de dados, em containers isolados. Abaixo, detalhamos o processo de criação de um ambiente Docker com docker-compose
, a construção de um Dockerfile
para a aplicação Node.js, e a configuração de um servidor Nginx para gerenciar as requisições para a aplicação.
Criação do docker-compose.yml
docker-compose.yml
O uso do docker-compose
facilita o gerenciamento de múltiplos containers, permitindo definir e conectar um container Node.js a um banco de dados MySQL em um único arquivo de configuração. Aqui está um exemplo básico de como configurar esses serviços:
version: "3"
services:
db:
image: mysql:latest
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
volumes:
- mysql:/var/lib/mysql
ports:
- 3306:3306
environment:
TZ: America/Sao_Paulo
MYSQL_DATABASE: App
MYSQL_USER: mackleaps
MYSQL_PASSWORD: ****
MYSQL_ROOT_PASSWORD: *****
SERVICE_TAGS: dev
SERVICE_NAME: db
networks:
- internalnet
nodeapp:
container_name: nodeapp
build: .
image: nodeapp:v1
restart: unless-stopped
ports:
- 4447:4447
depends_on:
- db
networks:
- internalnet
volumes:
mysql:
external: true
networks:
internalnet:
driver: bridge
Dockerfile para a aplicação Node.js
O Dockerfile
define as instruções para construir a imagem Docker do servidor Node.js:
FROM node:alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4447
COPY docker-entrypoint.sh /usr/src/app
RUN chmod +x /usr/src/app/docker-entrypoint.sh
CMD ["/usr/src/app/docker-entrypoint.sh"]
Script docker-entrypoint.sh
docker-entrypoint.sh
Para garantir que o servidor Node.js inicie somente após o banco de dados estar pronto para conexões, utilizamos um script de entrypoint:
until nc -z -v -w30 db 3306
do
echo "Aguardando a inicialização do MySQL..."
sleep 30
done
exec npm start
Configuração do Nginx
Finalmente, para direcionar as requisições para o servidor Node.js rodando no container, configuramos um bloco location
no Nginx:
location /myapp/ {
proxy_pass http://localhost:4447/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Aqui está uma explicação detalhada para cada seção e diretiva utilizada no arquivo docker-compose.yml
mencionado anteriormente. Esta explicação ajudará a entender como cada componente é configurado e como eles interagem dentro do ambiente Docker.
Docker Compose: Estrutura e Explicações
version: "3"
Versão: Define a versão do Docker Compose usada. A versão "3" é compatível com as versões mais recentes do Docker Engine e oferece recursos modernos de configuração.
Serviços
services:
Serviços: Inicia a definição dos containers que serão gerenciados pelo Docker Compose.
db:
image: mysql:latest
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
volumes:
- mysql:/var/lib/mysql
ports:
- 3306:3306
environment:
TZ: America/Sao_Paulo
MYSQL_DATABASE: App
MYSQL_USER: mackleaps
MYSQL_PASSWORD: ****
MYSQL_ROOT_PASSWORD: ****
SERVICE_TAGS: dev
SERVICE_NAME: db
networks:
- internalnet
DB: Configura um container MySQL.
image: Especifica a imagem Docker a ser usada, neste caso, a última versão do MySQL.
container_name: Define o nome do container.
command: Passa comandos adicionais para o servidor MySQL.
restart: Política de reinício do container.
volumes: Monta volumes para persistência de dados.
ports: Mapeia a porta 3306 do container para a mesma porta na máquina host.
environment: Define variáveis de ambiente necessárias para a configuração do MySQL.
networks: Especifica a rede a qual o container será conectado.
nodeapp:
container_name: nodeapp
build: .
image: nodeapp:v1
restart: unless-stopped
ports:
- 4447:4447
depends_on:
- db
networks:
- internalnet
NodeApp: Configura um container para a aplicação Node.js.
container_name: Nome do container.
build: Diretório onde o Dockerfile está localizado, ponto (
.
) indica o diretório atual.image: Nome e tag da imagem a ser construída.
restart: Política de reinício.
ports: Mapeia a porta 4447 do container para a mesma porta na máquina host.
depends_on: Garante que o container
db
seja iniciado antes deste.networks: Conecta o container à rede especificada.
Volumes
volumes:
mysql:
external: true
Volumes: Define e gerencia volumes persistentes usados pelos containers, especificamente para o MySQL.
Redes
networks:
internalnet:
driver: bridge
Redes: Define uma rede chamada internalnet
com o driver de rede bridge
, facilitando a comunicação entre os containers definidos no mesmo Docker Compose.
Last updated