How often have you heard the catchphrase “Works on my computer”? Well, this actually is quite a common part of software development stating the situation when an app starts behaving unexpectedly. It is because the real production environment conditions vary from development & staging ones. This is quite a common and widespread situation, owing to the huge variety of hardware configurations, OS’s, software versions & the other variables all across the app sphere of usage. At times, this results in the end users facing some unexpected bugs, and this leads the mobile app developers to pay much more efforts in reproducing and fixing them. The way to solve this issue is for developers to create development environments that are identical to the production ones. Thus, the app behaves the same in production, development, staging, and testing.
Now, in order to enable this kind of functionality, there are two prominent DevOps tools – Docker & Vagrant. Despite acting identically, there are quite a few differences between the two and in this article, we will be shedding the light on it all. Meanwhile, in the case of Docker, it literally took the software development industry by the storm and it changed the way software programs are created. On the other hand, Vagrant is still one viable option. So, here let’s understand the two:
What is Vagrant?
This open-source software product & tool is to build and configure the virtual environment of development and is designed for running on top of virtually any Virtual Machine (VM) tool – VMWare, VirtualBox, AWS, and more. As Vagrant is a VM, it allows you to integrate Vagrant with CM tools, like Salt, Puppet and Chef. In fact, Vagrant + VirtualBox are among the most commonly used combination.
What is Docker?
This software automates the deployment & management of applications in a virtualization environment at the operating system level. This allows to ‘package’ an app with all of its environment & dependencies into a container that is easily transferred to any of the Linux systems with the support for the control groups in kernels and it provides a container management environment as well.
Put simply, Docker and Vagrant just mean virtualization with the varying degrees of this virtualization. Like, Docker is a means of virtualization at the kernel level, whereas Vagrant is a lot like full virtualization.
What is Docker Container?
Well, Docker Containers are ready applications created from the Docker images or it can be said that Docker container is a running example of Docker image and it holds entire package required for running an application. This certainly is the ultimate utility of Docker. Meanwhile, Docker image is easily defined as Docker template that is needed for creating Docker containers. The Docker images are building blocks of a container and they are created with the use of build command.
It is a Docker registry, where the docker images get stored. Now, a registry can either be local repository as a Docker hub, where the multiple users collaborate to build an application. In fact, here multiple teams can also share/exchange containers within the same organizations uploading them to Docker hub, which is Docker’s own repository, just like GitHub. Furthermore, the Docker architecture is interesting too, arranging multiple components together and it helps in simplifying overall Docker functionality.
Similarities of Vagrant and Docker
In actual, Vagrant + VirtualBox and Docker offer the same functionality, like:
- A virtual machine with just one root procedure: Docker
- Distributed images of these virtual machines
- The ability to save, uploading, and downloading a snapshot of the virtual environment/machine
- The ability to start/stopping composition of the virtual environment/machines
- Ability of organizing internal network of the virtual environment/machines
- Ability of mounting the host directories inside virtualized machine or environment
- Ability of transferring ports of the virtual machine to host
Usability: As compared to Vagrant, the architecture of Docker is difficult to understand. Instead, Vagrant is quite easier to understand, get up and run.
Supported: You can use Docker not just to Linux, but also on macOS and Windows Office, and Vagrant is also available for same operating systems.
Virtualization Type: Docker and Vagrant have different kinds of virtualization, while Docker is virtual environment tool, Vagrant is more related to the virtual machines.
Size & Speed: In case of Vagrant, it has this sophisticated working problem, where it works only with full virtualization, no matter what we use, for instance, Hyper-V or Virtual Box. Vagrant is again a full-virtualization, in case of including the virtualization of hardware. Thus, it is large in size and heavy to run. It is also said that it’s difficult to be used for integration when it is launched in Production.
Docker is based on par virtualization. This, in fact, performs the same tasks & roles as Vagrant, just once in Linux, and has an advantage in speed & size. Meanwhile, if the program used by you is large, and you require creating different containers for various versions of the program, then disk space acquires up to 5-6 GB immediately. Also, Docker starts up pretty instantly as here you don’t require initializing the system and container only needs to run binary specified for it by entry point. Meanwhile, in the case of Vagrant, a minimum of 5-7 GB is usually spent on just one container. Thus, it appears that Docker is faster in usage and more convenient in the size.
Comparing Vagrant and Docker for Development
In the case of Docker and Vagrant, they both can provide virtualized development environments, however, their approach to the problem is very different. Here we have compared Vagrant and Docker to offer a better understanding of which one of them works well to enable software development.
Docker is easy to launch on any prominent software development operating systems. In case of Vagrant, it can run on any of the host operating systems sans any limitation, still, after it exits the development & testing environments, the application must run over host machines in the staging & production, where multiple inconsistencies may arise.
Vagrant virtual machine needs to be launched upon existing host operating systems, thus they cost a certain amount of resources in order to sustain. Docker refutes requirement for hypervisor and whole of virtualization level, as here the containers can run directly on three most prominent operating systems, i.e. MacOS, Windows, and Linux. This way there is a huge rise in resource consumption efficiency – a host running containers results in 300% increased efficiency when compared to running virtual machines.
Speed of launch
With the Docker containers running in separate code packages, they can be easily launched in less than a minute sans affecting work of the other system components. Whereas a Vagrant virtual machine needs to be entirely rebooted in order to launch the application anew and all of the running applications must be restarted then.
With Docker containers using the kernel of the system they are running on (whether it is Windows, Linux or MacOS kernel), there is a chance that the malicious code running within the container may affect the other containers on the machine and host operating system. Add built-in security checks to the container in order to mitigate this risk.
In the case of Vagrant, developers need to ensure the security of virtual machines themselves, by installing & configuring any firewalls that are considered important.
Scopes of Isolation
Vagrant from HashiCorp is one solution enabling quick configuration & provisioning of the virtual machines (VMs) helpful for isolating the application in its own developmental environment. These virtual machines work on the top of real hardware servers but they emulate virtual infrastructure required by the developer – starting from OS to all the way down to the libraries & binaries of required software and it ensures that the app works in the same manner despite underlying software and hardware, as long as it is running in the Virtual Machine.
Meanwhile, Docker is one open source platform allowing isolation of the apps within the code containers similar to the Linux Containers, though Docker moved from LXC to containers for enabling industry-wide standardization. Rather than creating a virtual computer on real hardware, a Docker container is a code package with everything required to run app code inside. Even though a single container is created for running a single application, one Vagrant virtual machine can run multiple interacting applications at once. Meanwhile, for the Docker containers, this can be possible with the use of Kunernetes & docker-compose command.
Usually, the containers weigh quite a few dozens of MBs and multiple containers with separate applications running on a single virtual machine.
Final Note: Even though it is not too common, still Vagrant and Docker can perform together like in some cases Docker uses Vagrant or even Docker is often used as a provider with Vagrant. Now, on the usage of Vagrant and Docker, well it would be better to put it as its usage depends entirely on how you want to use it and what you are most comfortable working with.
Do let us know which one of the two you think will be more beneficial for your working style?