TLDR (Quick-Answer Box)
The decision to move from Docker Compose to Kubernetes comes down to three operational signals, not team size: deployment frequency, incident rate, and how many services now depend on each other.
Full Kubernetes isn’t the only next step. Docker Swarm and managed Kubernetes platforms resolve the same signals at less operational overhead, and the Strangler Fig pattern lets teams migrate incrementally instead of rewriting from scratch.
Summarize this post by:
A four-container Docker Compose app runs fine for months. Then one node hiccups, one container doesn’t come back up, and the whole service goes down for four minutes before anyone notices.
That’s usually the exact moment someone says the word “Kubernetes” out loud. Some teams reach for it three services too early and burn a quarter tuning a cluster nobody needed yet. Others wait until they’re running forty services with no self-healing and no rolling deploys, restarting containers by hand at 2 a.m.
Docker and Kubernetes were never competing with each other. According to CNCF‘s 2025 Annual Cloud Native Survey, 82% of container users now run Kubernetes in production, up from 66% just two years earlier.
The real question in any Kubernetes vs Docker comparison is timing. In this article, we cover 3 signals that actually decide when the second tool earns its operational overhead, how often the team deploys, what breaks after a deploy, and how many services are now talking to each other.
What Docker Actually Does (and What It Doesn’t)

Docker packages an application and its dependencies into a single portable container image. The Docker Engine runs that image the same way on any host, whether that’s a laptop, a CI runner, or a production server.
Three tools do most of the work:
- Docker Build creates the image from a Dockerfile.
- Docker Compose runs a small set of containers together on a machine, typically a web service and its database defined in a single YAML file.
- Docker Hub distributes finished images so a team doesn’t have to rebuild what already exists.
A typical Compose setup defines a web service and a database in one file and starts both with a single command on either a developer’s laptop or a server.
Docker was never built to keep that container running correctly across multiple machines, restart it cleanly after a crash, or route traffic to a healthy replica. It’s outside the job Docker was designed to do.
What Kubernetes Adds That Docker Can’t

