Kubernetes Overview · Part 0606

Docker ArchitectureDocker CLI থেকে containerd ও runc

Terminal-এ docker run nginx লেখার পর আসলে কী ঘটে? Docker CLI, API, Docker Engine, BuildKit, volumes, security, containerd, containerd-shim এবং runc — প্রত্যেকটি component কী কাজ করে, সহজভাবে।

Docker architecture stack: docker run goes from the Docker CLI through the Docker API and Docker Engine to containerd, containerd-shim, runc and the Linux kernel
FIG. 06 একটি docker run command: CLI → API → Docker Engine → containerd → shim → runc → Linux kernel।

Docker নিয়ে কাজ করার সময় আমরা সাধারণত docker run, docker build বা docker compose up-এর মতো commands ব্যবহার করি।

কিন্তু কখনো কি ভেবে দেখেছ, Terminal-এ docker run nginx লেখার পর আসলে কী ঘটে?

Docker কীভাবে image download করে? কে container create করে? Container-এর process কে start করে? আর Docker Engine, containerd এবং runc-এর মধ্যে আসল পার্থক্যটাই বা কী?

আজকে আমরা Docker-এর পুরো architecture সহজভাবে বোঝার চেষ্টা করব।

Docker আসলে কী?

অনেকেই মনে করে Docker মানেই container। কিন্তু Docker শুধু container চালানোর একটা tool নয়।

Docker হলো একটি complete containerization platform, যার মাধ্যমে application build, package, distribute, run এবং manage করা যায়।

Docker-এর ecosystem-এ বেশ কিছু গুরুত্বপূর্ণ components একসঙ্গে কাজ করে।

Docker Platform
│
├── Docker CLI
│
├── Docker API
│
├── Docker Engine (dockerd)
│
├── Build Tools (BuildKit / Buildx)
│
├── Images & Registries
│
├── Networking
│
├── Volumes
│
├── Authentication & Authorization
│
├── Security
│
└── Container Runtime
    │
    ├── containerd
    │
    └── runc

এখানে প্রত্যেকটি component-এর আলাদা responsibility রয়েছে।

একটা application-এর Docker image build করা থেকে শুরু করে সেটাকে container হিসেবে run করা পর্যন্ত বিভিন্ন component নিজেদের কাজ করে।

চলো এবার একে একে বুঝি।

1. Docker CLI — Docker-এর সঙ্গে কথা বলার মাধ্যম

Docker CLI (Command Line Interface) হলো সেই tool, যার মাধ্যমে আমরা Terminal থেকে Docker-কে instructions দিই।

যেমন:

docker run nginx

docker ps

docker build -t my-app .

docker compose up

docker logs container-name

এগুলো আমরা সবাই কমবেশি ব্যবহার করি।

কিন্তু interesting বিষয় হলো, Docker CLI নিজে container চালায় না।

Docker CLI মূলত আমাদের command গ্রহণ করে এবং Docker Engine-এর API-তে request পাঠায়।

ধরো, তুমি নিচের command execute করলে:

docker run nginx

এখন Docker CLI কী করবে?

এটি Docker API-তে একটি request পাঠাবে।

সহজ ভাষায় request-টি এমন:

nginx image ব্যবহার করে একটা নতুন container create করো এবং সেটাকে start করো।

তারপর Docker Engine সেই request process করবে।

Docker CLI-এর Workflow

User
  │
  │ docker run nginx
  ▼
Docker CLI
  │
  │ API Request
  ▼
Docker Engine
  │
  ▼
Container Creation

অর্থাৎ CLI হলো Docker ব্যবহার করার interface, container runtime নয়।

Real-world example:

তুমি যখন কোনো website-এ button click করো, তখন সেই button নিজে database update করে না। Backend API-তে request পাঠায়।

Docker CLI-ও অনেকটা একইভাবে কাজ করে।

2. Docker API — Docker-এর Communication Layer

