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 build
cria 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/app
define onde os comandos serão executados dentro do contêiner. - Instalação do Angular CLI:
RUN npm install -g @angular/cli
instala 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 install
instala 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 production
compila 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-alpine
utiliza uma imagem mais leve para a fase final. - Configuração do Diretório:
WORKDIR /usr/src/app
define o diretório de trabalho. - Instalação de Dependências do Servidor:
RUN npm install
instala 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-ui
copia 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 8080
define 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:
ports
mapeia a porta do contêiner para a porta do host. No exemplo, a porta4200
está exposta para desenvolvimento local, enquanto a imagem final usará8080
. - Volumes: O uso de volumes (
.:/usr/src/app
e/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.