Docker allows developers to use standard linux command-line skills to assemble and package what are essentially chrooted/jailed applications. Once the application instructions are set in the Dockerfile, it can then be uploaded to a remote server so it can be easily passed around to other machines.
In practice, the main use case for many companies is to use docker to package Ruby, Node or Python applications along with all of their module and OS library dependencies. This allows multiple applications to run on the same physical machine without conflicting with each other.