کانتینرها در لینوکس در واقع مجموعهای از یک یا چند process هستند که از بقیه سیستم جدا و ایزوله شدهاند. کانتینرها این قابلیت را به ما می دهند که application خود را همراه با تمام نیازمندی های زمان اجرا و فایل های مورد نیاز خود در کنار هم داشته باشیم، به این معنی که کانتینرهای لینوکس در حین مراحل توسعه، تست و در نهایت تولید، قابل جابجایی و سازگار هستند.
تصور کنید در حال توسعه یک اپلیکیشن هستید و شما کارتان را روی لپتاپ انجام میدهید و محیط شما تنظیمات خاصی دارد. دولوپرها ممکن است پیکربندی های متفاوتی داشته باشند. برنامه ای که در حال توسعه آن هستید به آن پیکربندی متکی است و به کتابخانه ها، وابستگی ها و فایل های خاصی نیاز دارد. در همین حال، کسبوکار شما دارای محیطهای develop و production است که با پیکربندیهای خاص خود و مجموعه فایلهای پشتیبانی خود کانفیگ شدهاند. شما می خواهید محیط های دیگری که دارید را تا جای ممکن شبیه محیط لوکال خود بکنید، اما بدون همه هزینه های کانفیگ محیط های سرور و غیره.
بنابراین، چگونه میتوانید برنامه خود را در این محیطها اجرا کنید، تست ها را با موفقیت انجام دهید و برنامه خود را بدون دردسر، دولوپ و دیباگ اجرا کنید؟ با استفاده از کانتینر ها.
یکی از ویژگی های کرنل لینوکس namespace ها هستند که منابع سیستم را به گونه ای پارتیشن بندی می کنند که یک مجموعه از پراسس ها فقط مجموعه ای از منابع را می بینند، در حالی که مجموعه دیگری از پراسس ها، مجموعه متفاوتی از منابع را می بینند. به بیان دیگر؛ در واقع با استفاده از این ویژگی میتوان منابع را برای یک سری از پراسس ها ایزوله کرد.
در ادامه 4 مورد از مهم ترین آن ها را بررسی میکنیم:
این namespace دقیقا خود process id ها را ایزوله میکند. در واقع در هر کانتینر میتوان process hierarchy مجزایی داشته باشیم.
این namespace آیدی های یوزر ها و گروه ها را ایزوله میکند. در واقع میتوانیم داخل کانتینر یوزر روت داشته باشیم که بیرون از کانتینر، فقط یک یوزر عادی میباشد.
این namespace دستگاه های شبکه، جداول روتینگ، iptables و... را ایزوله میکند. بطور مثال هر کانتینر بتواند شبکه ی خودش را داشته باشد و بتوانیم روی یک سیستم همزمان دو کانتینر داشته باشیم که به پورت ۸۰ خودشان گوش میدهند.
این namespace ماونت پوینت ها را برای هر پراسس و کانتینر ایزوله میکند. در واقع هر کانتینر میتواند یک روت دایرکتوری متفاوت داشته باشد که بسیار امن تر از chroot میباشد زیرا در chroot امکان ایزوله کردن وجود ندارد.
با استفاده از دستور زیر میتوان در لینوکس یک namespace ساخت:
sudo unshare –pid–fork –mount-proc -- bash
همچنین با این دستور میتوانید لیست namespace ها را مشاهده کنید:
lsns --output-all
و در نهایت برای کاربرد های بیشتر میتوانید از دستور زیر استفاده کنید:
unshare –help
یک cgroup یک ویژگی از کرنل لینوکس است که استفاده از منابع (CPU، حافظه، ورودی/خروجی دیسک، شبکه و غیره) مجموعهای از پراسس ها را محدود میکند.
شما می توانید یک cgroup را پیکربندی کنید تا میزان استفاده از یک ریسورس خاص (مثلاً حافظه یا CPU) را محدود کند.
شما می توانید کنترل کنید که یک پردازش چه مقدار از یک ریسورس (CPU، دیسک، یا شبکه) را می تواند در مقایسه با پراسس های موجود در cgroup دیگر زمانی که اختلاف منابع وجود دارد استفاده کند.
محدودیت های ریسورس در سطح cgroup نظارت و گزارش می شوند.
میتوانید وضعیت (تجمیع، توقف یا راهاندازی مجدد) همه پراسس های یک cgroup را با یک فرمان تغییر دهید.
در این مقاله سعی کردیم تا مفاهیم اولیه لینوکس که برای شروع کار با داکر ضروری هستند را پوشش دهیم.
در قسمت های بعدی, به بررسی جزئیات بیشتری از مفاهیم لینوکس در داکر و کاربرهای آن میپردازیم.