Preface
We have been fiddling with virtualization techniques and tools for quite a long time now
in order to establish the much-demanded software portability. The inhibiting
dependency factor between software and hardware needs to be decimated by leveraging
virtualization, a kind of beneficial abstraction, through an additional layer of
indirection. The idea is to run any software on any hardware. This is achieved by
creating multiple virtual machines (VMs) out of a single physical server, with each VM
having its own operating system (OS). Through this isolation, which is enacted through
automated tools and controlled resource sharing, heterogeneous applications are
accommodated in a physical machine.
With virtualization, IT infrastructures become open, programmable, remotely
monitorable, manageable, and maintainable. Business workloads can be hosted in
appropriately-sized virtual machines and delivered to the outside world, ensuring
broader and more frequent utilization. On the other hand, for high-performance
applications, virtual machines across multiple physical machines can be readily
identified and rapidly combined to guarantee any kind of high-performance requirement.
The virtualization paradigm has its own drawbacks. Because of the verbosity and
bloatedness (every VM carries its own operating system), VM provisioning typically
takes a while, the performance goes down due to excessive usage of computational
resources, and so on. Furthermore, the growing need for portability is not fully met by
virtualization. Hypervisor software from different vendors comes in the way of ensuring
application portability. Differences in the OS and application distributions, versions,
editions, and patches hinder smooth portability. Computer virtualization has flourished,
whereas the other, closely associated concepts of network and storage virtualization are
just taking off. Building distributed applications through VM interactions invites and
involves some practical difficulties.
Let's move on to containerization. All of these barriers contribute to the unprecedented
success of the idea of containerization. A container generally contains an application,
and all of the application's libraries, binaries, and other dependencies are stuffed
together to be presented as a comprehensive, yet compact, entity for the outside world.
Containers are exceptionally lightweight, highly portable, easily and quickly
provisionable, and so on. Docker containers achieve native system performance. The
greatly articulated DevOps goal gets fully fulfilled through application containers. As
best practice, it is recommended that every container hosts one application or service.