Docker popularized container virtualization and largely displaced previously dominant virtual machines (VM). Application containers have revolutionized how applications are built, packaged, and run because containers are a standardized software entity. They are easy to deploy wherever a corresponding container runtime exists.
In contrast to previously ubiquitous but rather heavy virtual machines, containers are lightweight. Dozens to thousands of containers can be run on a single host. This inherent advantage of container virtualization led to the proliferation of distributed microservice architectures. Instead of building a monolithic application, feature sets are split into individual components. Each component is packaged as a service in its own container. Services then communicate with each other via the network.
The micro-service approach is particularly practical for software development because it allows the most appropriate technologies to be used for each service. Instead of being tied to individual programming languages and paradigms, these can be varied. As new technologies are added, individual services can also be more easily re-implemented.
The ability to clone several similar containers from a container image improves the scalability of the overall system. In the event of higher demand, additional containers are added and the service scales horizontally. However, this requires a system that monitors the running containers and terminates them or launches new ones where needed. Incoming requests must also be distributed to the individual containers.
With scalability, the complexity of the system grows considerably. That’s why the following must be considered:
- Receiving requests via a load balancer
- Distributing tasks to the individual containers
- Monitoring state of container instances
- Terminating and launching new instances
- Establishing a network between containers
- Maintaining the containers or images with updates, etc.
All this adds up to a massive administrative overhead. Add to that the maintenance of the administrative system which will need to be monitored and updated. There should never be any noticeable loss of performance. Furthermore, the security of the entire system must be guaranteed at all times.