خیلی خلاصه بخوایم بگیم داکر یک پلتفرم و مدیریت کانیتنر هستش و کارهای که قبلا به سختی انجام میشد و نیاز به دانش بالایی داشت رو برای ما راحت میکنه برای این که بفهمم داکر چیست اول باید بفهمیم کانتینر چیست؟
ما تو این پست با این موارد آشنا میشیم ، کانتینر ( container ) ، داکر ( Docker ) ، Docker hub و Union File System
چرا باید از container استفاده کنیم؟
فرض کنید شما یک سرور دارید. برای اجرای یک اسکریپت پایتونی، یک برنامه از کتابخانهای با ورژن 3.2 استفاده میکند، اما برنامه دیگر نیاز به ورژن 4.5 همان کتابخانه دارد. حالا چکار کنیم؟
-
- اگر آپدیت کنیم، برنامه اول خراب میشود.
-
- اگر آپدیت نکنیم، برنامه جدید اجرا نمیشود.
در پایتون از Virtual Environment استفاده میکنیم که محیط مجزایی برای هر برنامه ایجاد کند. حالا اگر بهجای سطح زبان برنامهنویسی، بخواهیم کانفیگ کل سرور را مدیریت کنیم، چه میشه؟
container چیست و چرا مهم است؟
اینجاست که container وارد ماجرا میشود! container شبیه همان محیط مجازی پایتون عمل میکند، اما در سطح سیستمعامل. با container ، هر برنامه سیستمفایل، شبکه و حتی تنظیمات خاص خودش را دارد، بدون اینکه با بقیه برنامهها تداخلی داشته باشد.
آیا هر کانتینر سیستمعامل خودش را دارد؟
نه دقیقاً! کانتینرها از هسته سیستمعامل (Kernel) مشترک استفاده میکنند. برخلاف ماشینهای مجازی که سختافزار کامل را شبیهسازی میکنند، داکر تنها فایلها و فرآیندهای موردنیاز را ایزوله میکند.
نگاه دقیقتری به کانتینر
همونطور که گفتیم ما در ماشین های مجازی سخت افزار رو تقسیم میکنیم و ماشین های مجازی که روی یک کامپیوتر هستن به فایل های هم دیگه دسترسی ندارن در کانتینرا هم ما همین عدم دسترسی رو داریم ، یعنی اگر 5 تا کانتینر روی یک سیستم داشته باشید این کانتینر ها به فایل های هم دیگه دسترسی ندارن
چطوری ؟ مگه روی یک سیستم نیستن ؟
در مثال پایتون که اول پست بهش اشاره شد شما حتی اگر برای پایتون یک محیط مجازی هم درست کنید باز به برنامه ها و فایل های کل سیستم میتونه دسترسی داشته باشه
اما با یکسری از قابلیت های سیستم عامل لینوکس میتونید محدودش کنید
حالا این یعنی چی ؟
شما هر برنامه ای که در لینوکس اجرا میکنید یا بهتره بگیم هر process یکسری دسترسی ها داره ، مثلا چقدر از cpu و ram استفاده کنه ، چه مجوز هایی داره، چه شبکه ای داشته باشه ، به چه فایل هایی دسترسی داره و یا اصلا چه دایرکتوری رو به عنوان دایرکتوری / بشناسه درواقع در کانتینر شما یک یا چند process رو ایزوله میکنید
Union File System
گفتم که شما وقتی که کانتینر میسازی درواقع دارید یک process رو ایزوله میکنید ، ولی این process نیاز به یکسری فایل داره ، دقیقا مثل همون مثلا پایتون ، شما وقتی یک برنامه به زبان پایتون مینویسید برنامه برای اجرا به یکسری فایل ها نیاز داره ، مثل کتابخونه ها یا خود پایتون
حالا بیاید فرض کنیم شما روی یک سیستم 40 تا Virtual environment ( محیط مجازی برای پایتون ) درست کردین و هر Virtual environment حدود 200 مگ فضای هارد رو اشغال میکنه ، شما برای اجرای این 40 تا Virtual environment به 8 گیگ فضا نیاز دارید ، حال اگر سرور شما کلا 10 گیگ هارد داشته باشه تقریبا هارد شما پر میشه
حالا ما همین مسئله رو در بحث کانتینر ها هم داریم
گفتیم که process ما باید ایزوله بشه که هر کاری کردیم داخل کانتینر روی سیستم یا برنامه های دیگه تاثیری نداشته باشه ، خب مسئله ای که هست هر process برای اجرا نیاز به یکسری فایل داره
در عکس بالا ما ساختار فایل سیستم لینوکس رو مشاهده میکنیم ، در حالت عادی ما وقتی یک برنامه رو در لینوکس اجرا میکنیم اگر به فایل یا دایکتوری نیاز داشته باشه به راحتی بهش دسترسی داره ، ولی ما در کانتینر چون process ها رو ایزوله کردیم به این فایل ها و دایرکتوری ها دسترسی ندارن
بنابراین ما باید یک کپی از تمام موارد ضروری بگیریم ، در یک دایرکتوری قرار بدیم و به این process ها بگیم که مثلا دایرکتوری x مسیر ریشه تو هستش و از اینجا باید دنبال فایل های خودت بگردی
حالا فرض کنید این مواردی که ما کپی کردیم 1 گیگ باشه
40 تا کانتینر یعنی 40 گیگ و حالا خود کانتینر هم میخواد برنامه ها و فایل های خودشو هم داشته باشه ، اینجاست که هارد کم میاریم !
استفاده از Union File System
فرض کنید در همون مثال پایتون ما 40 تا Virtual environment داریم و بین این 40 تا Virtual environment یکسری فایل ها بدون هیچ گونه تغییری بین همه مشترکه ، خب چرا کپی کنم ؟ میام به 40 تا Virtual environment که دارم میگم از فلان مسیر فایل x رو بخونید
اگر مثلا فایل x حدود 5 مگ باشه در 39 تا Virtual environment بعدی ما 5 مگ صرفه جویی کردیم که میشه 195 مگ
حالا اگر 20 تا فایل 5 مگی مشترک داشته باشم حدود 3.900 گیگ صرفه جویی کردیم ، یعنی 8 گیگی که اول گفتیم تقریبا نصف شده
در کانتینر هم همینه یکسری فایل سیستم مشترک هست که وقتی شما میخواید با داکر یک کانتینر درست کنید سعی میکنه از کانتینر های دیگه هم استفاده کنه که تا حد امکان فضا کمتری استفاده کنه
پس با تمام این توضحیات شما میتونید با کانتینر process ایزوله داشته باید که سیستم فایل و شبکه خودشونو دارن ، میتونید محدودشون کنید ، که چقدر cpu یا ram مصرف کنن و چقدر فضای ذخیره سازی داشته باشن و با Union File System میتونید حجمشونو کم کنید
برای مثال ما اگر روی سیستم خودمون یک نسخه از دیتابیس mysql رو نصب کنیم و فرداش روی همون سیستم یک برنامه دیگه داشته باشم که به نسخه دیگه ای از دیتابیس نیاز داشته باشه به مشکل بر میخوریم . تو اینجا خیلی ساده از کانتینر استفاده میکنیم و میتونید هر چندتا که نیاز هست mysql روی سیستم داشته باشیم بدون اینکه اختلالی ایجاد بشه ، جدای از این مورد دیگه دردسر کانفیگ های مختلف رو نداریم
یعنی چی که نیازی به کانفیگ نیست ؟!
تو مثال پایتون ما برنامه خودمونو مینوستیم و در کنارش یکسری کتابخونه هم داشتیم که تو برنامه نویسی کمکمون میکنه ، یعنی افرادی از قبل جای ما کد های خیلی زیاد رو نوشتن ، و ما خیلی ساده با دستور pipهر کتابخونه ای که بخوایم رو نصب میکنیم که جلوتر متوجه میشید چطوری میشه اینکارو با Docker hub انجام داد
داکر چیست ؟
تا به اینجای کار ما درباره کانتینر صحبت کردیم ، ولی چطوری درستش میکنن ؟
ساخت یک محیط ایزوله به صورت دستی کار سختیه و زمانبری هستش و همونطوری که در ابتدا هم گفته شد نیازه که دانش بالایی داشته باشید ، خب برای اینکه ما انقدر سختی نکشیم داکر درست شد ! داکر به ما کمک میکنه که خیلی راحت کانتینر بسازیم و مدیریتش کنیم و درگیر کارهای پیچیده نشیم
اینم رو هم بدونید ک داکر تنها نیست ! پلتفرم های دیگه ای هم ساخته شدن که میشه باهاشون کانتینر ها رو مدیریت کرد ، مثل Kubernetes ، Podman ، LXC اما درحال حاضر داکر محبوبتش از همه بیشتره و برخی هم برای استفاده های خاصی طراحی شدن
docker hub
مثل سایت pypi و github یک سایتی هم داریم به اسم docker hub ، تو این سایت مردم کانتینر های خودشونو به اشتراک میذارن
در خود داکر ما چیزی داریم به اسم image که شما میتونید از کانتینر خودتون یک image درست کنید و اونو در اختیار دیگران قرار بدین ، میخواید بریزید روی فلش و بدین به دوست یا همکارتون یا بذارید داخل سایت docker hub که همه استفاده کنن ، حالا برخی از این image ها نسخه های official هستن
یعنی نسخه های رسمی و تایید شده ، مثلا ما ایمیج MySQL داریم که خود شرکتش معرفی کرده ، یا ایمیج nginx داریم که تیم برنامه نویسش معرفی کرده ، به صورت عادی شما الان بخواید nginx رو نصب کنید کلی تنظیمات رو باید انجام بدین ، این تیم قبلا همه کارهای نصبش رو انجام داده و شما فقط ایمیج رو دانلود و استفاده میکنید و اگر نیازی هم شد تغییراتی روش میدین ، اصلا میتونید از تغییراتی که دادین یک ایمیج بگیرید تا بقیه استفاده کنن ، مثلا من nginx رو جوری تنظیم میکنم که برای استفاده django مناسب باشه
این یک توضیح مختصر درباره داکر بود ، توآموزش های بعدی یاد میگیری چطوری داکر رو نصب و ازش استفاده کنید
امیدوارم که این آموزش براتون مفید بوده باشه ، اگر سئوال یا نقدی داشتید حتما در کامنت ها مطرح کنید
اولین نفر باشید که نظر ارسال میکنید