সফটওয়্যার ডিপ্লয়মেন্টে Virtual Machine (VM) এবং Container—দুটিই ব্যাপকভাবে ব্যবহৃত হয়।
বাইরে থেকে দেখলে দুটোর কাজ প্রায় একই মনে হতে পারে—একটি application-কে আলাদা environment-এর মধ্যে চালানো।
কিন্তু তাদের architecture সম্পূর্ণ ভিন্ন।
সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হলো:
VM নিজের Guest OS এবং Kernel নিয়ে চলে, কিন্তু Container Host OS-এর Kernel share করে।
এই পার্থক্যটি বুঝতে পারলে Docker কীভাবে Container চালায়, সেটিও অনেক সহজে বোঝা যায়।
1. Virtual Machine (VM) Architecture
Virtual Machine বা VM হলো একটি virtual computer, যা একটি physical machine-এর hardware resource ব্যবহার করে।
এখানে Hypervisor physical hardware এবং virtual machine-এর মধ্যে একটি abstraction layer হিসেবে কাজ করে।
একটি VM-এর ভিতরে থাকে:
- Guest Operating System
- নিজস্ব Kernel
- Application
- প্রয়োজনীয় Libraries এবং Dependencies
VM-এর architecture সহজভাবে এমন:
┌──────────────────────────────────────┐
│ Physical Hardware │
│ CPU │ RAM │ Disk │ Network │
└───────────────────┬──────────────────┘
│
▼
┌──────────────────────────────────────┐
│ Hypervisor │
└───────────────┬───────────────┬──────┘
│ │
▼ ▼
┌────────────────┐ ┌────────────────┐
│ VM 1 │ │ VM 2 │
│ │ │ │
│ Guest OS │ │ Guest OS │
│ Kernel │ │ Kernel │
│ Application │ │ Application │
│ │ │ │
└────────────────┘ └────────────────┘
এখানে প্রতিটি VM-এর ভিতরে আলাদা Guest OS এবং Kernel থাকে।
VM-এর প্রধান বৈশিষ্ট্য
আলাদা OS ও Kernel:
প্রতিটি VM নিজের পূর্ণাঙ্গ Operating System চালায়। তাই একটি VM-এর Kernel অন্য VM-এর Kernel থেকে আলাদা।
Resource Isolation:
Hypervisor প্রতিটি VM-এর জন্য CPU, RAM, Virtual Disk ইত্যাদি resource বরাদ্দ করে।
তুলনামূলকভাবে ভারী:
প্রতিটি VM-এর সঙ্গে একটি সম্পূর্ণ Guest OS এবং Kernel থাকে। ফলে VM তুলনামূলকভাবে বেশি resource ব্যবহার করে।
Startup Time বেশি:
একটি VM চালু করার সময় Guest OS এবং Kernel boot করতে হয়। তাই Container-এর তুলনায় VM সাধারণত ধীরে start হয়।
2. Container Architecture
Container-এর architecture VM-এর থেকে সম্পূর্ণ আলাদা।
Container সম্পূর্ণ Operating System virtualize করে না। এর পরিবর্তে Container Host Operating System-এর Kernel share করে।
অর্থাৎ, প্রতিটি Container-এর আলাদা Kernel থাকে না।
Container architecture:
┌──────────────────────────────────────────┐
│ Applications │
│ │
│ ┌────────────┐ ┌────────────┐ │
│ │ Container 1│ │ Container 2│ │
│ │ │ │ │ │
│ │ App │ │ App │ │
│ └────────────┘ └────────────┘ │
├──────────────────────────────────────────┤
│ Docker Engine │
├──────────────────────────────────────────┤
│ Host OS Kernel │
└──────────────────────────────────────────┘
এখানে Container 1 এবং Container 2 আলাদা environment-এ থাকলেও তারা একই Host Kernel ব্যবহার করছে।
তাহলে প্রশ্ন হলো:
একই Kernel ব্যবহার করলে Container-গুলো একে অপরের থেকে আলাদা থাকে কীভাবে?
এখানেই Linux Kernel-এর Namespaces এবং cgroups গুরুত্বপূর্ণ হয়ে ওঠে।
3. Docker Engine কীভাবে Container চালায়?
Docker-এর মূল চালিকাশক্তি হলো Docker Engine।
Linux-এ Docker Container-এর isolation এবং resource management করার জন্য Linux Kernel-এর বিভিন্ন feature ব্যবহার করে।
এর মধ্যে দুটি গুরুত্বপূর্ণ feature হলো:
- Namespaces
- Control Groups (cgroups)
সহজভাবে:
Docker
│
▼
┌─────────────────┐
│ Docker Engine │
└────────┬────────┘
│
┌────────┴────────┐
▼ ▼
┌───────────┐ ┌───────────┐
│ Namespaces│ │ cgroups │
└─────┬─────┘ └─────┬─────┘
│ │
▼ ▼
Isolation Resource Control
অর্থাৎ:
Namespaces → Isolation-এর জন্য
cgroups → Resource Control-এর জন্য
4. Namespaces কী?
Linux Namespaces Container-এর Process এবং অন্যান্য system resources-কে isolate করে।
একটি Container-এর জন্য আলাদা namespace তৈরি করা হলে সেই Container নিজের একটি isolated environment দেখতে পারে।
উদাহরণ হিসেবে:
- PID Namespace
- Network Namespace
- Mount Namespace
ইত্যাদি ব্যবহার করা হয়।
┌──────────────────────────────────┐
│ Container 1 │
│ │
│ PID Namespace │
│ Network Namespace │
│ Mount Namespace │
│ │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ Container 2 │
│ │
│ PID Namespace │
│ Network Namespace │
│ Mount Namespace │
│ │
└──────────────────────────────────┘
এর ফলে Container 1 এবং Container 2 একই Host Kernel ব্যবহার করলেও তাদের Process এবং Network Environment আলাদা রাখা যায়।
5. cgroups কী?
cgroups, অর্থাৎ Control Groups, মূলত Resource Control-এর জন্য ব্যবহৃত হয়।
একটি Container যেন Host Machine-এর সব CPU বা Memory ব্যবহার করে ফেলতে না পারে, সেজন্য resource limit নির্ধারণ করা যায়।
┌─────────────────────────────────┐
│ Container │
│ │
│ Application │
│ │
│ CPU → সীমাবদ্ধ │
│ Memory → সীমাবদ্ধ │
│ I/O → সীমাবদ্ধ │
│ │
└─────────────────────────────────┘
│
▼
Linux cgroups
অর্থাৎ, cgroups Container-এর CPU, Memory এবং I/O resource usage নিয়ন্ত্রণ করতে পারে।
6. VM বনাম Container — আসল পার্থক্য
এখন দুটো architecture পাশাপাশি দেখলে পার্থক্যটি আরও পরিষ্কার হবে।
Virtual Machine
┌───────────────────────────────────┐
│ VM 1 │
│ │
│ Application │
│ Guest OS │
│ Guest Kernel │
└───────────────────────────────────┘
┌───────────────────────────────────┐
│ VM 2 │
│ │
│ Application │
│ Guest OS │
│ Guest Kernel │
└───────────────────────────────────┘
Hypervisor
─────────────────────────────────────
Physical Hardware
Container
┌───────────────────────────────────┐
│ Container 1 │
│ App │
├───────────────────────────────────┤
│ Container 2 │
│ App │
├───────────────────────────────────┤
│ Docker Engine │
├───────────────────────────────────┤
│ Host OS Kernel │
└───────────────────────────────────┘
এখানে সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো:
VM-এ প্রতিটি VM-এর নিজস্ব Guest OS + Kernel থাকে।
আর:
Container-এ Container-গুলো Host OS-এর Kernel share করে।
7. Linux-এ Docker কীভাবে কাজ করে?
Linux-এর ক্ষেত্রে বিষয়টি আরও সরাসরি।
কারণ Linux Kernel-এ Container-এর জন্য প্রয়োজনীয় Namespaces এবং cgroups রয়েছে।
তাই architecture অনেকটা এমন:
┌────────────────────────────────────┐
│ Container 1 │
│ App │
├────────────────────────────────────┤
│ Container 2 │
│ App │
├────────────────────────────────────┤
│ Docker Engine │
├────────────────────────────────────┤
│ Linux Kernel │
│ │
│ Namespaces + cgroups │
└────────────────────────────────────┘
Docker Engine Host Linux Kernel-এর feature ব্যবহার করে Container-গুলোকে isolate এবং resource control করে।
এখানে প্রতিটি Container-এর জন্য আলাদা Linux Kernel চালানোর প্রয়োজন নেই।
8. Windows ও macOS-এ Docker কীভাবে কাজ করে?
এখানে একটি গুরুত্বপূর্ণ বিষয় রয়েছে।
Windows এবং macOS-এর Kernel Linux Kernel নয়।
কিন্তু Docker-এর Linux Container চালানোর জন্য Linux Kernel প্রয়োজন।
তাই Docker Desktop একটি Lightweight Linux VM ব্যবহার করে।
Architecture:
┌──────────────────────────────────────┐
│ Windows / macOS │
│ │
│ Docker Desktop │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Lightweight Linux VM │ │
│ │ │ │
│ │ Linux Kernel │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ Docker Engine │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ Containers │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────────┘
অর্থাৎ Windows বা macOS-এর ক্ষেত্রে Linux Container চালানোর জন্য Docker Desktop-এর মাধ্যমে একটি Lightweight Linux VM-এর Linux Kernel ব্যবহার করা হয়।
9. VM বনাম Container — এক নজরে
| বিষয় | Virtual Machine | Container |
|---|---|---|
| Architecture | Hypervisor-based | OS-level virtualization |
| Guest OS | প্রতিটি VM-এর নিজস্ব OS | আলাদা Guest OS নেই |
| Kernel | প্রতিটি VM-এর নিজস্ব Kernel | Host Kernel share করে |
| Resource Usage | বেশি | কম |
| Startup | তুলনামূলক ধীর | তুলনামূলক দ্রুত |
| Isolation | VM/Hardware level | Process level |
| Isolation Technology | Hypervisor | Namespaces |
| Resource Control | Hypervisor | cgroups |
শেষ কথা
VM এবং Container—দুটিই application isolation-এর জন্য ব্যবহৃত হলেও তাদের isolation-এর পদ্ধতি আলাদা।
VM সম্পূর্ণ Guest OS এবং Kernel নিয়ে চলে।
অন্যদিকে Container Host OS-এর Kernel share করে এবং Linux Kernel-এর Namespaces ও cgroups ব্যবহার করে isolation এবং resource control প্রদান করে।
এই কারণেই Container সাধারণত VM-এর তুলনায় বেশি lightweight এবং দ্রুত।
Docker এই Linux Kernel feature-গুলোর ওপর ভিত্তি করেই Container চালানোর একটি সহজ ও ব্যবহারযোগ্য platform তৈরি করেছে।
Top comments (0)