Docker CLI যে Docker Engine-এর সঙ্গে communicate করে, সেটা সম্ভব হয় Docker API-এর মাধ্যমে।

Docker Engine একটি API expose করে, যার মাধ্যমে বিভিন্ন tools Docker-এর functionality access করতে পারে।

শুধু Docker CLI নয়, অন্য applications-ও Docker API ব্যবহার করতে পারে।

যেমন:

Docker CLI ──────────┐
                     │
Portainer ───────────┤
                     │
CI/CD Tools ─────────┼──► Docker API
                     │          │
Custom Scripts ──────┤          ▼
                     │     Docker Engine
                     │
Automation Tools ────┘

এখানে Portainer হলো Docker environment manage করার একটি graphical management tool।

তুমি Portainer-এর web interface থেকে container start বা stop করতে পারো, কারণ এটি Docker API-এর সঙ্গে communicate করতে পারে।

একইভাবে GitLab CI, GitHub Actions-এর self-hosted runner কিংবা custom automation scripts উপযুক্ত configuration থাকলে Docker API ব্যবহার করতে পারে।

Docker API দিয়ে কী কী করা যায়?

  • নতুন container create করা
  • Container start এবং stop করা
  • Docker image pull করা
  • Docker image build করা
  • Running containers list করা
  • Container-এর logs দেখা
  • Docker networks inspect করা
  • Docker volumes manage করা

Docker Socket কী?

Linux-এ Docker Engine সাধারণত একটি Unix socket expose করে।

/var/run/docker.sock

এই socket ব্যবহার করে Docker CLI locally Docker Engine-এর সঙ্গে communicate করতে পারে।

উদাহরণ:

docker ps

এই command চালালে Docker CLI local Docker socket-এর মাধ্যমে Docker Engine থেকে running containers-এর information request করে।

Docker Socket Security

এখানে একটা গুরুত্বপূর্ণ security বিষয় আছে।

Docker socket access থাকা মানে সাধারণ rootful Docker setup-এ host machine-এর ওপর অত্যন্ত শক্তিশালী control পাওয়া।

কারণ Docker API ব্যবহার করে privileged containers তৈরি করা, host directories mount করা কিংবা sensitive files access করা সম্ভব হতে পারে।

তাই production environment-এ Docker socket যেকোনো container বা user-কে access দেওয়া উচিত নয়।

বিশেষ করে নিচের মতো configuration খুব সতর্কতার সঙ্গে ব্যবহার করতে হবে:

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

এভাবে Docker socket mount করলে সেই container-এর ভেতর থেকে host Docker Engine control করার সুযোগ তৈরি হতে পারে।

3. Docker Build Tools — Docker Image কীভাবে তৈরি হয়?

Container run করার আগে আমাদের একটি Docker image দরকার।

এই image তৈরি করার কাজ করে Docker-এর build tools।

Modern Docker image building-এর গুরুত্বপূর্ণ দুটি technology হলো:

BuildKit: Image build execution engine।

Buildx: Docker CLI-এর advanced build functionality provide করার plugin।

ধরো, তোমার একটি Node.js application আছে।

তার জন্য তুমি একটি Dockerfile লিখলে:

FROM node:22

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

CMD ["npm", "start"]

এখন image build করতে:

docker build -t my-node-app .

এই Command Execute করলে কী ঘটে?

Dockerfile
    │
    ▼
Docker Build
    │
    ▼
BuildKit
    │
    ├── Base Image Resolve
    │
    ├── Build Instructions Process
    │
    ├── Dependencies Install
    │
    ├── Build Cache Use
    │
    └── Image Layers Create
    │
    ▼
Final Docker Image

BuildKit Dockerfile-এর instructions অনুযায়ী build process execute করে।

Build tools-এর গুরুত্বপূর্ণ functionality:

  • Dockerfile instructions process করা
  • Base images download করা
  • Build caching
  • Image layers তৈরি করা
  • Multi-stage builds
  • Build secrets support
  • Multi-platform builds
  • Build process optimize করা

