Qué se ejecuta y dónde
| Servicio Azure | Equivalente local | Tu flujo de trabajo local |
|---|---|---|
| Container Apps | Docker Compose con las imágenes de la app | Ejecutar tus servicios juntos con comprobaciones de salud y puertos publicados |
| Blob Storage | Azurite | Usar Blob Storage local en el puerto 10000 |
| Azure Functions (contenedor) | Imagen base de Functions | Ejecutar la imagen amd64 de Functions mediante Rosetta |
| AKS | kubectl y k9s contra AKS; kwok para una API local | Compilar y probar en local, después usar kubectl y k9s con tu clúster |
Container Apps: prueba los contenedores, no un simulador
Una Container App ejecuta uno o varios contenedores con variables de entorno, secretos, un puerto de entrada, sondas y reglas de escalado. Los contenedores son la parte que puede fallar, y se comportan igual en tu Mac que en Azure cuando ejecutas la misma imagen. Las reglas de escalado, revisiones e identidad administrada se quedan en Azure; todo lo que hay dentro del contenedor puedes probarlo en local.
Ejecutar en local los contenedores de una Azure Container App con Compose y Azurite
- Describe la app en Compose. Escribe un servicio Compose por contenedor de tu Container App (el principal y los sidecars), con las mismas imágenes, variables de entorno, puerto de entrada y sondas de salud.
- Añade Azurite para almacenamiento. Añade un servicio de
mcr.microsoft.com/azure-storage/azuriteque publique los puertos 10000 (Blob), 10001 (Queue) y 10002 (Table), y dirige hacia él la cadena de conexión de almacenamiento de la app. - Fija amd64 donde sea necesario. Establece
platform: linux/amd64en cualquier servicio cuya imagen no tenga compilación arm64, como las imágenes base de Azure Functions. Se ejecutará mediante Rosetta. - Inicia y espera. Ejecuta
docker compose up -d --wait. Termina cuando todos los servicios con comprobación de salud están saludables. - Prueba y después envía. Llama a la app en
localhost. Cuando funcione, inicia sesión conaz acr login --name REGISTRY, etiqueta la imagen y envíala condocker pushpara Container Apps o AKS.
services:
web:
image: myregistry.azurecr.io/web:2.1.0
environment:
AZURE_STORAGE_CONNECTION_STRING: >-
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=REPLACE_WITH_AZURITE_DEV_KEY;BlobEndpoint=http://azurite:10000/devstoreaccount1;
ports: ["8080:8080"]
depends_on: [azurite]
azurite:
image: mcr.microsoft.com/azure-storage/azurite
ports: ["10000:10000", "10001:10001", "10002:10002"] La clave conocida de la cuenta de desarrollo de Azurite está en la documentación de Azurite de Microsoft; cópiala desde allí. Dentro de la red Compose, la app llega a Azurite por el nombre de servicio (azurite:10000), y desde tu Mac está en localhost:10000.
Azurite en Oxcart
Azurite es el emulador de código abierto de Azure Storage de Microsoft, con Blob, Queue y Table (Table en versión preliminar) en los puertos 10000 a 10002. Iniciamos el servicio Blob y lo llamamos desde el Mac:
docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite \
azurite-blob --blobHost 0.0.0.0
curl -i "http://127.0.0.1:10000/devstoreaccount1?comp=list"
# 403 AuthorizationFailure, Server: Azurite-Blob/3.37.0 (expected for an unsigned request) El código 403 es la respuesta correcta a una solicitud sin firma: el endpoint está activo y es accesible. Tu SDK, con la cadena de conexión de desarrollo, firma sus solicitudes.
Azure Functions en un contenedor
Las imágenes base de Azure Functions que probamos solo publican una compilación amd64, así que una compilación normal en un Mac con chip de Apple falla con «no match for platform in manifest». Compílalas y ejecútalas como linux/amd64; Oxcart las ejecuta mediante Rosetta:
# Dockerfile
FROM mcr.microsoft.com/azure-functions/python:4-python3.12
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
AzureWebJobsFeatureFlags=EnableWorkerIndexing
COPY . /home/site/wwwroot
docker build --platform linux/amd64 -t my-func .
docker run -d --platform linux/amd64 -p 7071:80 my-func
curl localhost:7071/api/hello En nuestra ejecución, una función activada por HTTP respondió desde x86_64 unos 13 segundos después de docker run, y el registro del host de Functions mostró la ruta asignada y la llamada correcta. Pasa también --platform linux/amd64 a docker run: una imagen local solo para amd64 únicamente se encuentra cuando se indica la plataforma. Azure Functions Core Tools puede desplegar después la misma imagen con func azurecontainerapps deploy o func kubernetes deploy.
Enviar a Azure Container Registry
az acr login --name myregistry
docker buildx build --platform linux/amd64 --load -t myregistry.azurecr.io/web:2.1.0 .
docker push myregistry.azurecr.io/web:2.1.0 Compila para la arquitectura que use tu entorno Container Apps o tu grupo de nodos AKS. No se admite enviar una imagen multiplataforma desde Oxcart, así que envía una etiqueta por arquitectura o publica manifiestos multi-arquitectura desde la CI.
AKS desde tu Mac
az aks get-credentials --resource-group RG --name CLUSTER añade AKS a tu kubeconfig para que puedas usar kubectl y k9s desde macOS. Desarrolla tus servicios en local con Oxcart y despliega las mismas imágenes en AKS. Para probar API y controladores en local, kwok se ejecuta en Oxcart con un plano de control real y nodos simulados. Consulta estos flujos de trabajo en la guía de Kubernetes en Mac.
Por qué ejecutarlo en Oxcart
Las pruebas locales solo compensan si el ciclo es corto. Oxcart registró 42 ms para docker run --rm y 77 ms para detener y eliminar 20 contenedores, los mejores resultados de los tres entornos que probamos. Tu Mac abre las conexiones salientes de los contenedores, así que una VPN o una ruta a un endpoint privado de tu red Azure también se aplica a ellas. Consulta Redes de contenedores en Mac.
Preguntas
¿Existe un emulador local de Azure Container Apps?
No encontramos un emulador local oficial de Container Apps en la documentación de Microsoft a octubre de 2026; Microsoft remite a az containerapp up para desplegar desde código fuente local y a Aspire para la orquestación local. Una Container App es un conjunto de contenedores, así que su equivalente local práctico son los mismos contenedores en un proyecto Compose, con Azurite para almacenamiento.
¿Azurite funciona en un Mac con chip de Apple?
Sí. En Oxcart, docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0 inició Azurite 3.37.0 y su endpoint Blob respondió en localhost:10000.
¿Puedo ejecutar Azure Functions en un contenedor en Mac?
Sí, con --platform linux/amd64. La imagen base de Python de Azure Functions que probamos (mcr.microsoft.com/azure-functions/python:4-python3.12) no tiene compilación arm64, así que una compilación normal falla con «no match for platform in manifest». Compilada y ejecutada como linux/amd64 en Oxcart, funcionó mediante Rosetta y una función activada por HTTP respondió en localhost.
¿Cómo envío imágenes a Azure Container Registry desde un Mac?
Ejecuta az acr login --name REGISTRY, después docker tag y docker push REGISTRY.azurecr.io/app:TAG. En Oxcart, las credenciales guardadas mediante docker login van al Llavero de macOS.
¿Cómo desarrollo para AKS en mi Mac?
Compila y prueba tu app y sus dependencias en local con Oxcart. Conecta kubectl y k9s a AKS con az aks get-credentials y usa kwok en Oxcart para comprobar manifiestos contra una API Kubernetes local con nodos simulados. Consulta Kubernetes en Mac.
¿Y el emulador de Cosmos DB?
Microsoft publica una imagen del emulador de Cosmos DB basada en Linux (vNext, API para NoSQL). No la hemos probado en Oxcart, así que pruébala con tu proyecto durante el periodo gratuito antes de depender de ella.
Fuentes y método
- Ejemplos probados con Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Blob de Azurite 3.37.0, imagen Python 4 de Azure Functions como linux/amd64 y Compose).
- Azurite: https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite. Azure Functions Core Tools: https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local. Container Apps (no se encontró emulador local): https://learn.microsoft.com/en-us/azure/container-apps/quickstart-code-to-cloud. Emulador Linux de Cosmos DB: https://learn.microsoft.com/en-us/azure/cosmos-db/emulator-linux. Comprobado el 2026-10-10.
- Velocidad de los contenedores: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU y 12 GiB, medianas de cinco muestras; los otros entornos se midieron antes ese mismo día en el mismo Mac, con el mismo sistema de medición y el cliente docker 29.4.