Implementar contenedores en el Servicio de Aplicaciones de Azure: runtime, configuración, diagnóstico y solución de problemas
Volver a la ruta AI-200
AI-200Capítulo 2

Preparación para la Certificación Microsoft AI-200

Implementar contenedores en el Servicio de Aplicaciones de Azure: runtime, configuración, diagnóstico y solución de problemas

Ejecuta una imagen privada como aplicación web administrada, configura puerto y almacenamiento, separa los secretos de la imagen y crea un recorrido operativo desde la implementación hasta el diagnóstico.

Tiempo de estudio sugerido: 75 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema y laboratorio guiado en la CLI de Azure

Escudo neón Microsoft Certified AI-200 con símbolos de IA, desarrollo en la nube, automatización, seguridad y supervisión

1. De una imagen portátil a una aplicación web de producción

El contenedor hace que un procesador de documentos con IA se comporte igual en desarrollo, pruebas y producción, pero la imagen no aporta infraestructura, escalado, enrutamiento, secretos ni diagnóstico. El de proporciona esa capa administrada. El equipo publica una imagen Linux, inyecta valores por entorno durante la ejecución y opera el servicio sin administrar hosts.

El ejemplo recibe documentos, extrae texto y y devuelve datos estructurados. La demanda sube en horario laboral, producción usa y credenciales de , y los errores deben clasificarse entre pull, inicio, configuración, estado y aplicación.

  • Implementar imágenes desde u otro registro compatible.
  • Configurar inicio, puerto , almacenamiento compartido, y comprobación de estado.
  • Proporcionar configuración, cadenas de conexión, valores por ranura y referencias de .
  • Usar registros, sitio SCM/Kudu, y SSH opcional.

Resumen del tema

El convierte una imagen portátil en una aplicación operada al agregar proceso, configuración, escalado, enrutamiento y diagnóstico.

2. Orígenes de imagen e implementación en el portal

Una aplicación web para contenedores obtiene su imagen de un registro. es la opción natural de producción cuando se requiere identidad de , red privada, replicación geográfica, integración de análisis y control por roles. La opción genérica admite Docker Hub, GitHub Registry y registros propios compatibles con Docker Registry V2 por ; una imagen pública no necesita credenciales.

  1. Elige suscripción, grupo de recursos, región y nombre globalmente único.
  2. Selecciona Contenedor y Linux.
  3. Selecciona o crea un plan del .
  4. En la pestaña de contenedor, define registro, autenticación, repositorio, imagen y etiqueta explícita.
  5. Revisa, crea y valida el nombre de host predeterminado.

En la misma suscripción, el portal puede enumerar registros, repositorios y etiquetas. En otros registros privados, indica , usuario y contraseña. Prefiere una etiqueta única y probada en vez de latest.

Flujo desde Azure Container Registry hasta Servicio de Aplicaciones con identidad administrada.
El runtime obtiene la imagen seleccionada; la identidad autoriza el pull y la configuración se aplica después.

Resumen del tema

Elige registro, referencia determinista, plan y autenticación; el aprovisiona el runtime y obtiene la imagen.

3. Autenticación del registro con

La es la opción recomendada porque evita contraseñas almacenadas. La asignada por el sistema sigue el ciclo de vida de la aplicación. La asignada por el usuario es un recurso independiente que puede prepararse antes y compartirse intencionadamente.

Asigna solo AcrPull en el registro o en el menor ámbito compatible y habilita el uso de esa identidad. Las credenciales administrativas facilitan algunos laboratorios, pero crean un secreto duradero y exigen rotación y auditoría.

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

Con un punto de conexión privado, también se necesitan integración de red virtual, funcional y vnetImagePullEnabled para dirigir el pull por la red virtual.

Resumen del tema

más AcrPull elimina credenciales; un registro privado también depende de red y .

4. CLI, , actualizaciones y entrega continua

La CLI de sirve para scripts y CI/CD porque deja explícitos recurso, plan, imagen y etiqueta. con extensiones Docker y ofrece un flujo guiado. En producción, identidad y roles deben comprobarse por separado.

Al cambiar la referencia, el servicio reinicia las instancias y obtiene la nueva imagen. Cada reinicio ejecuta un pull, pero descarga solo capas modificadas si existe caché. Una nueva instancia, cambio de host o nivel puede requerir la descarga completa, por lo que el tamaño afecta a la preparación.

Reutilizar una etiqueta no crea por sí solo una versión. Reinicia o habilita implementación continua para que un push invoque el . La canalización debe compilar, probar, publicar una versión inmutable, actualizar, esperar la preparación y conservar datos de reversión.

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

Resumen del tema