Multi-Stage Docker Build

Production environment-এ অনেক সময় application build করার জন্য যেসব dependencies লাগে, final runtime-এ সেগুলো দরকার হয় না।

এক্ষেত্রে Multi-stage Dockerfile খুব useful।

ধরো, তোমার একটি frontend application আছে:

# Stage 1: Build Application

FROM node:22 AS builder

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

# Stage 2: Production Runtime

FROM nginx:alpine

COPY --from=builder /app/dist /usr/share/nginx/html

এখানে প্রথম stage-এ Node.js ব্যবহার করে application build হচ্ছে।

দ্বিতীয় stage-এ শুধুমাত্র generated static files Nginx image-এর মধ্যে copy হচ্ছে।

ফলে final image-এ Node.js build dependencies রাখার প্রয়োজন হচ্ছে না।

Benefit: Image তুলনামূলক ছোট হয়, unnecessary build dependencies কমে এবং production deployment সহজ হয়।

4. Docker Volumes — Container Delete হলেও Data কীভাবে থাকবে?

Docker containers সাধারণত replaceable হওয়ার জন্য design করা হয়।

ধরো, তুমি PostgreSQL database একটি container-এর মধ্যে চালাচ্ছ।

এখন container remove করলে database-এর data কী হবে?

যদি data শুধু container-এর writable filesystem-এ থাকে, তাহলে container delete করার সঙ্গে সেই data-ও হারিয়ে যেতে পারে।

এই সমস্যার solution হলো Docker Volumes।

Docker Volume ব্যবহার করে container-এর lifecycle থেকে persistent data-কে আলাদা রাখা যায়।

Example: PostgreSQL Database

docker run -d \
  --name postgres-db \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql \
  postgres:18

এখানে:

pgdata

হলো একটি Docker named volume।

আর:

/var/lib/postgresql

হলো PostgreSQL 18 image-এর data storage location।

Note: PostgreSQL image-এর version অনুযায়ী recommended data directory পরিবর্তিত হতে পারে। পুরোনো PostgreSQL images-এর জন্য /var/lib/postgresql/data প্রচলিত।

Volume কীভাবে কাজ করে?

Host Machine
│
├── Docker Engine
│   │
│   └── PostgreSQL Container
│          │
│          └── Database Files
│                 │
│                 ▼
└── Docker Volume: pgdata
          │
          └── Persistent Storage

Container remove করলেও named volume সাধারণত থেকে যায়।

তাই একই volume নতুন compatible PostgreSQL container-এ mount করলে আগের data ব্যবহার করা সম্ভব।

অবশ্যই database version compatibility এবং proper backup strategy বিবেচনা করতে হবে।

Named Volume vs Bind Mount

Docker-এ persistent storage-এর দুটি common approach হলো:

FeatureNamed VolumeBind Mount
Managed byDockerHost filesystem
Storage pathDocker managesUser specifies
Common useDatabase, persistent dataDevelopment files, configuration
PortabilityDocker-managed storageHost path-এর ওপর dependent

Named Volume Example

docker run \
  -v pgdata:/var/lib/postgresql \
  postgres:18

Bind Mount Example

docker run \
  -v /home/user/app:/app \
  node:22

Bind mount-এ host machine-এর একটি directory সরাসরি container-এর directory-এর সঙ্গে connect করা হয়।

Development environment-এ এটি অনেক useful, কারণ local source code container-এর মধ্যে available করা যায়।

Volumes কোথায় ব্যবহার হয়?

Database storage, uploaded files, persistent application state এবং কিছু log storage scenario-তে volumes ব্যবহার করা হয়।

তবে production-এ শুধু volume থাকলেই data safe — এমন নয়। আলাদা backup এবং recovery process দরকার।

5. Docker Authentication & Authorization — কে কী Access করতে পারবে?

Docker authentication সবচেয়ে বেশি দেখা যায় Docker Registry ব্যবহার করার সময়।

Docker Registry হলো যেখানে Docker images store এবং distribute করা হয়।

