Skip to content
CAMPUX Cloud Bootcamp
Field notes · Compute
ACI vs Container Apps

Azure Container Instances vs Container Apps: Which Should You Use?

By Captain O7 min read

Two Azure services run your container without a cluster, and the names are close enough to blur together. They solve different problems. One runs a container; the other runs a container as a service. Which you pick comes down to whether the work ends.

New to cloud? CAMPUX is a free, build-first course. Start here →

Use Azure Container Instances (ACI) when you need to run a container for a one-shot job, and use Azure Container Apps when you need to run a container as a long-lived, scaling service. That one line settles most of these decisions. ACI takes an image and runs it — no orchestrator, no scaling logic, no ingress rules to think about. Container Apps takes the same image and wraps it in a serverless platform that scales it with traffic, splits requests across versions, and drops to zero when nobody is using it. If you keep that split in mind, the rest of this note is just detail.

Container Instances for one-off/burst jobs, Container Apps for scaling services, AKS when you outgrow both.You have a container.what shape is the workload?One-off / burst joba task, a batch run→ Container InstancesScaling serviceHTTP, scale-to-zero, revisions→ Container Appsneed full cluster control? → outgrow both into AKS
Figure 9 — Match the tool to the shape of the work. A short-lived or bursty job wants Container Instances — start it, it runs, it stops. A long-running service that needs ingress, revisions, and scale-to-zero wants Container Apps. Reach for AKS only when you genuinely need to run the cluster yourself.

What ACI is: the simplest way to run a container

Azure Container Instances is the most direct answer to "I have an image, run it." Microsoft describes it as a way to run containers in a managed, serverless environment "without having to set up VMs, clusters, or orchestrators." You give it an image, a vCPU and memory request, and it starts a container group — one container, or a few that share a network and lifecycle. There is no autoscaler, no load balancer distributing traffic across replicas, no concept of a rolling release. It runs your container until you stop it or the process exits.

That plainness is the point. ACI starts quickly, bills per second, and gets out of your way. It fits work with a clear shape: a batch job that processes a file and stops, a scheduled task, a build or CI step that needs an isolated container, a short data-processing run, or a single helper container sitting next to something bigger. When the work is finite, you do not want an orchestrator — you want a container that runs and then stops charging you.

What Container Apps is: a serverless container service

Azure Container Apps takes the same container and treats it as a running service that needs to survive real traffic. It is a managed platform built on Kubernetes, and it hands you the pieces you would otherwise wire up by hand on a cluster: KEDA for event-driven autoscaling, Dapr for microservice APIs like service invocation and pub/sub, and Envoy for ingress and traffic routing. You get all of that declaratively, without managing nodes or writing Kubernetes YAML.

The features that come with that framing are the ones a service actually needs:

None of that exists in ACI. If you tried to build a scaling web API on ACI, you would end up assembling a load balancer, a scaler, and a release process yourself — which is exactly the work Container Apps already did.

ACI answers "run this container." Container Apps answers "keep this service running well as traffic moves." Different questions, and the wrong answer costs you either features or money.

Scaling: burst jobs versus scale-to-zero services

Scaling is where the two split most cleanly. ACI does not autoscale. A container group has a fixed size, and it runs until it finishes. You can start many container groups at once for parallel batch work — spin up fifty, let them each chew through a slice, let them exit — but that is you orchestrating burst capacity, not the platform reacting to demand. It suits jobs whose size you know in advance.

Container Apps scales for you. KEDA watches a trigger — request rate, queue length, a metric — and moves the replica count up as load rises and back down as it falls, including all the way to zero. A web service built on it costs almost nothing when idle, because at zero replicas there is no running instance to bill for, and it grows to meet a traffic spike without you touching anything. That is the behavior you want for an HTTP service with uneven traffic: cheap when quiet, elastic when busy.

So the scaling question maps straight onto the workload. Known, finite, parallel work you kick off yourself points at ACI. Continuous or bursty traffic that the platform should absorb points at Container Apps.

Cost model differences

The billing models follow the same logic. ACI bills per second for the vCPU and memory you request, rounded per the container group, for as long as it runs. There is no idle tier and no minimum footprint — a job that runs for ninety seconds is billed for roughly ninety seconds and then costs nothing. That makes ACI predictable and cheap for short, finite work, and expensive if you leave a container group running around the clock as a pseudo-service.

Container Apps offers two plans. The Consumption plan bills for the resources your replicas actually use while active and charges nothing for compute when the app is scaled to zero, which is what makes an intermittent service inexpensive. The Dedicated plan (workload profiles) gives you reserved compute — including larger or GPU-backed profiles and features like private networking — for workloads that run steadily or need guaranteed capacity, billed for the provisioned profile rather than per request. Many teams mix them: Consumption for the bursty front door, Dedicated where they need a floor.

