صادق رئیس کرمی
صادق رئیس کرمی
خواندن ۳ دقیقه·۶ ماه پیش

آموزش داکر (قسمت اول: مفاهیم لینوکس)


کانتینر چیست؟

کانتینرها در لینوکس در واقع مجموعه‌ای از یک یا چند process هستند که از بقیه سیستم جدا و ایزوله شده‌اند. کانتینرها این قابلیت را به ما می دهند که application خود را همراه با تمام نیازمندی های زمان اجرا و فایل های مورد نیاز خود در کنار هم داشته باشیم، به این معنی که کانتینرهای لینوکس در حین مراحل توسعه، تست و در نهایت تولید، قابل جابجایی و سازگار هستند.

چرا باید از کانتینرهای لینوکس استفاده کنیم؟

تصور کنید در حال توسعه یک اپلیکیشن هستید و شما کارتان را روی لپ‌تاپ انجام می‌دهید و محیط شما تنظیمات خاصی دارد. دولوپرها ممکن است پیکربندی های متفاوتی داشته باشند. برنامه ای که در حال توسعه آن هستید به آن پیکربندی متکی است و به کتابخانه ها، وابستگی ها و فایل های خاصی نیاز دارد. در همین حال، کسب‌وکار شما دارای محیط‌های develop و production است که با پیکربندی‌های خاص خود و مجموعه فایل‌های پشتیبانی خود کانفیگ شده‌اند. شما می خواهید محیط های دیگری که دارید را تا جای ممکن شبیه محیط لوکال خود بکنید، اما بدون همه هزینه های کانفیگ محیط های سرور و غیره.
بنابراین، چگونه می‌توانید برنامه خود را در این محیط‌ها اجرا کنید، تست ها را با موفقیت انجام دهید و برنامه خود را بدون دردسر، دولوپ و دیباگ اجرا کنید؟ با استفاده از کانتینر ها.

مفهوم namespace در لینوکس

یکی از ویژگی های کرنل لینوکس namespace ها هستند که منابع سیستم را به گونه ای پارتیشن بندی می کنند که یک مجموعه از پراسس ها فقط مجموعه ای از منابع را می بینند، در حالی که مجموعه دیگری از پراسس ها، مجموعه متفاوتی از منابع را می بینند. به بیان دیگر؛ در واقع با استفاده از این ویژگی میتوان منابع را برای یک سری از پراسس ها ایزوله کرد.

در ادامه 4 مورد از مهم ترین آن ها را بررسی میکنیم:

  • PID

این namespace دقیقا خود process id ها را ایزوله میکند. در واقع در هر کانتینر می‌توان process hierarchy مجزایی داشته باشیم.

  • USER

این namespace آیدی های یوزر ها و گروه ها را ایزوله می‌کند. در واقع می‌توانیم داخل کانتینر یوزر روت داشته باشیم که بیرون از کانتینر، فقط یک یوزر عادی میباشد.

  • NETWORK

این namespace دستگاه های شبکه، جداول روتینگ، iptables و... را ایزوله می‌کند. بطور مثال هر کانتینر بتواند شبکه ی خودش را داشته باشد و بتوانیم روی یک سیستم همزمان دو کانتینر داشته باشیم که به پورت ۸۰ خودشان گوش می‌دهند.

  • MOUNT

این namespace ماونت پوینت ها را برای هر پراسس و کانتینر ایزوله می‌کند. در واقع هر کانتینر می‌تواند یک روت دایرکتوری متفاوت داشته باشد که بسیار امن تر از chroot میباشد زیرا در chroot امکان ایزوله کردن وجود ندارد.

مثالی از پراسس های مختلف در نیم اسپیس ها
مثالی از پراسس های مختلف در نیم اسپیس ها



با استفاده از دستور زیر میتوان در لینوکس یک namespace ساخت:

sudo unshare –pid–fork –mount-proc -- bash

همچنین با این دستور میتوانید لیست namespace ها را مشاهده کنید:

lsns --output-all

و در نهایت برای کاربرد های بیشتر میتوانید از دستور زیر استفاده کنید:

unshare –help

مفهوم control groups در لینوکس

یک cgroup یک ویژگی از کرنل لینوکس است که استفاده از منابع (CPU، حافظه، ورودی/خروجی دیسک، شبکه و غیره) مجموعه‌ای از پراسس ها را محدود می‌کند.

  • وظایف cgroup ها
  • RESOURCE LIMIT

شما می توانید یک cgroup را پیکربندی کنید تا میزان استفاده از یک ریسورس خاص (مثلاً حافظه یا CPU) را محدود کند.

  • PRIORITIZATION

شما می توانید کنترل کنید که یک پردازش چه مقدار از یک ریسورس (CPU، دیسک، یا شبکه) را می تواند در مقایسه با پراسس های موجود در cgroup دیگر زمانی که اختلاف منابع وجود دارد استفاده کند.

  • ACCOUNTING

محدودیت های ریسورس در سطح cgroup نظارت و گزارش می شوند.

  • CONTROL

می‌توانید وضعیت (تجمیع، توقف یا راه‌اندازی مجدد) همه پراسس های یک cgroup را با یک فرمان تغییر دهید.


در این مقاله سعی کردیم تا مفاهیم اولیه لینوکس که برای شروع کار با داکر ضروری هستند را پوشش دهیم.

در قسمت های بعدی, به بررسی جزئیات بیشتری از مفاهیم لینوکس در داکر و کاربرهای آن میپردازیم.

linuxdockercontainernamespacecgroups
Interested In DevOps
شاید از این پست‌ها خوشتان بیاید