যেমন:

  • Docker Hub
  • GitHub Container Registry (GHCR)
  • GitLab Container Registry
  • Private Enterprise Registry

Public images সাধারণত login ছাড়াও pull করা যায়।

কিন্তু private images access করতে credentials লাগতে পারে।

Docker Login

docker login

নির্দিষ্ট Registry-তে login করতে:

docker login ghcr.io

Private image pull করার উদাহরণ:

docker pull ghcr.io/company/private-app:latest

Image push করতে:

docker push myrepo/my-app:latest

অবশ্যই image name, credentials এবং registry permissions সঠিক থাকতে হবে।

Authentication vs Authorization

দুটো বিষয় এক নয়।

Authentication: তুমি কে?

Authorization: তুমি কোন কাজগুলো করতে পারবে?

উদাহরণ:

Developer
    │
    ▼
Registry Login
    │
    ▼
Authentication
    │
    ▼
Permission Check
    │
    ├── Pull Image: Allowed
    │
    └── Push Image: Denied

এখানে developer Registry-তে login করতে পারলেও image push করার permission নাও থাকতে পারে।

Production Environment-এ Auth কেন গুরুত্বপূর্ণ?

Enterprise environment-এ সাধারণত private container registries, CI/CD service accounts, credential helpers এবং scoped access tokens ব্যবহার করা হয়।

Credentials কখনো Dockerfile-এর মধ্যে hardcode করা উচিত নয়।

CI/CD environment-এ secrets management এবং least-privilege access ব্যবহার করা ভালো।

আরেকটি বিষয় মনে রাখতে হবে: Registry-এর authentication এবং Docker daemon-এর local access control দুটি আলাদা বিষয়।

6. Docker Security — Containers কতটা Isolated?

Docker containers virtual machines-এর মতো সম্পূর্ণ আলাদা operating system চালায় না।

Linux containers সাধারণত host machine-এর Linux kernel share করে।

তাই container isolation এবং security খুব গুরুত্বপূর্ণ।

Docker বিভিন্ন Linux kernel security features ব্যবহার করে।

Security Featureকাজ
NamespacesProcesses, network, mounts, users ইত্যাদি isolate করা
cgroupsCPU, Memory এবং resource usage control করা
Linux CapabilitiesPrivileged operations সীমিত করা
SeccompSystem calls filter করা
AppArmorSecurity profiles enforce করা
SELinuxMandatory access control policies
User NamespacesContainer user IDs host-এর IDs থেকে আলাদাভাবে map করা
Read-only FilesystemContainer filesystem-এ write access সীমিত করা

এগুলো একটু সহজভাবে বুঝি।

Namespaces

Namespaces container-এর জন্য isolated environment তৈরি করতে সাহায্য করে।

ধরো, একই Linux server-এ দুটি containers চলছে।

Linux Host
│
├── Container A
│   ├── Process Namespace
│   ├── Network Namespace
│   └── Mount Namespace
│
└── Container B
    ├── Process Namespace
    ├── Network Namespace
    └── Mount Namespace

Container A-এর ভেতরের processes এবং network environment Container B থেকে আলাদা রাখা সম্ভব হয়।

cgroups

cgroups-এর মাধ্যমে container কত CPU বা Memory ব্যবহার করতে পারবে সেটা control করা যায়।

Memory Limit

docker run --memory=512m nginx

এখানে container-এর memory limit 512 MB।

CPU Limit

docker run --cpus=1 nginx

এখানে container সর্বোচ্চ প্রায় একটি CPU core-এর সমপরিমাণ CPU time ব্যবহার করার configuration পায়।

এই limits shared server environment-এ resource management-এর জন্য গুরুত্বপূর্ণ।

Read-only Filesystem

docker run --read-only nginx

এই option container-এর root filesystem-কে read-only করে।

