Implantar contêineres no Serviço de Aplicativo do Azure: runtime, configuração, diagnóstico e solução de problemas
Voltar para a trilha AI-200
AI-200Capítulo 2

Estudo para a Certificação Microsoft AI-200

Implantar contêineres no Serviço de Aplicativo do Azure: runtime, configuração, diagnóstico e solução de problemas

Execute uma imagem privada como aplicativo Web gerenciado, configure porta e armazenamento, separe segredos da imagem e estabeleça um caminho operacional da implantação ao diagnóstico.

Tempo de estudo sugerido: 75 minutos • Nível intermediário • Reescrita autoral completa com versão resumida de cada tópico e laboratório guiado na CLI do Azure

Escudo neon Microsoft Certified AI-200 com símbolos de IA, desenvolvimento em nuvem, automação, segurança e monitoramento

1. Da imagem portátil ao aplicativo Web de produção

O contêiner faz um processador de documentos com IA se comportar de maneira consistente em desenvolvimento, teste e produção, mas a imagem isolada não oferece infraestrutura, escala, roteamento, segredos nem diagnóstico. O do fornece essa camada gerenciada. A equipe publica uma imagem Linux, injeta valores específicos de cada ambiente no runtime e opera o serviço sem administrar os hosts.

O exemplo recebe documentos, extrai texto e e devolve dados estruturados. A demanda cresce no horário comercial, a produção usa do e credenciais de dependentes, e as falhas precisam ser separadas entre pull da imagem, inicialização, configuração, integridade e código.

  • Implantar imagens personalizadas do ou de outro registro compatível.
  • Configurar comando de inicialização, porta , armazenamento compartilhado, e verificação de integridade.
  • Fornecer configurações, cadeias de conexão, valores fixos por slot e referências do .
  • Usar , site SCM/Kudu, e SSH opcional para diagnóstico.

Resumo do tópico

O transforma uma imagem portátil em aplicativo Web operado ao acrescentar computação, configuração, escala, roteamento e diagnóstico gerenciados.

2. Origens de imagem e implantação pelo portal

Um aplicativo Web para contêineres obtém a imagem de um registro. O é a origem natural de produção quando são necessários identidade do , rede privada, replicação geográfica, integrações de verificação e controle por função. A opção de registro privado atende Docker Hub, GitHub Registry e registros próprios compatíveis com Docker Registry V2 por ; imagens públicas dispensam credenciais.

  1. Escolha assinatura, grupo de recursos, região e um nome de aplicativo globalmente exclusivo.
  2. Selecione Contêiner como modelo de publicação e Linux como sistema operacional.
  3. Selecione ou crie um plano do .
  4. Na guia de contêiner, escolha o registro, a autenticação, o repositório, a imagem e uma tag explícita.
  5. Revise, crie e valide o nome de host padrão.

No mesmo escopo de assinatura, o portal consegue listar registros, repositórios e tags. Em outros registros privados, informe , usuário e senha. Prefira uma tag única e testada a latest para preservar a rastreabilidade.

Fluxo da imagem do Registro de Contêiner do Azure para o Serviço de Aplicativo com identidade gerenciada.
O runtime obtém a imagem escolhida. A identidade autoriza o pull e as configurações são aplicadas depois da seleção da imagem.

Resumo do tópico

Escolha registro, referência determinística, plano e autenticação; o provisiona o runtime Web e obtém a imagem.

3. Autenticação no registro com

A é a recomendação de produção porque fornece ao aplicativo uma identidade do e evita senhas do registro armazenadas. A identidade atribuída pelo sistema acompanha o ciclo de vida do aplicativo. A identidade atribuída pelo usuário é um recurso independente, útil quando precisa existir antes do aplicativo ou atender vários consumidores intencionalmente.

Conceda apenas a função AcrPull no registro ou no menor escopo compatível e configure o para usá-la no pull. Credenciais administrativas simplificam alguns laboratórios, porém criam segredo duradouro, exigem o usuário administrador do registro e aumentam o trabalho de rotação e auditoria.

az webapp identity assign --resource-group myResourceGroup --name myDocumentProcessor

