Containers vs. Virtual Machines: Another Perspective

Software containers are all the rage these days. For good reasons, they bring many benefits and may push forward the revision of entire software stacks developed in-house. Containers are at the base of the cloud-native phenomenon, bringing many benefits to IT systems. However, the emphasis put on container technologies and the “cloud native way” may make you forget that it’s all made possible by the underlying layers of IT systems — hardware and the hypervisor.
This isn’t to say that the adopters and proponents of containers are misguided. Rather, there tends to be a lack of clarity regarding which technology suits a specific purpose and what customers get billed for.
As I’m about to explain, there is no opposition between containers and virtual machines. Rather, it is more about the realization that oftentimes, containerizing applications implicitly rely on virtualizing the system on which the containers will run. Of course, the perception is very different. For years, the IT industry has relied on virtualization to manage application layers across organizations. Now containers have disrupted the application management market — with good reason, I might add.
Does this mean that the IT industry was wrong all those years? No, because application management using systems virtualization (i.e., server virtualization) is an effective solution in several cases. If applications are complex and rely on data and software dependencies that may not be directly tied to the application in the IT infrastructure, containers might not be able to meet the requirements of complex applicative architectures. Containers will provide the application portability and management but will not bring an effective solution to the environment in which the application is running. On the other hand, virtual machines will deliver a fully portable and manageable environment — in other words, a fully virtualized system.
Complex systems in which containers and container pods run tend to require virtualization. Despite what can be read in the official documentation of container technologies, containers can run on bare metal only if the system is simple enough. As soon as a complex environment is required, which tends to be the large majority of enterprise deployments, containers will run in an essentially virtualized environment. This may mean that containers are running directly on top of virtual machines or that containers are running inside large and complex environments that are themselves entirely virtualized.
The question then is: Why have we come to see the two technologies at odds? The main reason is practical: For years, virtual machines have been used to handle application management, something they can do but is not the best at. Containers excel at the task of managing applications. However, as soon as data streams and a handful of applications running across different operating systems work together, containers will only be part of the answer. The broader part is with virtual machines. Therein lies the crux of the story: There is no true opposition between containers and virtual machines; they are mostly complimentary.
Building Blocks of the Hybrid Cloud
In reality, there is not a massive adoption of containers to the detriment of hypervisors. Rather, the current state of the market suggests three use cases that are either distinct from one another or may sometimes be observed happening at the same time:
- IT teams have just finished the deployment and skills acquisition of a fully virtualized environment.
- IT teams are starting to use containers for testing or specific use cases, such as containerizing web applications or mail servers, thereby adding one more separation layer between the applications and the operating system. These containers run on an operating system, which is itself running on virtual machines, for portability and scalability.
- In a smaller number of cases, companies producing and consuming lots of code that moved to a full cloud environment (public or private) are now going “cloud native.” This involves a lot of containerizing of applications, while the virtualization layer runs just between the software platform and the bare metal.
Virtual machines and containers work together in each case to provide IT operations with efficient architectures and workloads. There is no opposition but rather a co-dependence. The real difference ultimately lies in the requirements and the use case. Systems management and complex environments will emphasize virtualization, while application management will rely more on containers.