What are Virtual Machines?
A virtual machine (VM) emulates a real computer that can execute programs and applications without having direct contact with any actual hardware, it is like a computer created within a computer.
VMs work by operating on top of a hypervisor, which is, in turn, is stacked up on top of either a host machine or the hardware host. A hypervisor can either be a piece of software, firmware or hardware that enables you to create and run VMs. Each VM runs its own unique guest operating system, thus enabling you to have a group of VMs sitting alongside each other, each one with its own unique operating system. Each VM carries their own virtualized hardware stack that comprises of network adapters, storage, applications, binaries, libraries and its own CPU. While VMs provides a significant benefit of being able to consolidate applications onto a single server, which puts the days of running a single application on a single server in the past, it did have its drawbacks. Each VM had its own operating system and it can be a problem when projects become large. Having multiple VMs with their owned OS added substantial overheads in terms of RAM and storage footprint and as a result, it causes issues right throughout the software development pipeline. A solution could be a container !
What is a Container?
While virtual machines virtualize a machine, a container virtualizes an entire operating system so that multiple workloads can run on a single OS instance. With VMs, the hardware is being virtualized to run multiple OS instances which slows everything down and gradually increases the total cost. To avoid all of that, containers leverage one OS, increasing deployment speed and portability while lowering costs. A container is a Linux-based application that is used to isolate a service and its dependencies into a self-contained unit that you can run in any environment. The sole purpose of containers is to promote efficient use of the allocated server space and resources, thus enabling the isolated processes to run more efficiently and quickly, while giving developers the ability to scale up or down these individual containers very easily. Containers, unlike VMs which provide hardware virtualization, provide operating-system-level virtualization. Even though containers are similar to VMs, since they have its own private space for processing, executing commands, mounting file systems, and having its own private network interface and IP address; the significant difference between containers and VMs is that containers share the host’s operating system with other containers making them more lightweight. Each container comes packaged with its own user space to enable multiple containers to run on a single host. And since the OS is shared across all the containers, the components that need to be developed from scratch are the binaries and libraries which can easily be added by a Docker image. These containers sit on top of a Docker engine, which in turn, sits on top of the host operating system. The Docker engine utilizes a Linux Kernel which allows developers to easily create containers on top of the operating system.
What is serverless computing?
Cloud computing separates application delivery from the management and ownership of infrastructure, serverless computing expands on that trend an allows Companies to turn their attention towards what is most important: the application itself. A serverless architecture allows you to write code (like Java, js, pyhton, etc.) set some simple config parameters, and then upload the package on to a cloud-based server thats owned and managed the app. Azure Function and AWS Lambda are the most popular serverless platforms. Serverless doesn’t necessarily mean that are no servers involved instead, the term serverless describes the way that organizations essentially outsource their servers instead of owning and maintaining their own.
On the bases of my experience we can make some considerationson on serverless computing and containers:
Serverless computing have some limitations, you’re subjected to pre-defined restrictions on size, memory usage and the set time to run a function, moreover there a re a limited list of natively supported programming languages. To successfully run a serverless architecture, you need to keep functions as small as possible to avoid system’s resources saturation. With the containers you are not restricted to a predefined size, memory or a set time to run a function. You can build an application as arge and complex as you like it to be while having full control over both individual containers and the overall container system via your container management software.