🔧 چطور یک داکر برای خودمون بسازیم؟ – قسمت اول
در این مجموعه پستها قصد داریم با کنار هم گذاشتن اجزای پایه های لینوکس، یک container runtime مینیمال مشابه Docker بسازیم. تو این مسیر، با مفاهیم کلیدی مثل namespaceها، cgroups، mount isolation، و root filesystem کار میکنیم تا پایه لینوکس خودمون رو تقویت کنیم.
🧩 cgroups چیست و چرا مهم هست؟
در ساختار یک کانتینر، این قابلیت باعث میشه که:
1️⃣ یک کانتینر بیش از سهم خود از CPU یا RAM استفاده نکنه.
2️⃣ فشار زیاد از سوی یک کانتینر باعث اختلال در کل سیستم نشه.
3️⃣ مدیریت منابع میان چند کانتینر با دقت بیشتری انجام بشه.
✅ چه چیزهایی را میشه با اون کنترل کرد؟
در cgroup نسخه ۲ میتونیم انواع مختلفی از منابع رو محدود کنیم. به طور مثال:
1️⃣ با memory.max میتونیم حداکثر میزان RAM قابل استفاده رو تعیین کنیم. مثلاً مقدار 536870912 یعنی محدودیت ۵۱۲ مگابایت.
2️⃣ گزینه cpu.max برای کنترل میزان مصرف CPU استفاده میشه. مثلاً مقدار 50000 100000 به معنی استفاده از ۵۰٪ ظرفیت CPU هست.
3️⃣ با pids.max میتونیم تعداد پراسس هایی که داخل یک cgroup ایجاد میشن رو محدود کنیم. مثلاً مقدار 50 یعنی فقط ۵۰ پراسس مجاز هستن.
4️⃣ و در نهایت، با io.max میتونیم سرعت دسترسی به دیسک رو کنترل کنیم. مثلاً rbps=1048576 یعنی حداکثر سرعت خواندن از دیسک یک مگابایت بر ثانیه خواهد بود.
🧪 ایجاد یک cgroup
در این مرحله میخوایم بهصورت دستی یک cgroup بسازیم و محدودیت RAM را روی پراسس فعلی اعمال کنیم:
از این لحظه به بعد، پراسس فعلی فقطمجازه که از ۵۱۲ مگابایت RAM استفاده کنه.
🐳 و containerd کجای ماجراست؟
ابزارهای مدرنی مثل Docker، در پشت صحنه از
✍️ جمع بندی
در پست بعدی، در مورد namespaceها توضیح میدیم؛ ابزاری که باعث میشه پراسس ها بتونن محیط مجزای خودشون رو داشته باشن (مثلاً PID یا network مجزا).
اگر سوالی درباره cgroups یا محدودسازی منابع داشتید توی کامنتها با ما در میون بزارید.
➖➖➖➖➖➖➖➖➖➖
در این مجموعه پستها قصد داریم با کنار هم گذاشتن اجزای پایه های لینوکس، یک container runtime مینیمال مشابه Docker بسازیم. تو این مسیر، با مفاهیم کلیدی مثل namespaceها، cgroups، mount isolation، و root filesystem کار میکنیم تا پایه لینوکس خودمون رو تقویت کنیم.
🧩 cgroups چیست و چرا مهم هست؟
Control Groups
یا بهاختصار cgroups
مکانیزمی در لینوکس هست که اجازه میده میزان منابع مصرفی یک یا چند پراسس را محدود کنیم.در ساختار یک کانتینر، این قابلیت باعث میشه که:
1️⃣ یک کانتینر بیش از سهم خود از CPU یا RAM استفاده نکنه.
2️⃣ فشار زیاد از سوی یک کانتینر باعث اختلال در کل سیستم نشه.
3️⃣ مدیریت منابع میان چند کانتینر با دقت بیشتری انجام بشه.
✅ چه چیزهایی را میشه با اون کنترل کرد؟
در cgroup نسخه ۲ میتونیم انواع مختلفی از منابع رو محدود کنیم. به طور مثال:
1️⃣ با memory.max میتونیم حداکثر میزان RAM قابل استفاده رو تعیین کنیم. مثلاً مقدار 536870912 یعنی محدودیت ۵۱۲ مگابایت.
2️⃣ گزینه cpu.max برای کنترل میزان مصرف CPU استفاده میشه. مثلاً مقدار 50000 100000 به معنی استفاده از ۵۰٪ ظرفیت CPU هست.
3️⃣ با pids.max میتونیم تعداد پراسس هایی که داخل یک cgroup ایجاد میشن رو محدود کنیم. مثلاً مقدار 50 یعنی فقط ۵۰ پراسس مجاز هستن.
4️⃣ و در نهایت، با io.max میتونیم سرعت دسترسی به دیسک رو کنترل کنیم. مثلاً rbps=1048576 یعنی حداکثر سرعت خواندن از دیسک یک مگابایت بر ثانیه خواهد بود.
🧪 ایجاد یک cgroup
در این مرحله میخوایم بهصورت دستی یک cgroup بسازیم و محدودیت RAM را روی پراسس فعلی اعمال کنیم:
# ساخت دایرکتوری برای cgroup
sudo mkdir /sys/fs/cgroup/mycontainer
# تنظیم محدودیت حافظه (۵۱۲ مگابایت)
echo 536870912 | sudo tee /sys/fs/cgroup/mycontainer/memory.max
# افزودن پراسس جاری به این cgroup
echo $$ | sudo tee /sys/fs/cgroup/mycontainer/cgroup.procs
از این لحظه به بعد، پراسس فعلی فقطمجازه که از ۵۱۲ مگابایت RAM استفاده کنه.
🐳 و containerd کجای ماجراست؟
ابزارهای مدرنی مثل Docker، در پشت صحنه از
containerd
برای اجرای کانتینرها استفاده میکنن. این ابزار مسئولیت تنظیم cgroupها، namespaceها و mountها را بر عهده داره. ما اما در این مجموعه، سعی میکنیم این مفاهیم رو بهصورت مستقیم و بدون واسطه تجربه کنیم.✍️ جمع بندی
در پست بعدی، در مورد namespaceها توضیح میدیم؛ ابزاری که باعث میشه پراسس ها بتونن محیط مجزای خودشون رو داشته باشن (مثلاً PID یا network مجزا).
اگر سوالی درباره cgroups یا محدودسازی منابع داشتید توی کامنتها با ما در میون بزارید.
#️⃣ #linux #containers #cgroups #build_your_own_docker
➖➖➖➖➖➖➖➖➖➖
🐧 CHANNEL | GROUP
🔥4⚡1