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 হলো:
| Feature | Named Volume | Bind Mount |
|---|---|---|
| Managed by | Docker | Host filesystem |
| Storage path | Docker manages | User specifies |
| Common use | Database, persistent data | Development files, configuration |
| Portability | Docker-managed storage | Host 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 | কাজ |
|---|---|
| Namespaces | Processes, network, mounts, users ইত্যাদি isolate করা |
| cgroups | CPU, Memory এবং resource usage control করা |
| Linux Capabilities | Privileged operations সীমিত করা |
| Seccomp | System calls filter করা |
| AppArmor | Security profiles enforce করা |
| SELinux | Mandatory access control policies |
| User Namespaces | Container user IDs host-এর IDs থেকে আলাদাভাবে map করা |
| Read-only Filesystem | Container 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 Component | Real-Life Analogy |
|---|---|
| Docker CLI | Reception Desk |
| Docker API | Internal Communication System |
| Docker Engine | Operations Director |
| BuildKit / Buildx | Factory |
| Images | Packaged Products |
| Registry | Warehouse / Distribution Center |
| Networking | Communication Infrastructure |
| Volumes | Permanent Storage Room |
| Authentication | Identity Verification |
| Authorization | Access Permission System |
| Security | Rules, Locks এবং Restricted Areas |
| containerd | Operations Manager |
| containerd-shim | Container Supervisor |
| runc | Worker যে Container Start করে |
| Linux Kernel | Core 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 CLI | User commands গ্রহণ করে এবং API request পাঠায় |
| Docker API | External tools এবং Docker Engine-এর মধ্যে communication |
| Docker Engine | Docker resources এবং container operations coordinate করে |
| BuildKit | Efficient Docker image build করে |
| Buildx | Advanced image building interface provide করে |
| Docker Images | Container চালানোর জন্য packaged application |
| Registry | Docker images store এবং distribute করে |
| Networking | Container communication এবং port publishing |
| Volumes | Persistent application data store করে |
| Authentication | User বা service identity verify করে |
| Authorization | কোন operation permitted সেটা control করে |
| Security | Container isolation এবং privilege restrictions |
| containerd | Container runtime lifecycle manage করে |
| containerd-shim | Running containers-এর supervision-এ সাহায্য করে |
| runc | OCI configuration অনুযায়ী container process create করে |
| Linux Kernel | Process 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
| Feature | Docker Engine | containerd | runc |
|---|---|---|---|
| Abstraction Level | High | Medium / Low | Low |
| Primary Responsibility | Container Platform Management | Container Runtime Management | Container Process Creation |
| Typical Users | Developers, DevOps | Runtime / Platform Engineers | Runtime Implementations |
| CLI | docker | ctr, nerdctl | runc |
| Kubernetes Runtime | Not directly via built-in dockershim | Yes, through CRI integration | Used underneath compatible runtimes |
| Image Building | BuildKit integration | Not a full Docker build platform | No |
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 Engine Overview
- Docker Architecture Overview
- Docker Engine API
- Docker BuildKit
- Docker Volumes
- Docker Security
- containerd Documentation
- runc — OCI Runtime
- Open Container Initiative
শেষ কথা
আমরা যখন 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।
