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."