Microservices bring many benefits to the project, but ooooh! tricky they are, those microthings! Here is when Docker will be of great use for you. As the leading containerization platform globally, it helps you a great deal when it comes to microservice-based architecture.
So what are the real advantages of embracing the Docker philosophy and letting the platform come into your project? Read on to find out.
Senior Software Developer, Qulix Systems
Microservices bring many benefits to the project, but ooooh! tricky they are, those microthings! Docker helps a great deal when it comes to the microservice-based architecture. So, what are they, the advantages of using Docker for microservice? Read on to find out.
Microservices basics: How do they work and why choose them?
As a concept, microservices are not so difficult to understand. The definition from Martinfawler gives a pretty clear idea of what microservices are and how they work.
“The microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API”
Yet, implementing the microservices-based architecture is far easier said than done.
It has appeared as an alternative to the monolithic architectural style, where an application with all its modules was represented as a single whole. There is nothing bad about having all your modules together, under one wing, but applications have a tendency to grow insanely big. And it is when they grow big when the problems start, such as:
- poor scalability opportunities (scaling up and down specific modules is problematic in monolith due to conflicting resource requirements of the modules)
- issues with failure tolerance (due to tight coupling of the modules, failure in one module will cause ‘a domino effect’)
- brittle interdependencies between modules (minor change can have enormous costly consequences)
- lack of dynamics (if you can’t change a thing, how to move forward?)
- lack of agility (teams are not free in their tech decisions, approaches and even speed of development, as everything is interconnected)
Microservices tackle all those problems just perfectly. Yet, there are some side effects. Those are:
See the picture below to get the idea.
As you may have noticed, microservices-based architecture contains far more components than the monolithic one. All those components should function as a single whole. A pretty complex task to tackle, isn’t it?
Here I’ve also prepared an explanatory infographic for you.
In an ideal situation, in a microservices-based application every service is delivered by a separate team. That being said, if you’re planning to launch 3 microservices simultaneously, you need 3 tech teams, not one in charge of everything, like it was before with the monolithic application.
Nevertheless, even if you’re delivering all the services by effort of a single team, overhead hasn’t gone anywhere for you. As the deployment of a microservices-based system is more complicated due to the deployment of multiple components all at the same time, you need an expert to deal with it efficiently. A DevOps engineer, I mean, and DevOps is a fairly costly thing to enjoy.
If overhead is something that companies just put up with to enjoy multiple microservices benefits, complexity cannot be ignored. It must be tackled, and to do this Solomon Hykes, Docker founder, built Docker and made it open-source so that more companies could successfully manage the complexity issue.
What’s Docker and why is it used?
Now as we’re clear about how microservices work and why companies choose them, let’s turn to Docker.
What’s Docker? It’s a platform for building, running and shipping applications (Mosh, The Ultimate Docker Course). Yet, for a more profound understanding, we should now introduce the notion of a container.
A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another (Docker).
Now, what’s a Docker container? It’s a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings (Docker).
Docker containers are now often used to develop, ship and deploy microservices. Why? Because it is so much easier to deal with them!
It’s time to find out, finally, what are the advantages of using Docker with microservices.
The benefits of Docker for microservices projects
Using containers to build and deploy a microservice application made the very complex process so much easier. How did the Docker creators manage to achieve that? Read on for the answers.
Consistency and manageability
First, the Docker creators achieved a lot by introducing ultimate consistency into the development, shipping and deployment phases of the software projects.
And if you know a little (or a lot) about the software development process, a great deal of problems here occur because of inconsistencies. Especially with microservices, where each microservice can be written using its own unique set of technologies.
Say, you’re a developer who has built a microservice (or some portion of it). It works fine on your machine but it is not running on someone else’s PC. How come? Such situations are not rare and can be due a) a missing file; b) variations in software versions; c) wrong configuration settings.
As Docker automatically downloads and installs all the required dependencies in a container (=isolated environment), inconsistencies are becoming a thing of the past. That being said, what’s running OK on your PC with Docker installed on it, can as well run on anyone else’s machine with Docker on it.
Let’s consider a real-life example from Qulix Systems practices for clarity.
When a Qulix Systems team develops an application, they use Docker to launch their ready to go microservices in their development environment (=developers’ PCs). We mainly work on Windows OS, so we use Docker Desktop for Windows to run Docker on our computers. We combine Docker with Microsoft Visual Studio (which perfectly integrate together) to seamlessly run, test and improve our applications on developers’ PCs, if some errors exist.
Later on, we test our almost ready application on some company server. Here we work with Ubuntu Server with Linux OS on it. This is a native environment for Docker and the second environment in which we run our microservices-based application packaged as Docker containers.
The third environment is actually on the customer’s side. As a rule, customers choose to use cloud solutions, like Microsoft Azure AKS service, for example, to run the applications we supply to them. Those cloud services are most often powered by the K8s technology and allow the customer teams to easily run, test, scale and recover microservices, i.e. perform all the necessary container orchestration procedures.
Thus, using Docker enables you to choose literally any type of hosting. During the application development, at various stages we use multiple environments, and everything runs just perfect with Docker, applications needs no adjustments whatsoever. One and the same code can run across multiple platforms, be it a dedicated server, cloud cluster or developer’s PC with any OS on it.
Moreover, with Docker it doesn’t really matter if you have 2 or 200 microservices running on your machine. They all will be running smoothly given the machine has Docker running on it.
Furthermore, if you don’t need some container with a microservice in it anymore, just kill it (yep, that’s the term). It will be deleted with all the dependencies in seconds and will leave no traces whatsovere on your PC or laptop.
A huge advantage of microservices is that they allow using a whole array of different technologies (languages, frameworks, framework versions, etc.) within one project. Oh, it’s also a tricky thing about the microservice architecture.
Another great point of microservices is that they allow for fast development and deployment. The teams do not have to wait anymore for the others to launch a new service. But how to deploy this new service without negatively affecting the rest of the system?
Docker deals just perfectly with both above issues, as it isolates one application from another and they run happily in their own environments, built specifically for them. No more worries about techs or tempo.
Low energy consumption
One more great thing about Docker is that Docker containers are lightweight. And here we should probably mention Virtual Machines (VMs) that Docker containers are often compared to.
Why are Docker containers better than VMs? Actually, we can’t say so about technology. Often they simply serve different purposes. Just like in case with VMs and Docker containers.
VMs are an abstraction of a physical machine. In other words, they are full-sized computers running virtually inside a physical computer. A VM needs an Operating System and consumes pretty as much resources as real PCs.
In essence, a VM is the same isolated environment as a Docker container, but it is larger, more powerful and has its own Operating System. The application can run OK on it, but is it wise to have a full-sized machine all for a single application? Surely, not.
That’s why Docker containers are considered to be a more efficient option for running applications in isolated environments.
Once again, a Docker container is a light-weight isolated environment where an application runs without affecting or being affected by other environments/applications. What makes them lightweight? Containers use the OS of a host machine. Furthermore, as they don’t need an OS of their own, they are not that resource-intensive.
Thus, when using Docker containers for running microservices based applications, you can run a lot of containers on a single VM, which will be a great option in terms of resource allocation. This will come in particularly handy for those running complex systems consisting of hundreds of microservices with dozens of containers located across multiple VMs.
In this paragraph we will also compare VMs and Docker containers, but this time we’ll talk about speed of deployment.
Very briefly - as Docker containers don’t need an OS of their own, they are little speedy things, very agile and resource friendly. They allow you to deploy your application within seconds. VMs are more bulky and need more time to think (that means start up, run your application and deploy it). Pretty much as physical computers.
Docker for microservices architecture: Bottom line
In this article we shared with you why Docker containers are a great technical solution to build, run and ship microservice based applications. We also outlined briefly what microservices are and what Docker is for those who are not that familiar with these two notions.
Let’s now make a conclusion on the main topic of our article - the advantages of using Docker for microservices based applications. “Microservices + Events + Docker = A Perfect Trio” video was of great help for the perfect wording. If you skipped the long and detailed explanation above, have a look at the very concise conclusion from the video to learn about the Docker benefits for microservices architecture in just 5 lines:
That’s pretty much it!