The Docker Engine evolved from a monolithic binary into discrete components. Initially, the Docker Engine was a single statically-linked binary that provided the client, daemon, build tool, and registry client functionality. It has since been decomposed, with container execution handled by OCI and runc, image management by containerd, and the various components integrated together by Docker CE and Moby. This decomposition allows the components to be reused independently by other systems like Kubernetes, which uses cri-containerd to integrate with containerd and runc for container execution instead of directly integrating with Docker.
Related topics: