Skip to content

engineering

Docker architecture for CI engineers

Daemon, containerd, BuildKit and the snapshotter — what each one does, and which one is making your build slow.

Tomás Rivera · Performance engineering · 2026-04-21 · 10 min read

Most Docker performance advice is a list of Dockerfile tricks. It works better if you know which component each trick is actually addressing.

The pieces

ComponentResponsibilityWhere it shows up in CI
dockerdAPI, networking, orchestration of the restDaemon startup cost on a cold runner
containerdContainer lifecycle and image managementImage pull and unpack time
snapshotterFilesystem layers on diskLayer extraction — heavily disk-bound
BuildKitExecutes the build graphEverything about build parallelism and caching
runcActually starts the processRarely the bottleneck

Which one is slow

  • Slow before any step runs → daemon start and image pull; fix with a warm runner and a pull-through cache
  • Slow during COPY and RUN with high I/O wait → the snapshotter on network-attached disk; fix with local NVMe
  • Rebuilding layers that did not change → BuildKit cache; fix instruction order and cache backend
  • arm64 catastrophically slow → QEMU, not Docker; fix with native runners

Your next build could be twice as fast, at half the price

Start free. Migrating away is the same one line, and we publish that diff too.