Pular para o conteúdo principal

Desafio 09: contêineres no Azure

Informação

Tempo estimado: 45–60 minutos | Custo estimado: ~$0.30 | Peso no exame: 20–25%

Cenário

A equipe de desenvolvimento da Contoso containerizou sua aplicação de dashboard interno. O Dockerfile está pronto, mas a equipe tem executado contêineres no laptop de um desenvolvedor. Você precisa configurar a infraestrutura adequada de contêineres no Azure: um registro privado para armazenar imagens e uma plataforma de hospedagem para executá-las em escala.

Habilidades do exame cobertas

HabilidadePeso
Criar e gerenciar Azure Container Registry (ACR)Alto
Provisionar Azure Container Instances (ACI)Alto
Provisionar Azure Container Apps (ACA)Alto
Gerenciar dimensionamento e escalabilidade de contêineresMédio
Escolher entre ACI, Container Apps e AKSMédio

Referência sysadmin ↔ Azure

TradicionalEquivalente no Azure
Registro privado Docker (Harbor, Nexus)Azure Container Registry (ACR)
docker run em uma VMAzure Container Instances (ACI)
Docker Compose + proxy reversoAzure Container Apps (ACA)
docker-compose scale web=5Regras de escalabilidade do ACA
Cluster Kubernetes (auto-gerenciado)AKS (Kubernetes gerenciado)

Tarefas

Tarefa 1: criar um Azure Container Registry

# Criar um grupo de recursos
az group create --name rg-containers-lab --location eastus

# Criar um ACR (sku Basic para fins de laboratório)
# O nome deve ser globalmente único, 5-50 caracteres alfanuméricos
az acr create \
--resource-group rg-containers-lab \
--name contosoreglab$RANDOM \
--sku Basic \
--admin-enabled true

# Armazenar o nome do registro para uso posterior
ACR_NAME=$(az acr list -g rg-containers-lab --query "[0].name" -o tsv)
echo "ACR Name: $ACR_NAME"

# Verificar o registro
az acr show --name $ACR_NAME --query "{Name:name, SKU:sku.name, LoginServer:loginServer}" -o table

Tarefa 2: compilar e enviar uma imagem para o ACR

Use az acr build para compilar diretamente na nuvem | sem necessidade de Docker local:

# Criar um diretório simples para a aplicação
mkdir container-app && cd container-app

# Criar um dockerfile simples
cat > Dockerfile << 'EOF'
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
EOF

# Criar uma página de exemplo
cat > index.html << 'EOF'
<!DOCTYPE html>
<html><body>
<h1>Contoso Dashboard</h1>
<p>Running on Azure Containers</p>
</body></html>
EOF

# Compilar e enviar usando ACR tasks (compila na nuvem)
az acr build \
--registry $ACR_NAME \
--image contoso-dashboard:v1 \
.

# Verificar se a imagem está no registro
az acr repository list --name $ACR_NAME -o table
az acr repository show-tags --name $ACR_NAME --repository contoso-dashboard -o table

Tarefa 3: implantar no Azure Container instances

# Obter as credenciais do ACR
ACR_LOGIN=$(az acr show --name $ACR_NAME --query loginServer -o tsv)
ACR_PASSWORD=$(az acr credential show --name $ACR_NAME --query "passwords[0].value" -o tsv)

# Implantar no ACI
az container create \
--resource-group rg-containers-lab \
--name aci-dashboard \
--image "$ACR_LOGIN/contoso-dashboard:v1" \
--registry-login-server $ACR_LOGIN \
--registry-username $ACR_NAME \
--registry-password $ACR_PASSWORD \
--dns-name-label contoso-aci-$RANDOM \
--ports 80 \
--cpu 0.5 \
--memory 0.5

# Obter o FQDN e testar
az container show -g rg-containers-lab -n aci-dashboard \
--query "{FQDN:ipAddress.fqdn, State:instanceView.state, IP:ipAddress.ip}" -o table

ACI_FQDN=$(az container show -g rg-containers-lab -n aci-dashboard --query ipAddress.fqdn -o tsv)
echo "Teste: http://$ACI_FQDN"

# Visualizar logs do contêiner
az container logs -g rg-containers-lab -n aci-dashboard

Tarefa 4: criar um ambiente de Container Apps

# Instalar/atualizar a extensão de Container Apps
az extension add --name containerapp --upgrade

# Registrar os provedores necessários
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

# Criar um ambiente de Container Apps
az containerapp env create \
--resource-group rg-containers-lab \
--name cae-contoso-lab \
--location eastus

Tarefa 5: implantar no Container Apps

# Habilitar acesso de identidade gerenciada ao ACR (preferível a credenciais de admin)
az containerapp create \
--resource-group rg-containers-lab \
--name ca-dashboard \
--environment cae-contoso-lab \
--image "$ACR_LOGIN/contoso-dashboard:v1" \
--registry-server $ACR_LOGIN \
--registry-username $ACR_NAME \
--registry-password $ACR_PASSWORD \
--target-port 80 \
--ingress external \
--min-replicas 1 \
--max-replicas 5

# Obter a URL
az containerapp show -g rg-containers-lab -n ca-dashboard \
--query "properties.configuration.ingress.fqdn" -o tsv

Tarefa 6: configurar escalabilidade do Container Apps

# Adicionar uma regra de escalabilidade HTTP (escalar quando requisições simultâneas > 10 por réplica)
az containerapp update \
--resource-group rg-containers-lab \
--name ca-dashboard \
--min-replicas 1 \
--max-replicas 10 \
--scale-rule-name http-scaling \
--scale-rule-type http \
--scale-rule-http-concurrency 10

