WHAT ARE VIRTUAL MACHINES?
In order to understand app containers, let’s have a quick run-through of their predecessors, namely Hypervisor-based Virtual Machine(VM).
Virtual Machines(VM) have been around for a while now, they are formed by the virtualization/emulation of a computer system within our physical PC. Functioning exactly like a PC, virtual machines can power up, boot shut down, reboot etc. We can even hook up peripheral devices and run them as the VM has its own BIOS or UEFI of its own.
Apart from server virtualization, VM’s have a number of use cases, some noted few in software development include –
- One can create an unlimited number of user configurations/user profiles to experiment on, with potentially incompatible applications. All on the same physical machine
- If there are any issues with the current VM, it will not affect the underlying physical machine in any way and the data can be ported to another VM to work on again
- By creating snapshots of the virtual machines, one can take the backup created on another workstation and pick up right where they left off
- During development, testers can take a snapshot of the VM during the occurrence. If a developer needs to fix the bug, the tester can simply pass on the snapshot to the developer without waiting for the developer to finish the test environment or worrying about the testing environment getting damaged
As great as it sounds, VM’s are not without disadvantages –
- Since the VM’s utilize both a copy of the OS and a virtual copy of the hardware, they end up taking a lot of RAM space and CPU cycles. This is not ideal for performance testing conditions
- Drivers used in a virtualization system may conflict the drivers used in the testing environment.
- Even though VM’s provides a high level of isolation and security, as the hypervisor handles the communication between guest and host – This approach is slower and due to the hardware emulation, and incurs significant performance overhead
Containers – App Containers & OS Containers
Now that we have a basic understanding of virtual machines, let’s move on to containers.
Firstly, containers have nothing to do with hardware virtualization.
Instead of virtualized hardware, containers are based on shared operating systems/operating system virtualization. This makes them extremely efficient in turns of resource utilization as they rest on top of a single Linux instance.
With a well-designed container, one can have nearly 6 times the server application instances on the same hardware, as compared to using a VM.
This means most of unnecessary VM junk that isn’t required, is left out and you are left with just the application in a tight little container.
Containers provide lightweight virtual environments that groups certain processes and resources(CPU, memory, disk) in a container environment, and isolates it from other containers.
By sharing the same kernel of the host system, container applications are extremely fast with little to no performance overhead as compared to VM’s.
App Containers & Docker
App containers, as compared to OS containers, are designed to contain and run a single service or application. In a world, where nearly everything can be managed via an app, Docker is leading the charge with regards to app container technologies.
Unlike an OS container where you have multiple services running on the same OS, in an app container, your application will only run on a single process.
A drawback to this would be that, unlike a Hypervisor VM, you can’t use different operating systems and kernels for each app container.
How Docker containers work(credits: Rising Stack)
- Docker container is launched which runs your application, this is done on a single process
- New layers are created for the container, every time a RUN command is issued in a Dockerfile
- These layers help reduce duplication and increased reusability. Usually done when you need different containers for different components or when you need to rollback changes
- You start with a common layer with your base image and then add layers that are specific to each component
- In the end, Docker combines the layers and additional containers to run your application
Did you know that Docker adoption by companies had increased by nearly 40% in one year?
Docker has been owning the container technology space all the way since its launch in 2014. If you belong to the IT space or cloud services, there is a good chance you’ve used it or have heard of it.
Enterprise organizations are seeking and sometimes struggling to makeand distributed in an effective, standardized, and repeatable way…..Docker Hub, Official Repos, and commercial support are helping enterprises answer this challenge by improving the way they package, deploy, and manage applications. – Jay Lyman, Senior Analyst 451 research.
In terms of app development, Docker provides instant application portability. Developers can use Docker for app containers to pack, ship and run applications almost anywhere as they are lightweight, portable and based on a self-sufficient LXC container.
Plus, and a major selling point for developers is that Docker containers are easy to deploy on the cloud. Major DevOps applications like Puppet, Chef, Ansible & Vagrant have all been incorporated with Docker. Docker aids in simplifying the tasks done by these DevOp applications.
Docker makes it possible to set up local development environments, run multiple development environments each with their own unique software, OS & configurations and test projects on different servers. All regardless of the local host environment.
THE DEMAND FOR DOCKER & APP CONTAINERS
A study by 451 Research has reported that container technologies, primarily Docker, has generated over $762 million in revenue in just 2016. 451 has predicted a compound annual growth rate of 40% by the year 2020.
A survey done on a sample size of 10,000 companies and 185 million containers by DataDog, revealed that –
- From 2015-17, Docker has raised its market share from 3% to 15% of the hosts monitored by DataDog
- By initially solving the needs of larger companies, Docker has been extremely popular for large-scale established business. However, it is now focusing on a general purpose platform for various company sizes. Which means, if you are a startup that requires an app, there is a good chance you will use Docker during development.
- Orchestrators(tools that help manage Docker containers) are becoming extremely popular. Nearly 40% of Docker adoptions use orchestrators as well. The commonly used ones being Kubernetes & Amazon ECS.
- Top technologies used with Docker include NGINX, Redis, Elasticsearch, Registry, Postgres, MySQL, etcd, Fluentd, MongoDB and RabitMQ
With regards to app development,
Docker works exceptionally well when it comes to deploying multi-component systems based on the widely recommended microservices architecture.
Your development team has the freedom to package their own application versions in a single deployable container, while your operations team can test out the container on the operating system of their choice. All with the horizontal and vertical scalability for different applications.
Ergo, you end up with a system that has multiple applications and services based on individual containers that communicate with each other via API’s and protocols.
For those who’ve made it this far, and are still confused on what Docker is
Here is a 3min clip that explains Docker, in an EXTREMELY simplified way.
Resources & Image Credits