Quick Thoughts on DockerCon 2016
More than 4,000 people descended on Seattle for DockerCon 2016 this past week. I wasn’t one of them this time, but like in years past the conference wasn’t short on industry-rattling announcements, so it’s worthwhile to assess the state of the container ecosystem, even if from afar.
While the last several years have been defined by friendly(ish) coopetition between platforms — Docker, Kubernetes, Mesos, CoreOS, etc. — in a few years’ time we may look back to DockerCon 2016 as a turning point.
2016 itself has been marked by the production-ization of container infrastructure. We’ve seen and heard war stories from startups and enterprises alike as they shift to microservices-oriented architectures in earnest and move containerized applications into prod. Not coincidently the rhetoric has shifted away from containerization to orchestration, that is: “now that we’ve Dockerized our services, built our images and composed our application, how do we operationalize and scale it?”
Appropriately, the major news coming out of DockerCon this year was that container orchestration is now being bundled into the Docker 1.12 core. This implies that you can now start a replicated, distributed, load-balanced service on a swarm of Docker Engines with less than a handful of commands. By natively integrating Swarm into Docker core, any instance of Docker can now easily join a distributed cluster and any developer can easily manage deployment, scaling and load-balancing across containers.
In conjunction, Docker released a new application format called Distributed Application Bundle that describes the “full application stack” across images, networks and routing. This is to say that Docker is making it remarkably easy to not only to run individual containers, but also define portable application services and manage the lifecycle of those application services using containers.
Finally, in bundling Swarm in Docker core, Docker killed Swarm’s dependency on external config stores like Consul or etcd by pulling the Raft consensus implementation out of etcd and integrating it directly into the SwarmKit code. Any developer can now deploy, run and scale self-healing, self-organizing clusters of services in a few keystrokes, without any external dependencies to Docker. Indeed, all you need to run distributed applications now is Docker.
For developers this is surely a win and will go a long way to accelerate software development leveraging containers. For distributed systems purists, however, these new announcements have to be more than a bit disconcerting, and highlight an issue raised by CoreOS in December 2014 when they announced rkt, an alternative to Docker Engine. Back then, CoreOS CEO Alex Polvi wrote:
“When Docker was first introduced to us in early 2013, the idea of a “standard container” was striking and immediately attractive: a simple component, a composable unit, that could be used in a variety of systems… Unfortunately, a simple re-usable component is not how things are playing out. Docker now is building tools for launching cloud servers, systems for clustering, and a wide range of functions: building images, running images, uploading, downloading, and eventually even overlay networking, all compiled into one monolithic binary running primarily as root on your server.”
Though Docker continues to play nice with the ecosystem in spirit and tout the “batteries included but swappable” mantra, the company is unmistakably doubling down on DX (developer experience) as its weapon to combat competition. By incorporating package management, deployment, configuration, consensus, scheduling, etc. into a single binary — Docker makes the lives of devs markedly simpler. But that simplicity comes with costs: alienating ecosystem members and threatening customers with lock-in.
All this ultimately makes strategic sense: Docker’s core competency is making infrastructure approachable and consumable for devs, not necessarily building complex, feature-rich distributed systems. And with Kubernetes being the talk of the town all of 2016, Docker played the card it had to try and level the playing field.
Your move Kubernetes.