For a long time, web applications have been deployed directly on bare metal servers. To run a web application, you had to rent a server, install an operating system, then run your application on top of it.
This was time consuming, dependency management was complicated and it was almost impossible to distribute the resources efficiently if you had more than one application. Virtual machines improved this situation by allowing developers to run different operating systems on top of the same hardware and to distribute the resources in a better way. A physical server can host many isolated virtual machines running on their own operating systems and allocate them different resources. Virtual machines abstract the hardware – but they still require you to install one operating system per application. More recently, another technology has emerged: Linux containers. They allow the developers to run many isolated applications inside the same operating system.
Linux containers abstract the operating system. Two years ago, they were made much easier to use by Docker:
Click here to try docker directly in your browser.
Since then, other projects have been developed to allow developers to run containers seamlessly on top of a cluster of machines.
And finally, another nice project that I discovered recently, resin.io
Other useful links
Sources of the images
[Nicolas is a Senior Full-Stack Developer at SuperAwesome]