O que roda onde
| Serviço Azure | Equivalente local | Seu fluxo local |
|---|---|---|
| Container Apps | Docker Compose com as imagens do app | Execute seus serviços juntos, com healthchecks e portas publicadas |
| Blob Storage | Azurite | Use Blob Storage local na porta 10000 |
| Azure Functions (contêiner) | Imagem-base Functions | Execute a imagem amd64 do Functions pelo Rosetta |
| AKS | kubectl e k9s no AKS; kwok para uma API local | Compile e teste localmente, depois use kubectl e k9s no seu cluster |
Container Apps: teste os contêineres, não um simulador
Um Container App executa um ou mais contêineres com variáveis de ambiente, segredos, porta de entrada, probes e regras de escala. Os contêineres são a parte sujeita a falhas e se comportam no Mac como no Azure quando você usa a mesma imagem. Regras de escala, revisões e identidade gerenciada ficam no Azure; tudo dentro do contêiner pode ser testado localmente.
Execute os contêineres de um Azure Container App localmente com Compose e Azurite
- Descreva o app no Compose. Escreva um serviço Compose para cada contêiner do Container App (principal e sidecars), com as mesmas imagens, variáveis de ambiente, porta de entrada e probes de saúde.
- Adicione Azurite para armazenamento. Adicione um serviço de
mcr.microsoft.com/azure-storage/azuritepublicando as portas 10000 (Blob), 10001 (Queue) e 10002 (Table) e aponte a string de conexão de armazenamento do app para ele. - Fixe amd64 onde necessário. Defina
platform: linux/amd64em serviços cuja imagem não tenha build arm64, como as imagens-base Azure Functions. Elas rodam pelo Rosetta. - Inicie e aguarde. Execute
docker compose up -d --wait. Ele retorna quando todos os serviços com healthcheck estão saudáveis. - Teste e depois envie. Acesse o app em
localhost. Quando funcionar, entre comaz acr login --name REGISTRY, adicione uma tag à imagem e envie comdocker pushpara Container Apps ou 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"] A chave conhecida da conta de desenvolvimento do Azurite está na documentação da Microsoft; copie de lá. Dentro da rede Compose, o app acessa Azurite pelo nome do serviço (azurite:10000); pelo Mac, fica em localhost:10000.
Azurite no Oxcart
Azurite é o emulador de código aberto da Microsoft para Azure Storage, com Blob, Queue e Table (Table em prévia) nas portas 10000 a 10002. Iniciamos o serviço Blob e o acessamos pelo 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) 403 é a resposta correta para uma solicitação sem assinatura: o endpoint está ativo e acessível. Seu SDK, com a string de conexão de desenvolvimento, assina as solicitações.
Azure Functions em um contêiner
As imagens-base Azure Functions que testamos só oferecem build amd64, então um build comum em Mac com Apple silicon falha com “no match for platform in manifest”. Compile e execute como linux/amd64; o Oxcart usa 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 Na nossa execução, uma função acionada por HTTP respondeu em x86_64 cerca de 13 segundos após docker run, com o log do host Functions mostrando a rota mapeada e a chamada bem-sucedida. Passe --platform linux/amd64 também no docker run: uma imagem local exclusiva de amd64 só é encontrada quando a plataforma é informada. O Azure Functions Core Tools pode implantar a mesma imagem com func azurecontainerapps deploy ou func kubernetes deploy.
Envie ao 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 Compile para a arquitetura usada pelo ambiente Container Apps ou pool de nós AKS. O envio de uma imagem multiplataforma pelo Oxcart não é suportado; envie uma tag por arquitetura ou publique manifestos multi-arquitetura pelo CI.
AKS a partir do Mac
az aks get-credentials --resource-group RG --name CLUSTER adiciona o AKS ao kubeconfig para você usar kubectl e k9s pelo macOS. Desenvolva seus serviços localmente com Oxcart e implante as mesmas imagens no AKS. Para testar APIs e controllers localmente, o kwok roda no Oxcart com um plano de controle real e nós simulados. Consulte esses fluxos no guia Kubernetes no Mac.
Por que executar no Oxcart
Testar localmente só compensa se o ciclo for curto. O Oxcart registrou 42 ms para docker run --rm e 77 ms para parar e remover 20 contêineres, o mais rápido dos três ambientes testados. As conexões de saída dos contêineres são abertas pelo Mac, então uma VPN ou rota de endpoint privado para sua rede Azure também se aplica. Consulte redes de contêineres no Mac.
Perguntas
Existe um emulador local para Azure Container Apps?
Não encontramos um emulador local oficial de Container Apps na documentação da Microsoft até outubro de 2026; a Microsoft indica az containerapp up para implantar a partir do código local e Aspire para orquestração local. Um Container App é um conjunto de contêineres, então o equivalente local prático são os mesmos contêineres em um projeto Compose, com Azurite para armazenamento.
O Azurite roda em um Mac com Apple silicon?
Sim. No Oxcart, docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0 iniciou o Azurite 3.37.0, e o endpoint Blob respondeu em localhost:10000.
Posso executar Azure Functions em um contêiner no Mac?
Sim, com --platform linux/amd64. A imagem-base Python do Azure Functions que testamos (mcr.microsoft.com/azure-functions/python:4-python3.12) não tem build arm64, então um build comum falha com “no match for platform in manifest”. Compilada e executada como linux/amd64 no Oxcart, rodou pelo Rosetta e uma função acionada por HTTP respondeu em localhost.
Como envio ao Azure Container Registry pelo Mac?
Execute az acr login --name REGISTRY, depois docker tag e docker push REGISTRY.azurecr.io/app:TAG. No Oxcart, credenciais armazenadas por docker login vão para as Chaves do macOS.
Como desenvolvo para AKS no Mac?
Compile e teste seu app e suas dependências localmente com Oxcart. Conecte kubectl e k9s ao AKS com az aks get-credentials e use kwok no Oxcart para verificar manifestos em uma API Kubernetes local com nós simulados. Consulte Kubernetes no Mac.
E o emulador do Cosmos DB?
A Microsoft publica uma imagem de emulador Cosmos DB baseada em Linux (vNext, API para NoSQL). Não a testamos no Oxcart, então experimente no seu projeto durante o teste gratuito antes de depender dela.
Fontes e método
- Exemplos testados com Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Blob do Azurite 3.37.0, imagem Python 4 do Azure Functions como linux/amd64, 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 (nenhum emulador local encontrado): https://learn.microsoft.com/en-us/azure/container-apps/quickstart-code-to-cloud. Emulador Linux do Cosmos DB: https://learn.microsoft.com/en-us/azure/cosmos-db/emulator-linux. Verificados em 2026-10-10.
- Velocidade dos contêineres: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPUs e 12 GiB, medianas de cinco amostras; os outros ambientes foram medidos mais cedo no mesmo dia, no mesmo Mac e com a mesma estrutura de testes, usando o cliente docker 29.4.