Kubernetes is a control plane that schedules containers across a cluster of nodes. It continuously checks what’s actually running against what a team declared should be running. The same reconciliation principle GitOps tooling extends further up the deployment pipeline.
The value that Kubernetes adds on top of Docker includes:
- Self-healing restarts and reschedules failed containers automatically.
- Horizontal autoscaling adds or removes container replicas based on rules a team sets in advance.
- Service discovery and load balancing route traffic between containers without anyone hand-managing IP addresses.
- Rolling updates and rollbacks roll out changes gradually, with an automatic rollback if something breaks.
For example, you have a web service and database from Docker. Under Kubernetes, both run as several replicas spread across multiple nodes. If one node goes down, the control plane reschedules the affected containers onto healthy nodes without a person touching anything.
That said, Kubernetes doesn’t replace what Docker does. Docker still builds the image. Kubernetes replaces what Docker Compose does. It runs that image reliably once one host and one crash aren’t the only variables anymore. It doesn’t even use Docker’s own runtime to do that job today.
Kubernetes vs Docker: The Difference at a Glance
Here’s the difference in one table if you want the answer before the reasoning behind it.
| Docker | Kubernetes | |
| Primary job | Builds and packages containers | Orchestrates containers across a cluster |
| Scope | Single host | Multi-host cluster |
| Scaling | Manual, or via Docker Swarm | Automatic, based on declared rules |
| Self-healing | None built in | Restarts and reschedules automatically |
| Networking | Basic bridge networking | Built-in service discovery and load balancing |
| Typical use | Local development, CI/CD builds | Production deployment at scale |
Docker and Kubernetes aren’t answering the same question. Docker answers how to package an application. Kubernetes answers how to keep hundreds of copies of it running.
Why Kubernetes Doesn’t Need Docker’s Runtime Anymore
That answer stopped depending on Docker’s own runtime a while ago. Kubernetes announced it would drop native Docker support in 2020, in version 1.20, and completed the removal in version 1.24 in 2022. The truth is it never needed Docker to function. It only ever needed a container runtime that speaks the standard Container Runtime Interface, or CRI.
Docker-built images are compliant with the Open Container Initiative (OCI) image format, so none of that changed how they run. Kubernetes now schedules those images through containerd or CRI-O directly instead of going through Docker’s own daemon first.
The practical effect for a team is close to zero. Dockerfiles still work. The docker build command still works. Existing images still run unchanged on a modern Kubernetes cluster, container runtime and all.
The Real Signals You’ve Outgrown Docker Compose
None of that runtime plumbing has any bearing on whether a team should adopt Kubernetes in the first place. That decision isn’t a headcount milestone. It’s when three specific operational signals show up together:
Deployment Frequency: When Restarts Start Causing Outages
At low service counts, a restart affected one thing, so deploy frequency was manageable. Once a dozen services depend on each other, the same restart affects all of them at once. A team shipping multiple times a day or week starts to notice that a docker compose up restart causes a visible outage instead of a quiet blip.
Incident Rate: When On-Call Is Doing Kubernetes’s Job by Hand
The second signal shows up at 2 a.m., not in a planning meeting. When engineers manually restart crashed containers, or manually track which host still has capacity. That’s a sign the system isn’t healing itself. Kubernetes’s self-healing exists specifically to remove that manual step. It reschedules a failed container automatically, without paging anyone.
Service Count: When Manual Service Discovery Breaks Down
The third signal is structural. Once an application has grown past a small number of services, hand-managed service discovery turns into a routine source of production errors. In practice, that means hardcoded hostnames and ports scattered across config files. Every new service adds another place that you have to update correctly, by hand, forever.
None of these signals are about team size. Team-size charts are the most common shortcut used to answer this question, and they’re the wrong shortcut. A five-person team running twelve tightly coupled services can hit all three signals faster than a thirty-person team running four independent ones.
The useful version is “did two or more of these three signals show up in the same month?” When they do, that’s the trigger. When they don’t, adding a control plane and a cluster to manage is solving a problem the team doesn’t have yet, and that overhead isn’t free.
Docker Swarm vs. Managed Kubernetes vs. Self-Run Kubernetes
Not every team that outgrows plain Docker Compose needs full Kubernetes, the same way not every application needs microservices in the first place. Docker Swarm or a managed container platform can resolve the same three signals at a fraction of the operational overhead.
| Docker Swarm | Managed Kubernetes (e.g. AKS, EKS, GKE) | Self-run Kubernetes | |
| Toolchain | Same Docker CLI a team already knows | Kubernetes API, cloud provider’s control plane | Kubernetes API, self-managed control plane |
| Setup complexity | Low | Moderate | High |
| Self-healing | Built in | Built in | Built in |
| Who runs the control plane | The team, but there’s little to run | The cloud provider | The team |
| Best fit | Teams that want resilience without a new toolchain | Teams that want Kubernetes’s features without staffing a platform team | Teams with specific compliance or infrastructure requirements that need full control |
Docker Swarm ships built-in load balancing and multi-node clustering using the same Docker CLI. For a team that wants resilience against node failure without adopting Kubernetes’s full complexity, Swarm covers real ground.
Managed container platforms take a different approach. They absorb the Kubernetes control plane entirely. That trades some configuration flexibility for a much smaller operational footprint. A team benefits from the self-healing and autoscaling without staffing a team to run the cluster underneath it.
Docker Swarm is Docker’s own answer to orchestration, not a lesser stepping stone toward Kubernetes. Docker has kept it maintained rather than actively adding new features to it, but that doesn’t make it a waypoint. It’s a legitimate destination for teams whose scale doesn’t yet justify Kubernetes’s full complexity. Plenty of production systems run on it indefinitely without ever needing to migrate further. The decision isn’t Kubernetes or nothing. It’s matching the tool to where the three signals actually point.
Strangler Fig Migration: How Docker-to-Kubernetes Actually Works
Once the signals do point to Kubernetes, the next question is how to get there without freezing everything else your team is shipping. Moving from Docker Compose to Kubernetes doesn’t require rebuilding an application from scratch. The Strangler Fig pattern lets you containerize and migrate services incrementally, one at a time, behind an API gateway, rather than committing to a single high-risk cutover.
The migration follows the same four steps regardless of application size:
- Put an API gateway in front of the existing application. The gateway routes every request. Nothing about the current system changes yet.
- Pick the service with the clearest boundary and the least shared state. This is the one that proves the pattern works without risking anything critical.
- Extract, containerize, and deploy that service to Kubernetes. The gateway now routes that one service’s traffic to the new environment while everything else still runs on the old system.
- Repeat service by service until the old system has nothing left to do. Each step is small enough to roll back on its own if something breaks.
This is the approach behind our Enterprise Platform Modernization work: refactoring legacy monoliths into cloud-native microservices using the Strangler Fig pattern, built on Docker, Kubernetes, and API gateway tooling.
The point of the pattern is to make this transition incremental instead of a rewrite. A team keeps shipping features on the old system while the new one grows around it, service by service, until the old system has nothing left to do.
That incremental structure matters more than it sounds. A full rewrite forces a team to freeze feature work on the old system while the new one catches up. It also concentrates all of the migration risk into a single release. Strangler Fig spreads that risk across many small releases instead, each one small enough to roll back on its own if something goes wrong.
Kubernetes in Production: What It Looks Like at Regulated Scale

