Docker provides a mechanism to easily manage a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.
Containers running on a single machine all share the same operating system kernel so they start instantly and make more efficient use of RAM. Images are constructed from layered filesystems so they can share common files, making disk usage and image downloads much more efficient.
Compared to other virtualisation techniques such as VirtualBox (Vagrant), docker is able to better reuse common libraries between running containers, significantly reducing the memory and disk pressures on your machines, but also greatly improving the startup/shutdown times. A typical docker container can start in seconds compared to minutes for a VirtualBox machine.
Docker containers are portable and lightweight, allowing for deliveries to live servers to take a new form facter - the bundled container rather than a series of install steps which may change depending on the environment. Using Docker, it becomes possible to create a development container, and pass it through a validation lifecycle, promoting the container into production but never having to ‘rebuild’ or modify the container as it goes. What gets built at the start, gets deployed to live as many times as required for scale.