Automatiza cambios explícitos de versión y conecta los pushes con una liberación probada, observable y reversible.

5. Comando de inicio y puerto

El respeta ENTRYPOINT y CMD. Un comando personalizado puede agregar argumentos, ejecutar inicialización o sustituir valores del . Reemplaza CMD, no ENTRYPOINT. Usa shell solo si necesitas operadores como &&.

La documentación actual supone el puerto 80. Si el proceso escucha en otro, define WEBSITES_PORT. La plataforma termina y reenvía a un solo puerto; el proceso debe enlazarse a 0.0.0.0 y no solo a localhost. EXPOSE no sustituye esta configuración.

Puertos internos frecuentes.
RuntimePuertoAcción
Node.js / Express3000WEBSITES_PORT=3000.
Python / Gunicorn8000WEBSITES_PORT=8000.
Java / Spring Boot8080WEBSITES_PORT=8080.
Contenedor en 8080No requiere puerto alternativo.
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"}'

Resumen del tema

Mantén los valores de la imagen cuando sea posible; si cambias CMD, alinea WEBSITES_PORT y escucha en todas las interfaces.

6. Almacenamiento persistente, y estado

La capa escribible es efímera. Habilitar el almacenamiento del hace que /home sea persistente y compartido; /home/LogFiles guarda registros accesibles. Planea la cuota del plan y monta cuando capacidad, uso compartido o I/O superen el volumen incorporado.

evita la inactividad y reduce arranques en frío. Está disponible desde Básico y ayuda a de producción, imágenes grandes e inicio lento. El escalado aún crea instancias, por lo que siguen siendo necesarias imágenes pequeñas.

La comprobación de estado llama a una ruta. Devuelve 200 solo cuando la instancia puede atender. Los fallos repetidos la quitan del balanceador. La ruta configurada debe coincidir exactamente con el y el cambio reinicia la aplicación.

@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 de inicio, puerto, almacenamiento, Always On y estado.
Los controles determinan inicio, tráfico, persistencia, calentamiento y preparación.

Resumen del tema

Usa /home para persistencia prevista, contra inactividad y una ruta de estado coincidente.

7. Configuración de aplicaciones y cadenas de conexión

La configuración son pares cifrados que se inyectan como variables de entorno. Así cada entorno usa la misma imagen. Emplea letras, números y guiones bajos; las claves .NET anidadas en Linux usan doble guion bajo, por ejemplo ConnectionStrings__DefaultConnection.

Las cadenas agregan prefijos: SQLCONNSTR_, SQLAZURECONNSTR_, MYSQLCONNSTR_, POSTGRESQLCONNSTR_ o CUSTOMCONNSTR_. Los runtimes no .NET suelen preferir configuración común porque no aprovechan esos prefijos.

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

Resumen del tema

Inyecta valores por entorno sin reconstruir y usa cadenas tipadas solo si el runtime espera sus prefijos.

8. Edición masiva, ranuras y referencias de

Exporta muchos valores como , revísalos y vuelve a aplicarlos. El portal también ofrece edición avanzada. No confirmes secretos reales en el repositorio.

Las ranuras ejecutan versiones separadas en el mismo plan. Un intercambio mueve código y gran parte de la configuración, pero los valores marcados como propios de la ranura permanecen. Identificadores, , bases de datos, características, diagnóstico detallado y la mayoría de referencias de deben fijarse al entorno cuando un intercambio sería peligroso.

Una referencia de entrega el secreto como variable normal sin cambiar el código. Habilita y concede lectura, preferiblemente el rol Secrets User. Sin versión, sigue la más reciente; la caché se actualiza en 24 horas y un cambio de configuración o actualización explícita fuerza una resolución anterior.

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

Resumen del tema

Trata la configuración como datos revisables, fija valores por entorno y guarda secretos administrados en .

9. Registros de contenedor, flujo y sitio SCM/Kudu

La plataforma captura stdout y stderr: aplicación, excepciones, , solicitudes y ciclo de vida. Escribe registros estructurados sin credenciales ni documentos. El sistema de archivos expone la salida en /home/LogFiles para diagnóstico breve.

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

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

El flujo muestra entradas en tiempo real e identifica instancias. El sitio ://<app-name>.scm.azurewebsites.net ofrece Environment, archivos montados, descargas y volcado de diagnóstico. Es un sitio auxiliar, no el contenedor, y no muestra todos los procesos ni rutas efímeras.

Resumen del tema

Envía salida a stdout/stderr, síguela en incidentes y usa Kudu para variables, archivos y paquetes de diagnóstico.

10. , Analytics y SSH opcional

