Introducing orchestrators
In the previous section, we saw how we can use the capabilities of Docker to easily package our application as a container image and run it. If we push our image to a Docker registry, then it becomes simple to pull and run that application from any machine with Docker installed. Larger systems, however, are made up of many such components and we will likely want to distribute these across a number of Docker hosts. This allows us to adapt to a changing load on the system by increasing or decreasing the number of instances of a component container that are running. The way to get these features with a containerized system is to use an orchestrator. Orchestrators provide other features, such as automatically restarting failed containers, running containers on a different host if a host fails, and a stable way to communicate with containers as they potentially restart and move between hosts.
There are a number of container orchestrators, such as Kubernetes...