ACR_ID=$(az acr show --resource-group myResourceGroup --name myregistry --query id -o tsv)
PRINCIPAL_ID=$(az webapp identity show --resource-group myResourceGroup --name myDocumentProcessor --query principalId -o tsv)
az role assignment create --assignee $PRINCIPAL_ID --scope $ACR_ID --role AcrPull

az webapp config set --resource-group myResourceGroup --name myDocumentProcessor \
  --generic-configurations '{"acrUseManagedIdentityCreds": true}'

az webapp config container set --resource-group myResourceGroup --name myDocumentProcessor \
  --container-image-name myregistry.azurecr.io/docprocessor:v1

Se o registro usa ponto de extremidade privado, também são necessários integração de rede virtual do , resolução funcional e vnetImagePullEnabled para encaminhar o pull pela rede virtual.

Resumo do tópico

mais AcrPull elimina credenciais armazenadas; um registro privado também depende de rede e corretos.

4. CLI, , atualização da imagem e entrega contínua

A CLI do é adequada a scripts e CI/CD porque recurso, plano, imagem e tag ficam explícitos. O com extensões Docker e oferece um fluxo guiado: compilar localmente, enviar ao registro e implantar a tag escolhida. A produção ainda precisa de validação independente de identidade e funções.

Ao mudar a referência da imagem, o serviço reinicia as instâncias e obtém a nova versão. Em toda reinicialização há um pull, porém apenas camadas alteradas são transferidas quando existe . Uma nova instância, mudança de host ou alteração de camada de preço pode exigir download completo; o tamanho da imagem afeta diretamente prontidão e inicialização a frio.

Reutilizar a mesma tag não produz por si só um evento de versão. Reinicie o aplicativo ou habilite implantação contínua para que o push no registro chame um . Um maduro compila, testa, publica versão imutável, atualiza a referência, espera a prontidão e conserva dados para reversão.

az webapp config container set -g myResourceGroup -n myDocumentProcessor \
  --container-image-name myregistry.azurecr.io/docprocessor:v2

az webapp deployment container config -g myResourceGroup -n myDocumentProcessor --enable-cd true
az webapp show -g myResourceGroup -n myDocumentProcessor --query defaultHostName -o tsv

Resumo do tópico

Automatize mudanças explícitas de versão, compreenda o de camadas e conecte o push do registro a uma liberação testada e observável.

5. Comando de inicialização e porta

O normalmente respeita ENTRYPOINT e CMD do Dockerfile. Um comando personalizado pode acrescentar argumentos do ambiente, executar inicialização, iniciar gerenciador de processos ou substituir padrões do . Ele substitui CMD; ENTRYPOINT permanece. Use shell somente quando operadores como && ou expansão de variáveis forem necessários.

A documentação atual da Microsoft pressupõe porta 80 no contêiner Linux personalizado. Se o processo escuta em outra porta, defina WEBSITES_PORT. A plataforma encerra e encaminha para uma única porta; o processo deve escutar em 0.0.0.0, não apenas localhost. EXPOSE documenta a intenção da imagem, mas não substitui a configuração da plataforma.

Portas internas comuns.
RuntimePorta comumAção
Node.js / Express3000Definir WEBSITES_PORT=3000.
Python / Gunicorn8000Definir WEBSITES_PORT=8000.
Java / Spring Boot8080Definir WEBSITES_PORT=8080.
Contêiner na porta 8080Não exige porta alternativa.
az webapp config set --resource-group myResourceGroup --name myDocumentProcessor \
  --startup-file "gunicorn --bind=0.0.0.0:8000 --workers=4 app:application"

az webapp config appsettings set --resource-group myResourceGroup --name myDocumentProcessor \
  --settings WEBSITES_PORT=8000 WEBSITES_ENABLE_APP_SERVICE_STORAGE=true

az webapp config set --resource-group myResourceGroup --name myDocumentProcessor \
  --always-on true --generic-configurations '{"healthCheckPath":"/health"}'

Resumo do tópico

Preserve os padrões da imagem quando possível; se precisar substituir CMD, alinhe WEBSITES_PORT à única porta e escute em todas as interfaces.