তবে application যদি runtime-এ files write করতে চায়, তাহলে আলাদা writable mounts বা tmpfs configure করতে হবে। Default Nginx configuration-ও অতিরিক্ত writable paths ছাড়া এই option-এ সমস্যায় পড়তে পারে।

Non-root User

Container-এর process non-root user দিয়ে চালানো ভালো security practice।

docker run --user 1000:1000 my-app

তবে application-এর file permissions এবং runtime requirements compatible হতে হবে।

Privileged Container — কেন ঝুঁকিপূর্ণ?

docker run --privileged ubuntu

--privileged container-কে অনেক অতিরিক্ত host capabilities এবং device access দিতে পারে।

ফলে container isolation দুর্বল হয়ে যায়।

তাই বিশেষ প্রয়োজন ছাড়া এই option ব্যবহার করা উচিত নয়।

Production Security-এর মূল ধারণা

যতটুকু permission প্রয়োজন, container-কে শুধু ততটুকুই দিতে হবে।

এটাকে বলা হয় Principle of Least Privilege।

7. containerd — Container Lifecycle Manager

এবার Docker architecture-এর গুরুত্বপূর্ণ অংশে আসি।

আমরা যখন:

docker run nginx

execute করি, তখন Docker Engine নিজে সরাসরি Linux process তৈরি করার সব কাজ করে না।

Docker Engine নিচের container runtime layer ব্যবহার করে।

এই layer-এর গুরুত্বপূর্ণ component হলো containerd।

containerd একটি industry-standard container runtime, যা container lifecycle এবং related runtime operations manage করে।

এর responsibilities-এর মধ্যে রয়েছে:

  • Container images manage করা
  • Image content এবং snapshots manage করা
  • Container lifecycle operations
  • Runtime tasks manage করা
  • Lower-level OCI runtime-এর সঙ্গে integration

Docker এবং containerd-এর সম্পর্ক

Docker CLI
     │
     ▼
Docker API
     │
     ▼
Docker Engine (dockerd)
     │
     ▼
containerd
     │
     ▼
containerd-shim
     │
     ▼
runc
     │
     ▼
Container Process

এখানে containerd-shim একটি গুরুত্বপূর্ণ runtime component, যা container process-এর lifecycle এবং I/O management-এ ভূমিকা রাখে।

Kubernetes-এ containerd

containerd শুধু Docker-এর জন্য নয়।

Kubernetes-এও এটি খুব commonly used container runtime।

Modern Kubernetes architecture-এ Kubernetes সাধারণত CRI (Container Runtime Interface) দিয়ে compatible runtimes-এর সঙ্গে communicate করে।

একটি simplified flow:

Kubernetes API Server
          │
          ▼
       Kubelet
          │
          ▼
        CRI
          │
          ▼
      containerd
          │
          ▼
     containerd-shim
          │
          ▼
         runc
          │
          ▼
     Linux Container

এখানে একটি গুরুত্বপূর্ণ বিষয় হলো Kubernetes v1.24 থেকে built-in dockershim remove করা হয়েছে।

তাই Kubernetes node-এ Docker Engine ছাড়াও containerd সরাসরি container runtime হিসেবে ব্যবহার করা যায়।

Docker এবং containerd competitor নয়। Docker একটি broader container platform, আর containerd হলো container runtime component।

8. runc — যে Component আসল Container Process তৈরি করে

Docker architecture-এর আরও নিচের layer-এ রয়েছে runc।

runc হলো একটি low-level OCI-compatible container runtime।

OCI-এর পূর্ণরূপ: Open Container Initiative।

OCI standards container image এবং runtime behavior-এর interoperability নিশ্চিত করতে সাহায্য করে।

runc-এর প্রধান কাজ হলো Linux kernel-এর capabilities ব্যবহার করে container process তৈরি ও start করা।

এর কাজের মধ্যে রয়েছে:

  • Linux namespaces configure করা
  • cgroups configuration apply করা
  • Container filesystem setup করা
  • Security settings apply করা
  • Container-এর initial process start করা

runc কীভাবে কাজ করে?

