Today we hear many popular words around us, such as Docker, containerization, Kubernetes, or microservices. What do all these terms mean?

A container is a running application with everything it needs to run. So it contains the application code along with the runtime environment and system libraries so that it can be run anywhere.

Docker is a containerization environment. Thanks to it, we can create, run, manage and transfer containers.

Kubernetes is an orchestration tool. It allows us to connect several servers with Docker, so that they behave as "one big Docker" and adds many attractive features to them.

Microservices is a type of application architecture where sub-functionalities of an application are divided into independent applications, often running in containers.

Why use these technologies? What problems do they solve?

Although many developers do not want to admit it, the left column often reflects the actual state of the developed applications. In the right column is the ideal state of how the application development should look.

Problems that many applications have

  • Long application maintenance (min. 15 years), slow or impossible changes.
  • One mistake can cripple the entire application and is complicated to find.
  • OS or environment updates can negatively affect the application.
  • Scaling up — one big server.
  • The developer has to deal with the mutual compatibility of the environments in which the application runs.
  • We need to have a specially adapted environment or code on each machine.
  • One team must cooperate on every step.
  • Complex or no documentation — complicated to teach a new programmer.
  • Monolithic application’s code snowballs.
  • Fixed technologies and their versions.
  • When updating, the entire application is modified.
  • When deploying the parallel version, a new server is required.

The requred state

  • Fast and interactive changes, deployment of new functions and technologies.
  • The error crashes only one small part, and the rest of the app works without a problem.
  • Containerization guarantees a consistent environment even after updates.
  • Scaling out - we're adding containerization.
  • We don't care where the application runs – it will always be compatible with the user’s environment.
  • The container will be the same on all devices, and so will its behaviour.
  • Separate teams/developers.
  • Sub-applications are simple and easy to understand — quick to learn.
  • Possible revolution for individual applications.
  • Freedom of choice, each part can use its own technologies and their versions independently.
  • When deploying the parallel version, a new container is sufficient.
  • Efficient use of resources and cost reduction.

Are there any disadvantages at all?

Yes, transition from traditional development environments to these modern trends will take some effort, but we will be happy to help you with this.

Diagram — a three-tier monolithic application on a physical machine or VPS x container of a three-tier application in the microservices architecture.