Exploring the World of Containers: Docker, Kubernetes and Beyond

Merve Günak
DataPebbles
Published in
7 min readMay 6, 2024
Green Pheasant on Pine Branch, by Utagawa Hiroshige, 1830–1844

Introduction

Welcome to a journey into the world of containers, where we will talk about Docker, virtual machines (VMs), Kubernetes and orchestration. If you have taken your seats, let’s get started.

At the center of everything are physical machines, i.e. tangible entities, that provide the computing resources to manifest our digital desires. Think of these as the solid ground on which our virtual efforts stand. What about virtual machines (VMs)? They are like digital twins of physical machines running on the hypervisor layer. Each VM creates its own share of CPU, memory and storage, replicating the functionality of an advanced machine.

I hope this article will be a guide to understanding its complexities and the mechanism behind it as we delve deeper into this journey.

Containers: The Game Changer

But here’s where things get interesting: containers. Think of them as these lightweight, portable packages that contain everything your application needs to run smoothly. Unlike VMs, which carry their own mini-operating systems, containers share the host operating system’s core, making them super-efficient.

Containers encapsulate not just your app, but also its dependencies, libraries, and settings. This means you can run your application anywhere without worrying about compatibility issues. It’s like having your lunch packed in a neat, spill-proof box that you can take with you wherever you go.

Containerization existed long before docker was invented. What Docker basically does is present this in a user-friendly API. Docker make it easy to use.

It is important to remember that containers are not physical entities, but rather virtualized environments that contain and run applications seamlessly. This virtualization offers unparalleled flexibility and efficiency, revolutionizing the software development, deployment and management landscape.

Docker is emerging as a major player taking containerization to new heights with its robust toolset. Docker streamlines the development workflow by empowering developers to effortlessly build, deploy, and manage containerized applications.

So let’s delve deeper into the world of Docker.

Docker and its Components

You may have heard of the classic “it works on my machine” scenario, where deployment issues arise due to inconsistent environments.

This is where Docker comes in, providing a solution by providing consistent and portable containers that facilitate deployment processes.

Picture this: Encapsulating your applications and dependencies into portable, self-contained units that can run seamlessly in any environment. This is Docker’s trick. It allows you to run your applications consistently without compatibility issue.

At its core, Docker consists of Dockerfiles, Docker Containers, and Docker Images. These components allow developers to effortlessly build, run, and manage containerized applications.

Docker’s platform isolates applications from the underlying system, allowing multiple applications to run on the same machine without conflict. It eliminates manual dependency installations and simplifies deployment processes, making it ideal for web development.

Virtual Machines vs. Containers

Now, let’s take a step back and compare virtual machines (VMs) with containers. It also helps you understand the concept and logic better.

VM’s vs Containers, choose your side

A comparison between virtual machines (VMs) and containers reveals fundamental differences in architecture and functionality. While VMs emulate entire operating systems on a hypervisor layer, containers leverage the host operating system’s resources, resulting in lighter, more efficient deployments. Containers, with their faster startup times and lower resource consumption, offer a compelling alternative to the resource-intensive nature of VM.

This fundamental difference in architecture makes containers more lightweight and efficient compared to VMs. While VMs require significant overhead due to emulation of entire hardware environments, containers run more directly on the host system, resulting in faster startup times and lower resource consumption.

And containers are very fast, their creation are cheaper than VMs.

So, VMs and containers represent two different paradigms for deploying applications. VMs offer full isolation and compatibility but come with higher resource load. Containers, on the other hand, provide lightweight, portable environments that share resources with the host operating system, making them ideal for modern application deployment. Understanding these differences is crucial to navigating the modern software development environment.

Docker revolutionizes application deployment by providing self-sufficient containers that streamline the development, testing, and production processes. These containers, defined by configuration files, eliminate the “it works on my machine” dilemma, ensuring consistent performance from development to production.

LXC, Docker Contaiers, VMs

Kubernetes: The Captain of Container Orchestration

one captain rule them all

Now, where does Kubernetes come into play? Think of Kubernetes as an orchestra conductor that aligns the various elements of your cloud infrastructure to work in sync. Just as an orchestra conductor directs musicians to produce a beautiful piece of music, Kubernetes coordinates containers, storage, scaling mechanisms, and network services to bring your application to life.