ধরো, তুমি নিচের command execute করেছ:

docker run nginx

তখন simplified flow:

docker run nginx
       │
       ▼
Docker CLI
       │
       ▼
Docker API
       │
       ▼
Docker Engine
       │
       ▼
containerd
       │
       ▼
containerd-shim
       │
       ▼
runc
       │
       ▼
Linux Kernel Features
       │
       ▼
Nginx Container Process

এখানে runc OCI runtime configuration অনুযায়ী container process create করে।

Container start হওয়ার পর runc সাধারণত long-running process হিসেবে থেকে যায় না। containerd-shim running container-এর lifecycle supervision-এ ভূমিকা রাখে।

এই distinction বোঝা গুরুত্বপূর্ণ, কারণ containerd এবং runc একই কাজ করে না।

containerd: Higher-level runtime lifecycle management।

runc: Low-level container process creation।

9. Docker-এর Full Architecture — Complete Picture

এবার সব components একসঙ্গে বোঝার চেষ্টা করি।

                  DEVELOPER
                      │
                      ▼
                 Docker CLI
                      │
                      ▼
                  Docker API
                      │
                      ▼
               Docker Engine
                  (dockerd)
                      │
       ┌──────────────┼──────────────┐
       │              │              │
       ▼              ▼              ▼
 BuildKit /       Networking     Volumes /
  Buildx          Management      Storage
       │              │              │
       └──────────────┼──────────────┘
                      │
                      ▼
                 containerd
                      │
                      ▼
               containerd-shim
                      │
                      ▼
                    runc
                      │
                      ▼
                 Linux Kernel
                      │
                      ▼
                Running Container

এটি একটি simplified conceptual architecture।

বাস্তবে image building, registry access, networking, storage এবং runtime operations একই sequential pipeline-এর মধ্যে ঘটে না। Docker Engine বিভিন্ন subsystems coordinate করে।

10. Real Example — docker run nginx Command-এর ভেতরে কী ঘটে?

এখন আমরা একটি complete example দেখব।

ধরো, Terminal-এ লিখলে:

docker run -d -p 8080:80 nginx

এই একটি command execute করার পর Docker-এর ভেতরে অনেকগুলো operation ঘটে।

Step 1: Docker CLI Command Receive করে

CLI command-এর parameters parse করে।

এখানে:

  • -d মানে detached mode
  • -p 8080:80 মানে host port 8080 থেকে container port 80-তে traffic forward করা
  • nginx হলো image name

Step 2: Docker API-তে Request যায়

Docker CLI Docker Engine-এর API-তে container create করার request পাঠায়।

Step 3: Docker Engine Image Check করে

Docker Engine check করে Nginx image locally available আছে কি না।

Image না থাকলে registry থেকে pull করার ব্যবস্থা করে।

Step 4: Registry Authentication প্রয়োজন হতে পারে

Public Nginx image সাধারণত anonymous access-এ pull করা যায়।

Private registry image হলে appropriate credentials দরকার হবে।

Step 5: Container Configuration Prepare হয়

Docker Engine container-এর জন্য configuration prepare করে।

যেমন:

  • Container filesystem
  • Networking
  • Port publishing
  • Environment variables
  • Volume mounts
  • Security configuration
  • Resource limits

Step 6: containerd Container Task Manage করে

Docker Engine containerd-এর সঙ্গে communicate করে runtime operations coordinate করে।

Step 7: runc Container Process Create করে

containerd-shim-এর মাধ্যমে runc invoke করা হয়।

runc Linux kernel-এর namespaces, cgroups এবং অন্যান্য isolation features ব্যবহার করে container process create এবং start করে।

Step 8: Nginx Process Start হয়

এখন Nginx container-এর মধ্যে একটি Linux process হিসেবে চলছে।

Step 9: Port Mapping কাজ করে

Host machine-এর port 8080 থেকে container-এর port 80-তে incoming connections forward করার ব্যবস্থা Docker configure করে।