# Verificar a configuração de escalabilidade
az containerapp show -g rg-containers-lab -n ca-dashboard \
--query "properties.template.scale" -o json

# Verificar a contagem atual de réplicas
az containerapp replica list -g rg-containers-lab -n ca-dashboard -o table

Tarefa 7: comparar ACI vs Container Apps

Execute ambas as implantações e compare:

# Comparar detalhes do ACI
echo "=== ACI ==="
az container show -g rg-containers-lab -n aci-dashboard \
--query "{Name:name, CPU:containers[0].resources.requests.cpu, Memory:containers[0].resources.requests.memoryInGb, State:instanceView.state}" -o table

# Comparar detalhes do Container Apps
echo "=== Container Apps ==="
az containerapp show -g rg-containers-lab -n ca-dashboard \
--query "{Name:name, Replicas:properties.template.scale, Ingress:properties.configuration.ingress.fqdn}" -o json
Dica | Quando usar ACI vs Container Apps vs AKS
RecursoACIContainer AppsAKS
Melhor paraTarefas simples e de curta duraçãoMicrosserviços, APIsOrquestração complexa
EscalabilidadeApenas manualAuto (HTTP, KEDA)Auto (HPA, KEDA)
RedeBásicaIngress integradoRede completa do Kubernetes
Modelo de custoCobrança por segundoPor segundo + camada gratuitaCluster + VMs dos nós
InicializaçãoSegundosSegundosMinutos (cluster)
ComplexidadeMuito baixaBaixaAlta

Critérios de sucesso

  • ACR criado e contém a imagem contoso-dashboard:v1
  • ACI em execução e acessível via HTTP
  • Ambiente de Container Apps criado
  • Container App implantado e acessível via HTTPS
  • Regras de escalabilidade configuradas no Container Apps
  • Consegue articular quando usar ACI vs Container Apps vs AKS

Cenários quebre & conserte

Cenário a: nome de imagem incorreto

# Implante o ACI com um nome de imagem digitado errado
az container create \
--resource-group rg-containers-lab \
--name aci-broken \
--image "$ACR_LOGIN/contoso-dashbord:v1" \
--registry-login-server $ACR_LOGIN \
--registry-username $ACR_NAME \
--registry-password $ACR_PASSWORD \
--ports 80
# Qual erro você recebe? verifique: az container show -g rg-containers-lab -n aci-broken --query "instanceView"

Cenário b: problema de permissão do ACR

# Tente implantar Container Apps sem fornecer credenciais do registro
az containerapp create \
--resource-group rg-containers-lab \
--name ca-broken \
--environment cae-contoso-lab \
--image "$ACR_LOGIN/contoso-dashboard:v1" \
--target-port 80 \
--ingress external
# Como você corrige a autenticação do ACR? (Dica: identidade gerenciada ou credenciais de admin)

Cenário c: porta incorreta

# Implante com a porta de destino errada
az containerapp create \
--resource-group rg-containers-lab \
--name ca-wrong-port \
--environment cae-contoso-lab \
--image "$ACR_LOGIN/contoso-dashboard:v1" \
--registry-server $ACR_LOGIN \
--registry-username $ACR_NAME \
--registry-password $ACR_PASSWORD \
--target-port 8080 \
--ingress external
# A aplicação roda mas retorna erros 502. por quê?

Teste seus conhecimentos

1. Quais são as diferenças entre os SKUs do ACR?

Mostrar Resposta
RecursoBasicStandardPremium
Armazenamento10 GB100 GB500 GB
Webhooks210500
Replicação geográfica
Private Link
Confiança de conteúdo
Chaves gerenciadas pelo cliente

2. Quando você deve usar ACI vs Container Apps vs AKS?

Mostrar Resposta
  • ACI: Trabalhos batch simples, agentes de build, contêineres sidecar, testes rápidos. Sem necessidade de orquestração. Cobrança por segundo.
  • Container Apps: Microsserviços, APIs, aplicações orientadas a eventos, aplicações web. Escalabilidade integrada com KEDA, integração com Dapr, ingress HTTPS fácil. Preço serverless.
  • AKS: Kubernetes completo necessário | rede complexa, operators personalizados, cargas de trabalho stateful, pods multi-contêiner com armazenamento compartilhado. Você gerencia o cluster.

3. Qual é a diferença entre conta de admin do ACR e identidade gerenciada para autenticação?

Mostrar Resposta
  • Conta de admin: Um usuário/senha compartilhado. Simples mas inseguro | qualquer pessoa com a senha tem acesso total de push/pull. Desabilitado por padrão. Use apenas para dev/test.
  • Identidade gerenciada: Autenticação baseada no Azure AD. Sem senhas para gerenciar. Suporta acesso baseado em funções (AcrPull, AcrPush). Recomendado para produção. Funciona com ACI, Container Apps, AKS e App Service.

4. O que o az acr build faz de diferente do docker build?

Mostrar Resposta

az acr build executa o build na nuvem usando ACR Tasks. Ele faz upload do contexto de build para o Azure, compila a imagem em computação do Azure e envia o resultado diretamente para o registro. Você não precisa ter o Docker instalado localmente. Isso é ideal para pipelines de CI/CD e desenvolvedores sem Docker Desktop.

Limpeza

# Excluir todos os recursos
az group delete --name rg-containers-lab --yes --no-wait

# Limpar arquivos locais
rm -rf container-app

echo "Os recursos estão sendo excluídos em segundo plano."