DEV Community

Cover image for Docker Engine Internals: ডকার ইঞ্জিন ভেঙে চুরমার—dockerd, containerd এবং runc কীভাবে কাজ করে?
Ragib Hasan
Ragib Hasan Subscriber

Posted on

Docker Engine Internals: ডকার ইঞ্জিন ভেঙে চুরমার—dockerd, containerd এবং runc কীভাবে কাজ করে?

আগের পর্বে আমরা দেখেছি কন্টেইনার কীভাবে হোস্ট কার্নেল শেয়ার করে রান করে। আজ আমরা পুরো ডকার ইঞ্জিন (Docker Engine)-কে ভেঙে এর ভেতরের প্রতিটি মেকানিজম বিস্তারিত দেখব।


ডকার ইঞ্জিন আসলে কী কী কাজ করে?

ডকার ইঞ্জিনের মূল দায়িত্বগুলো হলো:

  • ইমেজ (Image) তৈরি বা বিল্ড করা
  • কন্টেইনার তৈরি (Create) করা
  • কন্টেইনার চালানো (Run) ও বন্ধ (Stop) করা
  • অপ্রয়োজনীয় কন্টেইনার ক্লিন বা ডিলিট (Delete) করা

ডকার ইঞ্জিন কোনো একক সফটওয়্যার নয়; এটি মূলত ৩টি মূল কম্পোনেন্টের সমন্বয়ে তৈরি:

  1. Docker Daemon (dockerd)
  2. containerd (High-Level Container Runtime)
  3. runc (Low-Level Container Runtime)

১. ডিমন (Daemon) কী এবং ডকার ডিমন (dockerd) কীভাবে কাজ করে?

টেকনিক্যাল ডিমন কী?

সহজ ভাষায়, ডিমন হলো এমন এক ধরনের অভিভাবক (Guardian) যে সবার অলক্ষ্যে নিঃস্বার্থভাবে কাজ করে যায়।

প্রোগ্রামিং বা অপারেটিং সিস্টেমের ভাষায়, একটি ডিমন হতে হলে ৩টি শর্ত পূরণ করতে হয়:

  • Background Process: এটি টার্মিনালে কোনো সেশন আটকে না রেখে ব্যাকগ্রাউন্ডে ইনভিজিবলি রান হয় (যেমন: সাধারণ Go, Python বা Java সার্ভারে Ctrl + C দিলে বন্ধ হয়ে যায়, কিন্তু ডিমন টার্মিনালে আটকে থাকে না)।
  • Request Listener: এটি ব্যাকগ্রাউন্ডে বসে পোর্টে বা সকেটে নতুন রিকোয়েস্টের জন্য অপেক্ষা করে।
  • Service Provider: অন্যান্য অ্যাপ্লিকেশন বা ক্লায়েন্ট রিকোয়েস্ট করলে এটি সার্ভিস প্রোভাইড করে।

ডকার ডিমন (dockerd)

কম্পিউটার চালু হলে ব্যাকগ্রাউন্ডে dockerd সাইলেন্টলি চালু হয়ে যায়। এটি বাইরের প্রসেস (যেমন: Docker CLI) থেকে রিকোয়েস্ট শোনার জন্য অপেক্ষা করে এবং সেই অনুযায়ী পরবর্তী ধাপের কম্পোনেন্টগুলোকে নির্দেশ দেয়।


২. কন্টেইনার রানটাইম (Container Runtime)

যে অংশটি সরাসরি কন্টেইনার ক্রিয়েট, স্টপ, ক্লিন বা ডিলিট করার দায়িত্ব পালন করে, তাকে Container Runtime বলে। এটি দুই ভাগে বিভক্ত:

ক. containerd (High-Level Runtime)

এটি ডকার ডিমনের ঠিক নিচে থাকে। এর মূল কাজগুলো হলো:

  • লাইফসাইকেল ম্যানেজমেন্ট: কন্টেইনার কখন স্টার্ট হবে বা এন্ড হবে তা তদারকি করা।
  • স্টোরেজ ম্যানেজমেন্ট: কন্টেইনারের ডিস্ক ও ফাইল সিস্টেম পরিচালনা করা।
  • ইমেজ ম্যানেজমেন্ট: ডকার হাব থেকে ইমেজ নামানো বা ম্যানেজ করা।

containerd ডকার ডিমনকে একটি API ইন্টারফেস দেয়, যাতে ডিমন সহজেই এর সাথে যোগাযোগ করতে পারে। তবে এটি নিজে সরাসরি কন্টেইনার তৈরি করে না।

খ. runc (Low-Level Runtime)

