Containers
Your app and everything it needs, packed into one portable image.
8 technologies on this page ↓How it works
A container image bundles your code with its runtime, libraries and config. When it runs, the host’s kernel isolates it into its own processes, filesystem and network. Containers share the host’s kernel instead of booting their own, so they start in seconds and use a fraction of the memory a VM needs, letting one machine run many of them.
A shipping container. The crane, the ship and the truck don’t care what’s inside, because the box is always the same shape.
Reach for it when
- Ending “works on my machine”: dev, CI and production run the same image
- Packaging services that need specific library versions
- Running many small services densely on shared machines
Think twice when
- Apps that need a different kernel or a desktop GUI
- A tiny task triggered a few times a day, where a serverless function is simpler
A real example
A data team ships a Python API as api:1.4.2. The same image runs on a developer’s laptop, in the CI test job and in production. Upgrading means publishing a new tag.
More on containers
Narrower ideas that build on this one.
Technologies
Specific products, and what each does differently.
AWS FargateAWSRuns ECS tasks and EKS pods without servers: you size each task, AWS finds the machine.
gVisorOpen sourceA Linux kernel reimplemented in Go that runs in user space, so a container’s system calls never reach the host kernel directly. AWS Fargate | Managed service on AWS | Amazon Web Services | Proprietary | 2026-10-05 |
| Commercial product | Cloudflare, Inc. | Proprietary | 2026-10-12 | |
| Open source | Docker, Inc. | Apache 2.0 (Docker Engine); Docker Desktop is proprietary | 2026-10-05 | |
| Managed service on Google Cloud | Google Cloud | Proprietary | 2026-10-05 | |
gVisor | Open source | Google (being donated to the CNCF; accepted September 2026) | Apache 2.0 | 2026-10-06 |
| Open source | Podman Container Tools, a CNCF sandbox project; started and still mostly maintained by Red Hat | Apache 2.0 (Podman and Podman Desktop alike) | 2026-10-05 |
Also used for containers
Products of other kinds that are often used this way, grouped by what they are.
Kata Containers | MicroVMs | Open source | OpenInfra Foundation (part of the Linux Foundation since July 2025) | Apache 2.0 | 2026-10-06 |
| Infrastructure as code | Commercial product | HashiCorp, an IBM company | Business Source License 1.1 since 1.10.0 (source-available, not OSI open source); MPL 2.0 before the August 2023 change | 2026-10-05 |
What each provider calls it
- AWS
- ECS, Fargate, ECR (registry)
- Google Cloud
- Cloud Run, Artifact Registry; GKE Sandbox (gVisor)
- Azure
- Container Apps, Container Registry
- Open source & others
- Docker, Podman, containerd; gVisor for a sandboxed runtime
See it in a real stack
Architectures that use containers
In code · dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]Worth exploring
lambci/docker-lambda images (since deprecated in favour of AWS’s official Lambda base images) and to Knative; read it mainly for the question, which is a common one, rather than for current tooling.Often confused with
Where it came from1979–2022
The idea of fencing a program in without giving it a whole machine goes back to 1979, when Version 7 Unix added chroot, which changes the directory a process sees as the root of the filesystem. It only hid files, though. Hosting companies wanted more: FreeBSD’s jails, released in FreeBSD 4.0 in March 2000, were sponsored by a web hosting company and aimed at providers that needed to keep their own services apart from their customers’, and they also restricted networking and visibility of other processes.
Linux built containers from separate pieces. Namespaces, starting with mount namespaces in 2002, gave a process its own view of mounts, process IDs, networks and users. In 2006 Google engineers Paul Menage and Rohit Seth started “process containers” to limit the CPU and memory a group of processes could use; renamed control groups, it was merged into Linux 2.6.24 in January 2008. LXC combined both that year.
The pieces were powerful but awkward until Docker (2013) wrapped them in a simple tool and a portable image format. The Open Container Initiative standardised that format and runtime in 2015, and orchestrators such as Kubernetes made them a mainstream way to run server software.
Why it’s built this way
- Share the host’s kernel
- Programs use the normal system call interface with nothing emulated, so a container starts as fast as a process and costs little memory. The price is that every container must run on the host’s kind of kernel, and they all trust it.
- Partition the system instead of adding fine-grained permissions
- FreeBSD’s jail designers kept Unix’s simple all-powerful root, but confined each root to its own slice of the system. Delegating a whole environment proved easier than writing detailed access rules.
- Isolation assembled from separate kernel features
- Linux added namespaces (what a process can see) and cgroups (what it can use) independently over years. That made them flexible but fiddly, which is why tools like LXC and Docker exist to combine them.
- Ship the whole filesystem as an image
- Isolation alone didn’t solve shipping software. Docker packaged the app and its libraries into a portable, layered image, which turned containers into a way to deploy software as well as a sandbox.
Timeline
- 1979
chrootappears in Version 7 Unix - 2000
FreeBSD 4.0 ships jails for shared hosting
- 2002
Linux 2.4.19 adds mount namespaces, the first namespace
- 2008
cgroups merged into Linux 2.6.24; LXC released
- 2013
Docker launches; Linux user namespaces enable unprivileged containers
- 2015
Open Container Initiative formed to standardise images and runtimes
- 2022
Kubernetes 1.24 removes its built-in Docker support
- FreeBSD manual: chroot(2), history (Version 7 AT&T UNIX)
- Kamp and Watson: Jails, confining the omnipotent root (2000)
- FreeBSD 4.0 release announcement (Mar 2000)
- LWN: Namespaces in operation, part 1 (2013)
- LWN: Process containers (2007)
- Linux manual: cgroups(7), first released in Linux 2.6.24
- Docker docs: Docker Engine security (cgroups started in 2006)
- LXC on GitHub: initial revision (Aug 2008)
- Open Container Initiative: About
- Kubernetes Blog: Kubernetes 1.24 removes dockershim (May 2022)
Sources14
- Docker docs: Docker overview
- Google Cloud: What are containers? (share the OS kernel, fraction of a VM’s memory)
- Azure docs: Container Instances overview (containers start in seconds)
- Amazon ECS docs: What is Amazon ECS?
- Amazon ECS docs: Fargate task definitions
- Amazon ECR docs: What is Amazon ECR?
- Cloud Run docs: What is Cloud Run
- Artifact Registry docs: Overview
- Azure docs: Azure Container Apps overview
- Azure docs: Azure Container Registry introduction
- Podman
- containerd
- GKE docs: About GKE Sandbox (gVisor and Kata Containers microVMs)
- gVisor docs: What is gVisor?