The rule of thumb: for a job, ACI's per-second meter is usually the cheaper and simpler choice. For a service with uneven traffic, Container Apps on Consumption tends to win because it falls to zero between requests instead of holding a box open.

ACI vs Container Apps — at a glance
 Azure Container InstancesAzure Container Apps
OrchestrationNone — runs a single container groupManaged, built on Kubernetes + KEDA + Dapr + Envoy
AutoscaleNo — fixed size, you start groups yourselfYes — KEDA on HTTP, queue, CPU, or custom metrics
Scale-to-zeroNo — runs until stopped or the process exitsYes — scales to zero replicas when idle
Ingress / traffic splitPublic IP or DNS name; no built-in traffic splittingBuilt-in HTTPS ingress with percentage traffic splitting
RevisionsNo versioning — redeploy replaces the containerImmutable revisions for rollback and blue-green
Best forOne-shot jobs, batch, scheduled tasks, helper containersLong-running web services, APIs, event-driven microservices
BillingPer second on requested vCPU + memoryConsumption (per active usage, zero when idle) or Dedicated (reserved profiles)

The gap: when the real answer is AKS or App Service

Both services deliberately hide Kubernetes from you, and sometimes that is the wrong trade. If your team needs the raw Kubernetes API — custom operators, service meshes, node-level tuning, specific CNI or GPU scheduling — then Container Apps is too abstracted and you want Azure Kubernetes Service (AKS). AKS gives you the whole cluster and the whole responsibility that comes with it.

The other direction is worth naming too. If your workload is a plain web app or API and it is not even containerized, you may not need a container platform at all — App Service hosts code directly with slots, autoscale, and managed TLS. And if the work is short and event-triggered rather than a running service, Azure Functions is a closer fit than either container service. The honest version of this decision is a small ladder: Functions for event snippets, ACI for one-shot containers, Container Apps for scaling container services, AKS when you truly need the cluster, App Service when it is just a web app. Wherever your image comes from, keep it in Azure Container Registry so every one of these can pull it.

The one-line test

Ask whether the work ends. If it runs, does something, and stops — a job, a batch, a task — that is ACI. If it stays up and serves requests that rise and fall — a web app, an API, a queue worker — that is Container Apps. When you catch yourself keeping an ACI container group running to act as a service, that is the signal you already outgrew ACI and should move to Container Apps.

Questions people also ask

What is the difference between Azure Container Instances and Container Apps?

Azure Container Instances runs a single container or container group on demand, with no orchestrator and no built-in autoscaling. Container Apps runs a container as a managed service, with KEDA autoscaling, scale-to-zero, revisions, and HTTP ingress with traffic splitting. Use ACI for a one-shot job or a fixed helper container; use Container Apps for a service that needs to scale with traffic.

Can Azure Container Apps scale to zero?

Yes. Container Apps can scale in to zero replicas when there is no traffic and scale back out on demand, powered by KEDA. When an app is scaled to zero on the Consumption plan you are not charged for running instances, only for any minimums you set. ACI has no scale-to-zero; a container group runs until you stop or delete it.

Is Container Apps built on Kubernetes?

Yes. Azure Container Apps runs on top of Kubernetes, using KEDA for event-driven autoscaling, Dapr for microservice APIs, and Envoy for ingress and traffic splitting. You get those pieces without managing the cluster, the nodes, or any YAML. If you need direct access to the Kubernetes API, you want AKS instead.

When should I use ACI instead of Container Apps?

Use ACI when the work has a clear end or a fixed shape: a batch job, a build step, a scheduled task, a short data-processing run, or a single helper container that does not need to scale. ACI starts fast, bills per second, and stops when the work is done. If the workload is a long-running web service or API that should scale with traffic, use Container Apps.

Which is cheaper, ACI or Container Apps?

It depends on the shape of the work. ACI bills per second for the vCPU and memory you request, so a short job that runs and stops is cheap and predictable. Container Apps on the Consumption plan bills for active usage and can scale to zero between requests, so an intermittent service costs little when idle. For a job, ACI is usually cheaper; for a bursty service, Container Apps often wins because it drops to zero.

Further reading — the Microsoft docs
Your next class · free
You've read the idea. Class 1 — What is Cloud? is where you build it, hands-on — no account needed.Start Class 1 →
Captain O
Founder & instructor · CAMPUX Cloud Engineering Bootcamp
Drilled in the CAMPUX bootcamp. Back to all field notes →