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
Por João Ricardo Dutra••Contenido original completo
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.
Elige suscripción, grupo de recursos, región y nombre globalmente único.
Selecciona Contenedor y Linux.
Selecciona o crea un plan del .
En la pestaña de contenedor, define registro, autenticación, repositorio, imagen y etiqueta explícita.
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.
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.
Runtime
Puerto
Acción
Node.js / Express
3000
WEBSITES_PORT=3000.
Python / Gunicorn
8000
WEBSITES_PORT=8000.
Java / Spring Boot
8080
WEBSITES_PORT=8080.
Contenedor en 80
80
No 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.
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.
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íntoma
Comprueba
Corrección
No queda listo
Imagen, autorización, inicio y variables.
Corregir AcrPull, red, dependencia o valor.
Conexión o 404
Puerto, enlace y ruta.
Alinear WEBSITES_PORT, 0.0.0.0 y .
Archivos desaparecen
Ruta y almacenamiento.
Usar /home o montar .
Falla estado
Ruta y código .
Igualar rutas y devolver 200 al estar listo.
Falta configuración
Portal/CLI y Kudu /Env.
Corregir nombre, ranura o permiso de .
Primer acceso lento
Tamañ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.
Crea una con /health y de prueba.
Crea grupo y ; compila una etiqueta explícita.
Crea plan Linux y aplicación web.
Habilita identidad, AcrPull y pull administrado.
Configura WEBSITES_PORT, valores, almacenamiento, y estado.
Habilita registros y observa el inicio.
Prueba host y ; valida valores no sensibles en Kudu.
Publica una etiqueta nueva, actualiza y documenta reversión.
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.
Escenario
Decisión
Motivo
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.
Un contenedor listo para producción combina implementación determinista, acceso por identidad, runtime explícito, configuración externa y observabilidad duradera.