Step 10: Browser থেকে Application Access করা যায়

এখন Browser open করে:

http://localhost:8080

access করলে Nginx welcome page দেখতে পাবে।

Complete Runtime Flow

User
 │
 │ docker run -d -p 8080:80 nginx
 ▼
Docker CLI
 │
 ▼
Docker API
 │
 ▼
Docker Engine
 │
 ├── Check Image
 │
 ├── Pull Image if Required
 │
 ├── Prepare Networking
 │
 ├── Configure Storage
 │
 ├── Apply Security Settings
 │
 ▼
containerd
 │
 ▼
containerd-shim
 │
 ▼
runc
 │
 ▼
Linux Kernel
 │
 ▼
Nginx Process
 │
 ▼
Host Port 8080 → Container Port 80
 │
 ▼
http://localhost:8080

অর্থাৎ আমাদের একটি simple Docker command-এর পেছনে অনেকগুলো technologies একসঙ্গে কাজ করছে।

11. Docker Architecture — একটি Simple Real-Life Analogy

Docker-এর components মনে রাখার জন্য একটা সহজ example ব্যবহার করা যায়।

ধরো, Docker হলো একটি বড় কোম্পানি।

এই কোম্পানির বিভিন্ন departments আলাদা আলাদা কাজ করে।

Docker ComponentReal-Life Analogy
Docker CLIReception Desk
Docker APIInternal Communication System
Docker EngineOperations Director
BuildKit / BuildxFactory
ImagesPackaged Products
RegistryWarehouse / Distribution Center
NetworkingCommunication Infrastructure
VolumesPermanent Storage Room
AuthenticationIdentity Verification
AuthorizationAccess Permission System
SecurityRules, Locks এবং Restricted Areas
containerdOperations Manager
containerd-shimContainer Supervisor
runcWorker যে Container Start করে
Linux KernelCore Infrastructure

Example

ধরো, তুমি কোম্পানির reception-এ গিয়ে বললে:

আমার জন্য একটা নতুন Nginx server চালু করে দাও।

Reception Desk অর্থাৎ Docker CLI তোমার request গ্রহণ করবে।

Internal communication system অর্থাৎ Docker API request-টি Operations Director বা Docker Engine-এর কাছে পাঠাবে।

Docker Engine প্রয়োজনীয় image, networking এবং storage preparation coordinate করবে।

তারপর containerd runtime operations manage করবে।

runc Linux kernel-এর সাহায্যে actual container process start করবে।

অবশেষে Nginx server চলতে শুরু করবে।

এভাবেই Docker-এর প্রতিটি component নিজের responsibility পালন করে।

12. Docker-এর সবচেয়ে গুরুত্বপূর্ণ Components — Quick Reference

Componentমূল কাজ
Docker CLIUser commands গ্রহণ করে এবং API request পাঠায়
Docker APIExternal tools এবং Docker Engine-এর মধ্যে communication
Docker EngineDocker resources এবং container operations coordinate করে
BuildKitEfficient Docker image build করে
BuildxAdvanced image building interface provide করে
Docker ImagesContainer চালানোর জন্য packaged application
RegistryDocker images store এবং distribute করে
NetworkingContainer communication এবং port publishing
VolumesPersistent application data store করে
AuthenticationUser বা service identity verify করে
Authorizationকোন operation permitted সেটা control করে
SecurityContainer isolation এবং privilege restrictions
containerdContainer runtime lifecycle manage করে
containerd-shimRunning containers-এর supervision-এ সাহায্য করে
runcOCI configuration অনুযায়ী container process create করে
Linux KernelProcess execution, isolation এবং resource control provide করে

13. Docker Engine vs containerd vs runc — আসল পার্থক্য

Docker architecture বোঝার জন্য এই তিনটি component-এর পার্থক্য পরিষ্কার থাকা জরুরি।

Docker Engine

Docker Engine হলো higher-level container management platform।

এটি images, containers, networks, volumes এবং Docker API manage করে।