6. persistente, e integridade

A camada gravável do contêiner é efêmera. Reinicialização, movimentação ou substituição pode remover arquivos fora de um volume. Em contêineres Linux, habilitar o armazenamento do torna /home persistente e compartilhado entre instâncias; /home/LogFiles guarda acessíveis pela plataforma. Planeje a cota no plano e monte do quando capacidade, compartilhamento ou I/O ultrapassarem o volume interno.

evita ociosidade e reduz a inicialização a frio percebida. Está disponível a partir do nível Básico e ajuda de produção, imagens grandes, inicialização lenta e trabalhos em segundo plano. A expansão ainda inicia novas instâncias, portanto imagens enxutas e inicialização otimizada continuam essenciais.

A verificação de integridade chama periodicamente um caminho. Retorne 200 apenas se a instância puder atender; falhas repetidas a retiram do balanceador e uma falha prolongada pode substituí-la. O caminho da plataforma precisa corresponder exatamente ao do aplicativo. A verificação deve ser rápida e útil; alterações reiniciam o aplicativo.

@app.route('/health')
def health_check():
    try:
        db.execute('SELECT 1')
        storage.list_containers()
        return {'status': 'healthy'}, 200
    except Exception:
        return {'status': 'unhealthy'}, 503
Controles do runtime: inicialização, porta, armazenamento persistente, Always On e integridade.
Esses controles determinam como a imagem inicia, recebe tráfego, conserva arquivos, permanece ativa e comprova prontidão.

Resumo do tópico

Use /home para persistência planejada, contra ociosidade e um correspondente para proteger o tráfego de instâncias sem integridade.

7. Configurações de aplicativo e cadeias de conexão

Configurações de aplicativo são pares nome-valor criptografados e injetados como variáveis de ambiente. Assim, desenvolvimento, homologação e produção reutilizam a mesma imagem. Use nomes portáveis com letras, números e sublinhados; chaves .NET aninhadas em Linux substituem dois-pontos por dois sublinhados, como ConnectionStrings__DefaultConnection.

Cadeias de conexão acrescentam um prefixo pelo tipo: SQL Server usa SQLCONNSTR_, usa SQLAZURECONNSTR_, MySQL usa MYSQLCONNSTR_, PostgreSQL usa POSTGRESQLCONNSTR_ e personalizada usa CUSTOMCONNSTR_. Runtimes não .NET normalmente preferem configurações comuns, pois não aproveitam essa convenção.

az webapp config appsettings set --resource-group myResourceGroup --name myDocumentProcessor \
  --settings STORAGE_ACCOUNT_NAME=mystorageaccount LOG_LEVEL=INFO MAX_DOCUMENT_SIZE_MB=50

az webapp config connection-string set --resource-group myResourceGroup --name myDocumentProcessor \
  --connection-string-type SQLAzure \
  --settings DefaultConnection="Server=myserver.database.windows.net;Database=mydb;..."

az webapp config appsettings set --resource-group myResourceGroup --name myDocumentProcessor \
  --settings API_KEY="@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/api-key)"

Resumo do tópico

Injete valores do ambiente em vez de reconstruir a imagem e use cadeias tipadas apenas quando o runtime espera seus prefixos.

8. Edição em massa, e referências do

Quando houver muitos valores, exporte as configurações em , revise como código e reaplique o arquivo. O portal também oferece edição avançada em . Nunca confirme segredos reais de produção no repositório.

de implantação executam versões separadas no mesmo plano. A troca move código e a maior parte da configuração; os valores marcados como configuração de slot permanecem no ambiente. Identificadores, , bancos, sinalizadores, diagnóstico detalhado e a maioria das referências do devem ficar presos ao slot quando uma troca seria perigosa.

A referência do permite ler um segredo pelo nome normal da variável sem alterar o código. Habilite e conceda leitura, de preferência pela função Usuário de Segredos do no . Sem versão, a referência acompanha a versão mais recente; o é atualizado em até 24 horas, e uma mudança de configuração ou atualização explícita antecipa a resolução.