We built Seneca’s ESG scoring and reporting platform on Azure Kubernetes Service. The platform processes data from more than 50 sources to meet EU SFDR (Sustainable Finance Disclosure Regulation) and CSRD (Corporate Sustainability Reporting Directive) compliance requirements. The platform runs automated ETL pipelines that pull ESG data from regulatory databases, corporate filings, and news APIs, then applies rules-based and machine-learning-enhanced scoring across environmental, social, and governance dimensions. The entire system must remain auditable by regulators.
This is a platform built on Kubernetes from the start, not one migrated onto it. It’s evidence that Kubernetes holds up under real compliance and audit requirements in production.
| Metric | Result |
| Review throughput | 3x the manual process it replaced |
| Data sources integrated | 50+, into automated pipelines |
| MVP delivery | 8 weeks |
| Full production launch | 14 weeks |
| Assessment cadence | Real-time scoring, replacing quarterly manual assessments |
| Regulatory reporting | SFDR- and CSRD-aligned reports generated automatically instead of assembled by hand each quarter |
Running 50-plus data integrations reliably needs the self-healing and declarative configuration Kubernetes provides. The system also has to produce a working audit trail for regulators. That’s what “regulated scale” means for microservices in practice running under compliance requirements. Not a bigger number, but a system that has to keep working correctly even when a component fails, because a compliance report can’t just be late.
Building and operating that kind of environment is what our product engineering practice does day to day. We run Kubernetes production to the same standard the compliance work itself demands, rather than adding monitoring after an incident forces the question.
The Bottom Line
Docker and Kubernetes were never rivals. They solve different problems at different scales, and the only decision that actually matters is when the second one earns its operational overhead. That call comes down to deployment frequency, incident rate, and service count, not team size and not a feature-comparison table.
The fastest way to find out where a team actually stands is to track those three signals for a single sprint before deciding anything. If two or more show up together, that’s the answer. If they don’t, Kubernetes can wait, and Docker Compose or Docker Swarm will keep doing the job just fine.
Ready to Build Your Next Product?
Start with a 30-min discovery call. We'll map your technical landscape and recommend an engineering approach.
Contact usFrequently Asked Questions
No. Kubernetes announced it would drop Docker as its own container runtime in 2020, in version 1.20, and completed the removal in version 1.24 in 2022. Docker-built images are OCI-compliant and still run on Kubernetes today through containerd.
Get Industrial Insights Delivered to Your Inbox
By clicking "Subscribe" you agree to allow Eastgate Software to send newsletter emails to your address. For more information, please read our Privacy Policy.
About The Author
CEO & Founder, Eastgate Software
Ha Bui is the CEO and Founder of Eastgate Software. Since 2014, he has led the company's 12+ year engineering partnerships with Siemens Mobility and Yunex Traffic, building a 200+ engineer organization that delivers mission-critical ITS, FinTech, and enterprise software to German engineering standards.