In a world of development, we were once building large monolithic applications, capable of performing all the tasks required to do the intended job. However, as time has passed the practices of decoupling that we so often have used within the lines of code, has spread to the architecture of the application. Perhaps that is why we today see a bigger tendency to build microservice architectures.
In a microservice architecture, we gain the advantages of decoupling the application modules. This means that we can use the most appropriate tools to build the individual module. (e.g. Java backend, angular frontend, python utility module) Additionally, it also means that any failure in the system can be contained to that specific module. Ideally, a microservice application could be made from set of microservices, which run of different operating systems (OS) or systems with different prerequisites (e.g. JRE (Java Runtime Environment), Python, MySQL). These individual microservices might only communicated with each other through an agreed-on API. (e.g. http, MQTT) Whereas a monolithic application would always have the same OS as its foundation, a microservice application might have several different OS foundations. (e.g. Windows, Ubuntu, CentOS) A tool perfect of solving this issue is Docker with the addition of Docker-compose.