আসল কন্টেইনার তৈরি করার হাতিয়ার হলো runc

  • containerd-এর নির্দেশে runc সরাসরি লিনাক্স কার্নেলের সাথে কথা বলে।
  • এটি লিনাক্স কার্নেলে নতুন Namespace তৈরি করে সম্পূর্ণ আইসোলেটেড একটি পরিবেশ বানায়।
  • এরপর Control Groups (cgroups) ব্যবহার করে ওই কন্টেইনারের জন্য নির্দিষ্ট CPU, RAM, স্টোরেজ ও নেটওয়ার্কের লিমিটেশন সেট করে দেয়।
  • কন্টেইনার ডিলিট বা স্টপ করার সময় এই কার্নেল রিসোর্স ও নেমস্পেস রিমুভ করার দায়িত্বও runc-এর।

৩. সম্পূর্ণ আর্কিটেকচার চিত্র

+-------------------------------------------------------------+
|                        DOCKER ENGINE                        |
|                                                             |
|   +-----------------------------------------------------+   |
|   |                 Docker Daemon (dockerd)             |   |
|   |                  (Background Service)               |   |
|   +--------------------------+--------------------------+   |
|                              |                              |
|                              ▼                              |
|   +-----------------------------------------------------+   |
|   |             containerd (High-Level Runtime)         |   |
|   |         (Manages Lifecycle, Images, Storage)        |   |
|   +--------------------------+--------------------------+   |
|                              |                              |
|                              ▼                              |
|   +-----------------------------------------------------+   |
|   |               runc (Low-Level Runtime)              |   |
|   |            (Interacts with Linux Kernel)            |   |
|   +--------------------------+--------------------------+   |
+------------------------------|------------------------------+
                               ▼
        +---------------------------------------------+
        |                 LINUX KERNEL                |
        |       (Namespaces, Control Groups - cgroups)|
        +---------------------------------------------+
Enter fullscreen mode Exit fullscreen mode

৪. Docker CLI বনাম Docker Engine

আমরা যখন ডকার ইনস্টল করি, তখন দুটি জিনিস আলাদা সফটওয়্যার হিসেবে ইনস্টল হয়:

  1. Docker CLI (Client): টার্মিনাল ক্লায়েন্ট, যেখানে আমরা কমান্ড লিখি (যেমন: docker version, docker run)।
  2. Docker Engine (Server): ব্যাকগ্রাউন্ড ইঞ্জিন।

যখন আমরা টার্মিনালে কোনো কমান্ড দিই, Docker CLI একটি REST API রিকোয়েস্ট তৈরি করে dockerd-এর কাছে পাঠায়।


৫. একটি রিয়েল এক্সাম্পল: docker run hello-world ব্যাকগ্রাউন্ডে কী করে?

আমরা যখন টার্মিনালে docker run hello-world এক্সিকিউট করি, তখন ধাপে ধাপে যা ঘটে:

  1. কমান্ড পাস: Docker CLI কমান্ডটি নিয়ে একটি REST API রিকোয়েস্ট পাঠায় dockerd (Daemon)-এর কাছে।
  2. অর্ডার ফরওয়ার্ড: dockerd রিকোয়েস্টটি রিসিভ করে containerd-কে নির্দেশ দেয়।
  3. ইমেজ ও রিকোয়েস্ট হ্যান্ডলিং: containerd দেখে ইমেজটি স্টোরেজে আছে কি না (না থাকলে পুল করে) এবং কন্টেইনার রান করার জন্য runc-কে কল করে।
  4. কার্নেলে স্পেস তৈরি: runc সরাসরি লিনাক্স কার্নেলে গিয়ে একটি নতুন Namespace এবং নির্দিষ্ট রিসোর্স লিমিট সহ cgroups সেট করে কন্টেইনারটি রান করায়।
  5. আউটপুট রিটার্ন: কন্টেইনারটি চালু হয়ে টার্মিনাল আউটপুট (Hello from Docker!) তৈরি করে।
  6. রেসপন্স ডিসপ্লে: dockerd সেই আউটপুটটি সংগ্রহ করে Docker CLI-কে ফেরত পাঠায় এবং CLI আমাদের টার্মিনালে টেক্সটটি প্রিন্ট করে দেখায়।

দ্রুত তুলনামূলক টেবিল

কম্পোনেন্ট লেভেল মূল দায়িত্ব
Docker CLI ইউজার ইন্টারফেস টার্মিনাল কমান্ডকে API রিকোয়েস্টে রূপান্তর করে পাঠানো
dockerd ব্যাকগ্রাউন্ড সার্ভার API রিকোয়েস্ট রিসিভ করা এবং প্রসেস পরিচালনা করা
containerd High-Level Runtime ইমেজ পুলিং, লাইফসাইকেল এবং স্টোরেজ ম্যানেজমেন্ট
runc Low-Level Runtime কার্নেল লেভেলে Namespacecgroups তৈরি করে কন্টেইনার রান করা

Top comments (0)