Passo a Passo para Configurar Docker com Angular: Dockerfile e Docker Compose
Para configurar o Dockerfile e o docker-compose.yml para um projeto Angular que será executado em um contêiner Docker, você pode seguir os passos explicados a seguir. Esse exemplo faz uso do Dockerfile para criar uma imagem com o Angular pré-compilado e um servidor Node.js simples para servir a aplicação, além do docker-compose.yml para configurar o serviço.
Explicação do Dockerfile para um Projeto Angular com Docker
Aqui está o Dockerfile detalhado com cada etapa explicada:
# Usando a imagem do Node.js 18 como base para a construção do projeto Angular
FROM node:18 AS build
# Definindo o diretório de trabalho dentro do contêiner
WORKDIR /usr/src/app
# Instalando o Angular CLI globalmente
RUN npm install -g @angular/cli
# Copiando o package.json e o package-lock.json para o diretório de trabalho
COPY package*.json ./
# Instalando as dependências do projeto
RUN npm install
# Copiando todo o código do projeto para o diretório de trabalho
COPY . .
# Compilando a aplicação Angular para produção
RUN ng build --configuration production
# Fase final: usando uma imagem leve do Node.js para servir o aplicativo
FROM node:18-alpine
# Definindo o diretório de trabalho
WORKDIR /usr/src/app
# Instalando dependências do servidor (caso necessário para o Node.js)
COPY package*.json ./
RUN npm install
# Copiando os arquivos compilados do Angular para o diretório de trabalho
COPY --from=build /usr/src/app/dist/hurr-ui ./dist/hurr-ui
# Copiando o servidor Node.js para servir o Angular (index.js)
COPY index.js .
# Expondo a porta 8080, que será usada pelo Node.js
EXPOSE 8080
# Iniciando o servidor Node.js
CMD ["node", "index.js"]
Explicação por Etapas
- Construção da Aplicação Angular:
- Base de Imagem:
FROM node:18 AS buildcria uma camada base usando o Node.js versão 18, o que é necessário para construir o Angular. - Definição do Diretório de Trabalho:
WORKDIR /usr/src/appdefine onde os comandos serão executados dentro do contêiner. - Instalação do Angular CLI:
RUN npm install -g @angular/cliinstala o Angular CLI globalmente, necessário para rodar comandos Angular. - Instalação de Dependências:
COPY package*.json ./copia os arquivos de dependências (package.json e package-lock.json) para o contêiner e, em seguida,RUN npm installinstala todas as dependências. - Cópia do Código do Projeto:
COPY . .copia todos os arquivos do projeto para o contêiner. - Compilação da Aplicação:
RUN ng build --configuration productioncompila o código Angular em modo de produção e armazena os arquivos compilados na pastadist/.
- Base de Imagem:
- Servindo a Aplicação com Node.js:
- Nova Base de Imagem:
FROM node:18-alpineutiliza uma imagem mais leve para a fase final. - Configuração do Diretório:
WORKDIR /usr/src/appdefine o diretório de trabalho. - Instalação de Dependências do Servidor:
RUN npm installinstala as dependências necessárias para o servidor Node.js. - Cópia dos Arquivos Compilados:
COPY --from=build /usr/src/app/dist/hurr-ui ./dist/hurr-uicopia a aplicação Angular compilada da primeira fase para a imagem final. - Configuração do Servidor:
COPY index.js .copia o arquivoindex.js, que contém o servidor Node.js simples, para servir a aplicação. - Exposição da Porta e Inicialização:
EXPOSE 8080define a porta 8080 eCMD ["node", "index.js"]inicia o servidor.
- Nova Base de Imagem:
Configuração do docker-compose.yml
Este arquivo define o serviço e facilita o gerenciamento dos contêineres:
version: '3'
services:
hurr-ui:
build: .
ports:
- "4200:4200"
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
Explicação
- Build:
build: .indica que o Docker deve construir a imagem a partir do Dockerfile na pasta atual. - Ports:
portsmapeia a porta do contêiner para a porta do host. No exemplo, a porta4200está exposta para desenvolvimento local, enquanto a imagem final usará8080. - Volumes: O uso de volumes (
.:/usr/src/appe/usr/src/app/node_modules) permite a sincronização dos arquivos locais com o contêiner durante o desenvolvimento, facilitando atualizações em tempo real sem precisar reconstruir a imagem.
index.js para Servir o Angular
Crie um arquivo index.js para servir a aplicação Angular compilada:
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static(path.join(__dirname, 'dist/hurr-ui')));
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'dist/hurr-ui', 'index.html'));
});
app.listen(8080, () => {
console.log('Servidor Angular rodando na porta 8080');
});
Esse arquivo usa Express.js para servir os arquivos estáticos gerados pela build Angular, e redireciona todas as rotas para index.html para compatibilidade com o roteamento do Angular.
Passos Finais
- Construa e inicie o contêiner:bashCopiar código
docker-compose up --build - Acesse o projeto no navegador pelo endereço
http://localhost:4200.
Agora você tem uma aplicação Angular rodando em um contêiner Docker configurado com um servidor Node.js para produção.