Kubernetes is just an orchestrator.

From a technical perspective, Kubernetes acts as a centralized management system, enabling seamless deployment, scaling and management of containerized applications.

Kubernetes consists of several components that work together to facilitate container orchestration. For example, the kubelet agent runs on each node in the Kubernetes cluster, ensuring that pods are created, scheduled, and maintained according to the desired state. The kube-proxy component enables network communication between pods and external services, while the kube-scheduler optimally distributes workloads among available nodes.

A Simple Kubernetes Architecture

Without going too deep, let’s examine the two important components of Kubernetes and their functions.

Pods: Your Basic Building Blocks

Let’s talk about pods. Think of pods as your basic building blocks in the Kubernetes world. They’re like little bundles of joy that house one or more containers, kind of like roommates sharing an apartment.

Interestingly, the term “pod” is derived from the sci-fi concept of a space capsule, signifying its role in encapsulating containers.

So why are pods necessary? Well, imagine that you manage a video streaming service that requires both a media server and a caching system. Instead of running these elements separately in their own containers, Kubernetes says, “Let’s put them in the same pod!” This arrangement facilitates seamless communication between them, allowing seamless sharing of resources such as storage space.

So pods are not just random groupings; They are strategic clusters of containers that cooperate harmoniously. When you ask Kubernetes to deploy something, it’s usually about deploying pods, not individual containers. This is like saying to your friend, “Hey, let’s host a meeting at my house” instead of sending individual invitations to each guest.

Each pod in Kubernetes has a unique IP address; this allows direct communication between pods without the need to make each container available separately. This increases efficiency and security within the cluster.

The Kubelet — Agent of Kubernetes

You can think of Kubelet as an agent of Kubernetes. It acts as a tireless intermediary across all servers and all workers. It’s like having a multitasking assistant on each server that has the ability to adapt to different environments.

So what does the kubelet actually do? It’s like a nosy messenger constantly checking the Kubernetes API server. It’s always asking the question: “Hey, do I have a pod assigned to me? Is there something I need to take care of?”

This is where it gets interesting: Imagine the scheduler makes a decision and assigns a specific worker, let’s call it worker 1. Worker 1’s kubelet immediately jumps into action and checks the API server to see if there is a pod waiting for it. If there is, it’s like saying, “Okay, I’ll handle it. Let’s make it work here.”

So how does kubelet manage to run these containers? kubelet doesn’t actually know how to run containers. Docker, like Containerd and even Podman, is based on what we call Container Runtime. So, when it comes time to run a container, the kubelet instructs the runtime to do the job.

Kubelet is essentially the unsung hero of Kubernetes; It manages containers seamlessly and keeps your cluster running smoothly.

When we talk about Kubernetes components, there is actually a lot to tell such as Controller Manager, Schedular, etcd etc.. We can talk about the details of these in another article. For now, let’s continue our article.

Kubernetes simplifies container management by controlling the container lifecycle, scaling, and networking tasks. It automatically replaces faulty containers to maintain uninterrupted operation and allows external communication when necessary. In software deployment, Kubernetes ensures consistency and reliability across diverse environments, freeing developers from the complexity of infrastructure management so they can focus on defining the desired state of their applications.

Alternative tools for orchestration include Docker Swarm, Docker Compose, Mesos, Nomad, and OpenShift. Each has its own strengths and weaknesses that suit different use cases and needs.

Conclusion

In this dive into the world of containers, we took a bird’s eye journey through the fundamentals of modern software development. From the beginnings of containers as lightweight, portable packages that revolutionized application delivery, to the orchestration prowess of Kubernetes that seamlessly aligns cloud infrastructure components.

At the heart of modern computing infrastructure are physical hosts, which are tangible machines that provide computing resources. Virtual machines (VMs) abstract these physical resources, allowing multiple virtual instances to be run on a single physical host. Containers, on the other hand, encapsulate applications and their dependencies, allowing consistent deployment in different environments.

I hope your containers run smoothly, your pods thrive, and your orchestration is always solid. Until we meet again, happy containerization!🚀🐳

--

--

Merve Günak
DataPebbles

A data scientist with a strong passion in data engineering, expanding skills in both domains. https://www.linkedin.com/in/merve-gunak