az webapp config appsettings list -g myResourceGroup -n myDocumentProcessor -o json > settings.json
az webapp config appsettings set -g myResourceGroup -n myDocumentProcessor --settings @settings.json

az webapp config appsettings set -g myResourceGroup -n myDocumentProcessor --slot staging \
  --settings ENVIRONMENT=staging API_ENDPOINT=https://api-staging.example.com \
  --slot-settings ENVIRONMENT API_ENDPOINT

Resumo do tópico

Trate configuração como dado revisável, fixe valores sensíveis ao ambiente no slot e armazene segredos gerenciados no .

9. do contêiner, fluxo de e site SCM/Kudu

A plataforma captura stdout e stderr: mensagens do aplicativo, exceções, , requisições e ciclo de vida. Escreva estruturados e úteis no console, sem credenciais nem conteúdo de documentos. O no sistema de arquivos disponibiliza a saída em /home/LogFiles para diagnóstico de curto prazo.

az webapp log config --resource-group myResourceGroup --name myDocumentProcessor \
  --docker-container-logging filesystem

az webapp log tail --resource-group myResourceGroup --name myDocumentProcessor

O fluxo de mostra novas entradas em tempo real e identifica instâncias em expansão. O site ://<app-name>.scm.azurewebsites.net oferece Environment, navegador do armazenamento montado, downloads e despejo de diagnóstico. Ele é um site auxiliar, não o próprio contêiner; portanto não enxerga todos os processos nem caminhos efêmeros da imagem em execução.

Resumo do tópico

Envie a saída a stdout/stderr, acompanhe-a em incidentes e use Kudu para variáveis aplicadas, arquivos montados e pacotes de diagnóstico.

10. , Analytics e SSH opcional

locais não bastam para retenção. Configurações de diagnóstico podem enviar AppServiceConsoleLogs, AppServiceHTTPLogs, AppServicePlatformLogs e AppServiceAppLogs ao , Analytics, ou conta de armazenamento. A centralização permite consultas Kusto, alertas, pastas de trabalho, painéis, retenção e correlação.

RESOURCE_ID=$(az webapp show -g myResourceGroup -n myDocumentProcessor --query id -o tsv)
WORKSPACE_ID=$(az monitor log-analytics workspace show -g myResourceGroup -n myWorkspace --query id -o tsv)

az monitor diagnostic-settings create --resource "$RESOURCE_ID" \
  --name appServiceDiagnostics --workspace "$WORKSPACE_ID" \
  --logs '[{"category":"AppServiceConsoleLogs","enabled":true},{"category":"AppServiceHTTPLogs","enabled":true}]'
AppServiceConsoleLogs
| where TimeGenerated > ago(1h)
| where ResultDescription has_any ("error", "exception", "failed")
| project TimeGenerated, _ResourceId, ResultDescription
| order by TimeGenerated desc

SSH é opcional e precisa estar previsto na imagem: OpenSSH instalado, porta 2222 e configuração exigida pelo . A sessão entra em uma instância; alterações na camada do contêiner somem na reinicialização. Use SSH para inspeção pontual, nunca como mecanismo de implantação.

Fluxo de observabilidade de stdout e stderr para fluxo de logs, Kudu, Azure Monitor, Log Analytics e alertas.
Ferramentas em tempo real aceleram a triagem; centralizados conservam histórico e evidências.

Resumo do tópico

Exporte categorias para análise durável e alertas; reserve SSH para investigação temporária dentro da instância.

11. Árvore de decisão para solução de problemas

Sintoma, verificação e correção provável.
SintomaVerifique primeiroCorreção típica
Contêiner não fica prontoImagem, autorização, e valores obrigatórios.Corrigir AcrPull, rede, dependência ou variável ausente.
Erro de conexão ou 404WEBSITES_PORT, endereço de escuta e rota.Alinhar porta, usar 0.0.0.0 e expor o caminho esperado.
Arquivos somemDiretório e configuração de armazenamento.Gravar em /home ou montar do .
Integridade remove instânciasCaminho configurado e status do .Igualar caminhos e retornar 200 somente quando pronto.
Configuração ausenteResultado no portal/CLI e Kudu /Env.Corrigir nome, slot ou permissão do .
Primeira requisição lentaTamanho, duração de pull/início e .Imagem multietapa menor, inicialização otimizada e .

