Custom Containers vs Serverless Computing
Custom containers give you control and predictable cost at scale; serverless gives you speed-to-ship and zero idle bill. The right pick depends on traffic shape, not vibes — and one of these wins for most teams starting out.
The short answer
Serverless Computing over Custom Containers for most cases. For most teams, the operational tax of running containers — patching base images, tuning autoscalers, paying for idle capacity, owning the 3am pager — buys.
- Pick Custom Containers if run sustained high-utilization traffic, need full control over the runtime and networking, have workloads that exceed serverless timeouts, or your cloud bill is dominated by per-invocation pricing at scale
- Pick Serverless Computing if shipping a new product, have spiky or unpredictable traffic, want to pay nothing for idle, and would rather your engineers write features than babysit autoscalers and patch base images
- Also consider: Container-as-serverless hybrids like AWS Fargate, Google Cloud Run, and Azure Container Apps — they let you ship a container without owning a cluster, which is the right answer more often than either purist camp admits.
— Nice Pick, opinionated tool recommendations
What you're actually choosing between
Custom containers mean you package your app into an image and run it on infrastructure you provision and scale — EC2, a Kubernetes cluster, ECS. You own the runtime, the OS patches, the autoscaling policy, and the idle capacity you pay for whether or not anyone shows up. Serverless means you hand a function or a request handler to the platform and it runs your code on demand, scaling from zero to thousands and back, billing per invocation and execution time. The honest framing: containers are control plus responsibility; serverless is convenience plus constraints. Everyone pretends this is a religious war. It isn't. It's a question of where your traffic lives on the utilization curve and how much operational surface you want to own. Pick based on that, not on what trended on Hacker News last week.
Cost: idle is the silent killer
Containers bill for provisioned capacity. That box runs at 3am when nobody's awake, and you pay for it. At low or spiky utilization, you're renting an empty restaurant. Serverless bills per request and execution time — zero traffic, zero bill — which is brutal in your favor for new products, internal tools, and bursty workloads. The plot twist everyone discovers too late: at sustained high volume, serverless per-invocation pricing crosses over and gets expensive, sometimes dramatically. A service pinned at 70% CPU 24/7 is cheaper on a reserved container than on Lambda, full stop. So the rule is unglamorous: serverless wins below the crossover, containers win above it. If you can't say where your crossover is, you're serverless — because you haven't earned the container bill yet.
Operations: who owns the pager
This is where containers quietly bleed money that never shows up on the cloud invoice. Someone patches the base image. Someone tunes the horizontal pod autoscaler. Someone debugs why the cluster OOM-killed a pod at 2am. Kubernetes is a full-time job wearing a YAML costume, and pretending otherwise is how startups burn two engineers on infrastructure that serves four customers. Serverless deletes most of that surface — no servers to patch, no autoscaler to tune, scaling and availability are the platform's problem. You trade it for cold starts, execution timeouts, and vendor-shaped runtime limits. That's a real trade, not a free lunch. But for a small team, the operational tax of containers is the single most underpriced line item in the decision, and it almost always favors going serverless until headcount and scale justify owning the floor.
Constraints and lock-in: read the fine print
Serverless wins on convenience by handing you a box you can't fully open. Cold starts add latency on the first request after idle — fine for an API, fatal for a latency-SLA trading path. Execution timeouts (often around 15 minutes) make long-running jobs a non-starter. You inherit the platform's language runtimes, memory ceilings, and networking model. Containers give you all of that back: any runtime, any timeout, custom networking, GPUs, persistent connections, your choice of base image. The lock-in story is more even than the purists claim — a Dockerfile is portable across clouds, while a function wired to a specific event model is stickier. But don't overweight portability you'll never exercise. Most teams never migrate clouds. Pick for the constraint that will actually bite you: if cold starts or timeouts break your use case, that's your decisive reason to run containers — and a good one.
Quick Comparison
| Factor | Custom Containers | Serverless Computing |
|---|---|---|
| Cost at low/spiky traffic | Pay for idle provisioned capacity 24/7 | Scales to zero — no traffic, no bill |
| Cost at sustained high utilization | Reserved capacity is cheaper past the crossover | Per-invocation pricing gets expensive at volume |
| Operational burden | You own patching, autoscaling, the cluster, the pager | Platform owns scaling, availability, and host patching |
| Runtime control & long jobs | Any runtime, no timeout, custom networking, GPUs | Cold starts, ~15min timeout, platform-shaped limits |
| Speed to ship a new product | Stand up infra, autoscaler, CI/CD before feature one | Deploy a handler and go; infra is the platform's job |
The Verdict
Use Custom Containers if: You run sustained high-utilization traffic, need full control over the runtime and networking, have workloads that exceed serverless timeouts, or your cloud bill is dominated by per-invocation pricing at scale.
Use Serverless Computing if: You're shipping a new product, have spiky or unpredictable traffic, want to pay nothing for idle, and would rather your engineers write features than babysit autoscalers and patch base images.
Consider: Container-as-serverless hybrids like AWS Fargate, Google Cloud Run, and Azure Container Apps — they let you ship a container without owning a cluster, which is the right answer more often than either purist camp admits.
Custom Containers vs Serverless Computing: FAQ
Is Custom Containers or Serverless Computing better?
Serverless Computing is the Nice Pick. For most teams, the operational tax of running containers — patching base images, tuning autoscalers, paying for idle capacity, owning the 3am pager — buys nothing a serverless platform doesn't already give you for free. Serverless wins until you have a measured reason to leave it: sustained high utilization, sub-50ms cold-start intolerance, or a long-running workload that laughs at a 15-minute timeout. Start serverless, graduate to containers when the bill or the constraints force your hand. Defaulting to Kubernetes on day one is resume-driven development, not engineering.
When should you use Custom Containers?
You run sustained high-utilization traffic, need full control over the runtime and networking, have workloads that exceed serverless timeouts, or your cloud bill is dominated by per-invocation pricing at scale.
When should you use Serverless Computing?
You're shipping a new product, have spiky or unpredictable traffic, want to pay nothing for idle, and would rather your engineers write features than babysit autoscalers and patch base images.
What's the main difference between Custom Containers and Serverless Computing?
Custom containers give you control and predictable cost at scale; serverless gives you speed-to-ship and zero idle bill. The right pick depends on traffic shape, not vibes — and one of these wins for most teams starting out.
How do Custom Containers and Serverless Computing compare on cost at low/spiky traffic?
Custom Containers: Pay for idle provisioned capacity 24/7. Serverless Computing: Scales to zero — no traffic, no bill. Serverless Computing wins here.
Are there alternatives to consider beyond Custom Containers and Serverless Computing?
Container-as-serverless hybrids like AWS Fargate, Google Cloud Run, and Azure Container Apps — they let you ship a container without owning a cluster, which is the right answer more often than either purist camp admits.
For most teams, the operational tax of running containers — patching base images, tuning autoscalers, paying for idle capacity, owning the 3am pager — buys nothing a serverless platform doesn't already give you for free. Serverless wins until you have a measured reason to leave it: sustained high utilization, sub-50ms cold-start intolerance, or a long-running workload that laughs at a 15-minute timeout. Start serverless, graduate to containers when the bill or the constraints force your hand. Defaulting to Kubernetes on day one is resume-driven development, not engineering.
Related Comparisons
Disagree? nice@nicepick.dev