Developer-friendly interface ও workflow provide করাই এর বড় সুবিধা।

containerd

containerd হলো container runtime management layer।

এটি image content, snapshots এবং container lifecycle operations handle করে।

Docker এবং Kubernetes — উভয় ecosystem-এ এটি ব্যবহার করা যায়।

runc

runc হলো low-level OCI runtime।

এটি Linux kernel-এর isolation mechanisms ব্যবহার করে actual container process create এবং start করে।

Comparison

FeatureDocker Enginecontainerdrunc
Abstraction LevelHighMedium / LowLow
Primary ResponsibilityContainer Platform ManagementContainer Runtime ManagementContainer Process Creation
Typical UsersDevelopers, DevOpsRuntime / Platform EngineersRuntime Implementations
CLIdockerctr, nerdctlrunc
Kubernetes RuntimeNot directly via built-in dockershimYes, through CRI integrationUsed underneath compatible runtimes
Image BuildingBuildKit integrationNot a full Docker build platformNo

14. Final Takeaway — Docker আসলে একটি Complete Technology Stack

Docker architecture বোঝার সবচেয়ে সহজ উপায় হলো প্রত্যেকটি component-এর responsibility মনে রাখা।

Docker CLI
    → আমরা যে Commands ব্যবহার করি

Docker API
    → Tools কীভাবে Docker Engine-এর সঙ্গে কথা বলে

Docker Engine
    → Docker Resources এবং Operations Manage করে

BuildKit
    → Docker Images Build করে

Volumes
    → Persistent Data Store করে

Authentication
    → Identity Verify করে

Authorization
    → Access Permissions Control করে

Security
    → Container Isolation এবং Restrictions Apply করে

containerd
    → Container Runtime Lifecycle Manage করে

containerd-shim
    → Running Container Supervision

runc
    → Actual Container Process Create এবং Start করে

Linux Kernel
    → Container Execution ও Isolation-এর ভিত্তি

সবচেয়ে গুরুত্বপূর্ণ বিষয়: Docker নিজে কোনো নতুন operating system তৈরি করে না। Linux containers host-এর kernel features ব্যবহার করে isolated processes হিসেবে run করে।

macOS এবং Windows-এ Linux containers চালানোর জন্য Docker Desktop সাধারণত একটি Linux virtual machine বা WSL 2 environment ব্যবহার করে।

তাই Docker container এবং Virtual Machine এক জিনিস নয়।

Container সাধারণত একটি shared kernel environment ব্যবহার করে, আর Virtual Machine নিজের guest operating system এবং kernel চালায়।

এই architectural difference-ই containers-কে অনেক workload-এর জন্য lightweight এবং দ্রুত deploy করার উপযোগী করে।

Official References

Docker-এর internal architecture আরও বিস্তারিতভাবে জানতে নিচের documentation পড়তে পারো।

শেষ কথা

আমরা যখন docker run nginx লিখি, তখন বাইরে থেকে পুরো বিষয়টি খুব simple মনে হয়।

কিন্তু এর পেছনে Docker CLI, API, Docker Engine, containerd, containerd-shim, runc এবং Linux kernel একসঙ্গে কাজ করে।

একজন Developer-এর জন্য Docker commands জানা গুরুত্বপূর্ণ। কিন্তু DevOps, Platform Engineering, Cloud Infrastructure কিংবা Kubernetes নিয়ে কাজ করতে চাইলে Docker-এর এই internal architecture বোঝা আরও বেশি গুরুত্বপূর্ণ।

কারণ তখন তুমি শুধু container run করতেই পারবে না, container কেন start হচ্ছে না, runtime কোথায় fail করছে, networking বা storage-এর সমস্যা কোথায় — সেগুলোও systematically troubleshoot করতে পারবে।

Docker শুধু Container চালানোর Tool নয় — এটি Application Build, Distribution এবং Container Lifecycle Management-এর একটি Complete Platform।

Was this guide helpful?

Search the archive

Press Esc to close