Reproduza localmente com configuração não secreta equivalente e investigue de fora para dentro: imagem e registro, configuração do serviço, prontidão, roteamento e dependências. Isso evita atribuir todo erro ao código.

Resumo do tópico

Diagnostique por camadas: pull, inicialização, configuração, porta, binding, integridade, rota, armazenamento e dependências.

12. Laboratório guiado: imagem privada no

O exercício fornecido estima 30 minutos. Exige assinatura com permissão de implantação e atribuição de função, CLI do atual, e, opcionalmente, Python 3.12 ou posterior. O material informa que ACR Tasks pode não estar disponível em créditos gratuitos; confirme a elegibilidade e os custos atuais antes de executar.

  1. Crie uma pequena com /health e de teste.
  2. Crie grupo dedicado e ; compile uma tag explícita com ACR Tasks.
  3. Crie plano Linux e aplicativo Web para contêineres.
  4. Habilite identidade atribuída pelo sistema, conceda AcrPull e ative o pull por identidade.
  5. Defina WEBSITES_PORT, configurações, armazenamento quando necessário, e integridade.
  6. Habilite e acompanhe a inicialização.
  7. Teste o nome de host e o ; valide valores não secretos no Kudu.
  8. Publique uma tag única nova, atualize, valide e documente reversão.
  9. Exclua o grupo dedicado se não contiver ativos compartilhados.
az group create -n rg-ai200-appservice-lab -l eastus
az acr create -g rg-ai200-appservice-lab -n <registro-globalmente-unico> --sku Basic
az acr build -r <registro-globalmente-unico> -t docprocessor:v1 .
az appservice plan create -g rg-ai200-appservice-lab -n plan-ai200 --is-linux --sku B1
az webapp create -g rg-ai200-appservice-lab -p plan-ai200 -n <aplicativo-globalmente-unico> \
  --container-image-name <registro>.azurecr.io/docprocessor:v1

Resumo do tópico

O laboratório comprova compilação, pull privado, runtime, configuração externa, integridade, , teste funcional, atualização e limpeza.

13. Verificação de conhecimento reescrita e comentada

Relacione o sintoma ao controle.
CenárioMelhor decisãoMotivo
Imagem escuta em 8000 e não conecta.Definir WEBSITES_PORT=8000.O tráfego precisa chegar à porta interna real.
Arquivos gerados desaparecem.Habilitar armazenamento e gravar em /home.A camada comum é efêmera.
Homologação e produção usam diferentes.Marcar API_ENDPOINT como configuração de slot.O valor não acompanha a troca.
Aplicativo tem /healthz e falha na verificação.Configurar o caminho como /healthz.Plataforma e aplicativo precisam coincidir.
É necessário confirmar variáveis injetadas.Abrir Environment no Kudu.A página mostra as variáveis aplicadas.

Resumo do tópico

Associe porta, persistência, afinidade de slot, caminho de integridade e inspeção de ambiente ao controle do correspondente.

14. Revisão final e referências da Microsoft

  • O obtém a imagem e gerencia o runtime Web.
  • com AcrPull é a autenticação preferida para registro privado.
  • Inicialização, porta, armazenamento, e integridade definem o comportamento.
  • Configurações e mantêm ambiente e segredos fora da imagem.
  • , Kudu, , Analytics e SSH formam o conjunto de diagnóstico.
  • A liberação termina somente depois de prontidão, teste, observabilidade e evidência de reversão.
  1. Microsoft Learn: módulo Implantar contêineres no
  2. Configurar um contêiner personalizado
  3. Implantação contínua com contêineres personalizados
  4. Configurar aplicativo e cadeias de conexão
  5. Usar referências do
  6. Configurar de implantação
  7. Habilitar de diagnóstico
  8. Monitorar o

Resumo do tópico

Um contêiner pronto para produção combina implantação determinística, acesso por identidade, runtime explícito, configuração externa e observabilidade durável.