DEV Community

Cover image for Virtual Machine (VM) vs Container: Architecture এবং Docker Engine কীভাবে কাজ করে?
Ragib Hasan
Ragib Hasan Subscriber

Posted on

Virtual Machine (VM) vs Container: Architecture এবং Docker Engine কীভাবে কাজ করে?

সফটওয়্যার ডিপ্লয়মেন্টে 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  │
      │                │ │                │
      └────────────────┘ └────────────────┘
Enter fullscreen mode Exit fullscreen mode

এখানে প্রতিটি 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              │
└──────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

এখানে 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 হলো:

  1. Namespaces
  2. Control Groups (cgroups)

সহজভাবে:

                    Docker
                       │
                       ▼
              ┌─────────────────┐
              │  Docker Engine  │
              └────────┬────────┘
                       │
              ┌────────┴────────┐
              ▼                 ▼
        ┌───────────┐     ┌───────────┐
        │ Namespaces│     │  cgroups  │
        └─────┬─────┘     └─────┬─────┘
              │                 │
              ▼                 ▼
          Isolation        Resource Control
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ:

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            │
│                                  │
└──────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

এর ফলে 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
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ, 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
Enter fullscreen mode Exit fullscreen mode

Container

┌───────────────────────────────────┐
│           Container 1             │
│             App                   │
├───────────────────────────────────┤
│           Container 2             │
│             App                   │
├───────────────────────────────────┤
│          Docker Engine            │
├───────────────────────────────────┤
│           Host OS Kernel          │
└───────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

এখানে সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো:

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          │
└────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

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          │   │
│   └──────────────────────────────┘   │
└──────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ 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)