Docker has become synonymous with containers. However, Docker is just one tool that you can use to build images and run them as containers. There are a few alternatives that are gaining popularity. Let's explore what they are and why some in the industry are looking to run their applications as containers without the use of Docker.
As the popularity of containers started to grow, a variety of other tools started to emerge to provide capabilities beyond what was provided by Docker. A community was formed that started the Open Container Initiative (OCI) that defines a specification for building images and running them as containers. This standard ensures that images built by any build tool that complies with OCI should be able to run in any runtime that complies to OCI. In fact, the build specification is actually Docker's original image format that they open-sourced (along with the tools to build images and run containers).
Since the OCI is just a specification on how to build an image there are a few open-source projects that provide this capability:
- BuildKit (https://github.com/moby/buildkit)
- Buildah (https://github.com/containers/buildah)
- Podman (https://github.com/containers/podman)
These open-source projects can process instructions from a Dockerfile and build a OCI compliant image. They offer some additional features not provided by Docker that deal with performance improvements to build times, optimizing memory and caching and many more. They also do not require a daemon process to be continually running to work, unlike Docker.
Similar to leveraging the OCI specification to have a common build format there is other software that utilizes the common specification to provide a runtime for running images as containers. Some common open source projects that implement the OCI Runtime Specification are:
In fact, Firecracker was developed by Amazon and it is what powers their AWS Lambda and AWS Fargate services.
As the popularity of Kubernetes started to grow there was a desire to de-couple it from the Docker Runtime Engine. The Container Runtime Interface (CRI) was created to also provide a standardized specification for container runtime software. This allows for orchestration software to have the ability change what container runtime it uses without the need to recompile or be re-installed. Something called a "shim" can be created that provides an abstraction between the orchestration software and the container runtime.
There are many other examples out there of image build or container runtime software that are not Docker. There are also many articles that debate the pros and cons of switching either to, or away from Docker. Not all use cases are the same so not every tool will be the right solution. Feel free to take a look at the alternatives and judge for yourself, keeping in mind that containers does not also mean Docker.