Los registros locales no bastan para retención. La configuración de diagnóstico envía AppServiceConsoleLogs, AppServiceHTTPLogs, AppServicePlatformLogs y AppServiceAppLogs a , Analytics, o . Así se habilitan Kusto, alertas, libros, paneles, retención y correlación.

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 es opcional y debe incorporarse en la imagen con OpenSSH, puerto 2222 y la configuración exigida. La sesión entra en una instancia y los cambios desaparecen al reiniciar. Úsalo para inspección puntual, no para implementar.

Flujo desde stdout y stderr hasta registros, Kudu, Azure Monitor, Log Analytics y alertas.
Las herramientas en tiempo real aceleran la clasificación; la centralización conserva historia.

Resumen del tema

Exporta categorías para análisis y alertas duraderos; reserva SSH para investigación temporal dentro de una instancia.

11. Árbol de solución de problemas

Síntoma, comprobación y corrección.
SíntomaCompruebaCorrección
No queda listoImagen, autorización, inicio y variables.Corregir AcrPull, red, dependencia o valor.
Conexión o 404Puerto, enlace y ruta.Alinear WEBSITES_PORT, 0.0.0.0 y .
Archivos desaparecenRuta y almacenamiento.Usar /home o montar .
Falla estadoRuta y código .Igualar rutas y devolver 200 al estar listo.
Falta configuraciónPortal/CLI y Kudu /Env.Corregir nombre, ranura o permiso de .
Primer acceso lentoTamaño, pull, inicio y .Imagen menor, inicio optimizado y .

Reproduce localmente con valores no secretos y avanza por capas: imagen y registro, configuración, preparación, enrutamiento y dependencias. No atribuyas todos los errores al código.

Resumen del tema

Diagnostica por capas: pull, inicio, configuración, puerto, enlace, estado, ruta, almacenamiento y dependencias.

12. Laboratorio guiado: imagen privada en

El ejercicio estima 30 minutos y necesita permisos de implementación y roles, CLI actual, y Python 3.12 opcional. El material indica que ACR Tasks puede no estar disponible con créditos gratuitos; confirma elegibilidad y costes actuales.

  1. Crea una con /health y de prueba.
  2. Crea grupo y ; compila una etiqueta explícita.
  3. Crea plan Linux y aplicación web.
  4. Habilita identidad, AcrPull y pull administrado.
  5. Configura WEBSITES_PORT, valores, almacenamiento, y estado.
  6. Habilita registros y observa el inicio.
  7. Prueba host y ; valida valores no sensibles en Kudu.
  8. Publica una etiqueta nueva, actualiza y documenta reversión.
  9. Elimina el grupo si no contiene activos compartidos.
az group create -n rg-ai200-appservice-lab -l eastus
az acr create -g rg-ai200-appservice-lab -n <registro-unico> --sku Basic
az acr build -r <registro-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 <aplicacion-unica> \
  --container-image-name <registro>.azurecr.io/docprocessor:v1

Resumen del tema

El laboratorio prueba compilación, pull privado, runtime, configuración externa, estado, registros, prueba, actualización y limpieza.

13. Evaluación reescrita y explicada

Relaciona el síntoma con el control.
EscenarioDecisiónMotivo
Escucha en 8000 y no conecta.WEBSITES_PORT=8000.El tráfico debe llegar al puerto interno.
Archivos desaparecen.Habilitar almacenamiento y usar /home.La capa normal es efímera.
Staging y producción usan distintas.API_ENDPOINT como valor de ranura.No se mueve al intercambiar.
Existe /healthz y falla la comprobación.Configurar /healthz.Las rutas deben coincidir.
Hay que confirmar variables.Abrir Environment en Kudu.Muestra las variables aplicadas.

Resumen del tema

Asocia puerto, persistencia, afinidad de ranura, ruta de estado e inspección con su control de plataforma.

14. Revisión final y referencias de Microsoft

  • obtiene la imagen y administra el runtime.
  • con AcrPull es la autenticación preferida.
  • Inicio, puerto, almacenamiento, y estado determinan la ejecución.
  • Configuración y mantienen entorno y secretos fuera de la imagen.
  • Registros, Kudu, , Analytics y SSH forman el diagnóstico.
  • La liberación termina tras preparación, prueba, observabilidad y reversión.
  1. Microsoft Learn: módulo Implementar contenedores en
  2. Configurar un contenedor personalizado
  3. Implementación continua de contenedores
  4. Configurar la aplicación y cadenas
  5. Usar referencias de
  6. Configurar ranuras de implementación
  7. Habilitar registros de diagnóstico
  8. Supervisar

Resumen del tema

Un contenedor listo para producción combina implementación determinista, acceso por identidad, runtime explícito, configuración externa y observabilidad duradera.