Docker's Second Death
Feels Like Forever
Perhaps not quite forever, but the history with Docker feels really long in good and bad ways. I had joined Red Hat in the summer of 2015, the same summer that OpenShift 3.0 went GA. This was a remarkable event because it marked a redesign of the platform onto Kubernetes which itself had just gone to v1.0 (this is the same timeframe that GKE went GA, if you can believe it’s that old). Like many, I had no clue what Kubernetes or OpenShift were, and I definitely didn’t know much about Docker. I knew of containers. By fall I was neck deep in all three, and in love with the ecosystem a few months after.
The next spring was my first “real” encounter with Docker Inc. I didn’t attend Red Hat Summit 2016, but I distinctly remember that being the year that Docker really made its first outward antagonistic move against Red Hat OpenShift, at Red Hat’s own event. They were giving out the following shirt:
To briefly summarize, this was an attack on Red Hat’s model of backporting patches to older versions of software (also known as “enterprise support”). Red Hat at that time shipped a version of Docker that was just slightly behind the latest cut, whereas Docker shipped their latest. I won’t go into the details of why that matters because there is still a debate today about whether backporting patches is better for an organization versus staying on the latest version of a thing (the latter has gotten considerably better in recent times). This was significant because up until that time, Docker was an integral part of the OpenShift narrative. We sold one with the other and the underlying assumption by most if not all of us was that Docker was just a great tech. In retrospect, this should have been expected as Docker Inc. started making its moves into the enterprise space and suddenly stopped being just great tech.
It Was Inevitable
The early platform wars, as I call them, were primarily focused around OpenShift, Docker, and Pivotal. Pivotal had made significant inroads into enterprise organizations early on, and for good reason: the platform experience was pretty great. Couple that with Pivotal Labs and you had some pretty good mojo. Docker was the up and comer. It was the industry darling making a splash and it had the tech that everyone wanted or that everyone was already using. Kubernetes was still a bit of a question mark. I spent a lot of my time talking to organizations about the nuts and bolts of Kubernetes and why it mattered, or more accurately: why it should matter to them. The move by Docker to knock on OpenShift forced Red Hat messaging to over-index on Kubernetes and Linux over and above anything else. It worked and the industry caught up.
Docker, still in its industry darling state, responded quickly with Docker Swarm but never really caught on. Swarm was eventually overwhelmed (pun intended) by the uptake of Kubernetes across the industry, and this was when it died the first time: it lost the platform wars and became the very first commodity in the cloud native ecosystem. The second half of 2016 is really when Kubernetes edged out Swarm. This was made evident by the keynote demo at DockerCon 2017 in the following Spring when the presenters showcased Docker’s integration with Kubernetes on the big stage. Notably, that was the last “big” DockerCon that made a splash. From there on out, it was the Kubernetes/CNCF show.
In all this time, Docker was always an integral part of Kubernetes. This was the relationship:
And for the last 19 releases, that chain is what has been supported in Kubernetes. All that just to spin up a pod with a container in it. Docker went from necessity to technical debt. And out of all that, the community laboured until now where Docker will be deprecated in the next release of 1.20. The community has (rightfully) carried the technical debt of Docker for years to ensure the industry had what it needed for the most seamless experience given the ubiquity of the docker daemon. Here is what’s been around for a little while, but will be officially prime time in 1.20 and beyond:
It’s a great simplification, and a return to consistency. To help visualize why this was necessary, I encourage you to view Docker as a platform abstraction on top of containers which are just an aggregate of some Linux constructs. Part of this abstraction involved an integration between the docker platform and containerd, the latter of which lives on today as arguably the most popular container runtime. Docker was never the runtime. Docker simply made containerd and other Linux constructs easy to work with so that container management would be a breeze. Instead of a dozen lines of code to create and deploy a running container, all you needed was:
But like any platform, that convenience comes with a lot of bloat and technical debt. Especially over time. The removal of docker and the optimization of containerd marks a cultural shift of sorts for the cloud native landscape. None of this is meant to dismiss Docker Inc. Kubernetes today would not be where it is without Docker Inc. That’s a fact. The technologies and the competition that Docker Inc drove were some of the best things to ever happen to the industry. Now as far as turning a profitable business model out of open source technology goes, Docker Inc will likely be studied as a cautionary flash in the pan. Still, it’s important that we separate out the company’s contributions versus its business model. What’s left of the Docker platform, at this point, are its shadows within Kubernetes platforms. Though it does live on strongly within CI/CD ecosystems and, ostensibly, the inner loop of development thanks to the de facto standard Dockerfile. It is a testament to the power that Docker Inc once had, that its technology lived on far beyond the obsolescence of the company until community innovation caught up to it. With all the years of bloat baked into the platform, it’s really just a matter of time before other areas to the left of the platform shed the debt of the Docker daemon.
While it had an amazing journey and an indelible impact to the industry, practically speaking Docker is dead and dying.