Analysis of Docker Hub top-100k popular images (March 2026): median size 245 MB (up from 180 MB in 2020), p95 = 890 MB. Alpine remains #1 base for Node/Python/Go (37% share), distroless growing (Google-backed, 12% share). Multi-stage builds used in 61% of production Dockerfiles. Common issues: layered package install without cleanup (apt cache), bundled dev dependencies.
Below: key findings, platform breakdown, implications, methodology, FAQ.
| Metric | Pass/Value | Median | p75 |
|---|---|---|---|
| Median image size (top-100k) | 245 MB | 245 | 410 |
| P95 image size | 890 MB | 890 | — |
| Alpine base share | 37% | — | — |
| Distroless base share | 12% | — | — |
| Ubuntu/Debian full base | 29% | — | — |
| Multi-stage builds | 61% | — | — |
| CVEs in Alpine base (median) | 3 | 3 | 8 |
| Images with dev tools in prod | 18% | — | — |
| Platform | Share | Detail | — |
|---|---|---|---|
| Node.js apps | 22% | median: 380 MB | — |
| Python apps | 18% | median: 620 MB | — |
| Go apps | 15% | median: 45 MB | — |
| Java apps (JDK) | 12% | median: 520 MB | — |
| nginx/apache | 8% | median: 140 MB | — |
| Database containers | 10% | median: 410 MB | — |
Scanned Docker Hub API + large GHCR repos. 100k most-pulled images. Size = uncompressed total. Base classification via FROM parsing. March 2026.
Alpine (5MB base) — has shell + package manager. Distroless (0MB tools) — only runtime. Distroless is safer, debugging harder (no shell).
FROM node:20 AS build → npm build. FROM node:20-alpine → COPY --from=build /app/dist. Final image 50 MB instead of 1 GB.
musl libc reliability lower than glibc for some Python libs. Regular security updates via apk. CVEs patched within 1-7 days.
<code>docker images | grep myapp</code> + <code>dive myapp:latest</code> for layer analysis. Dive shows wasted space.