اگر یک فرد فعال در حوزه نرمافزار باشید حتماً میدانید که یکی از ترندهایی که از حدود ده سال پیش بسیار محبوب شده است مبحث کانتینرها و داکر است. در این نوشته میخواهیم به طور ساده بگوییم که یک Container چیست و Container Orchestration یا همان سازماندهی Container ها به چه معناست.
کانتینر (Container) یک واحد نرمافزاری است که کد و تمام وابستگیهای آن را در خود جای داده است. در واقع کانتینر یک بسته سبکوزن و مستقل نرمافزار است که میتوان آن را اجرا کرد و تمام وابستگیها را نیز در خود جای داده و از محیط بیرون خود ایزوله است.
به این علت که کانتینرها ایزوله هستند میتوان کدها و نیازمندیهای هر بخش از کد (مثلاً هر میکروسرویس) را در یک کانتینر توسعه و نگهداری کرد. با وجود کانتینر دیگر نیازی به نصب سنگین پکیجهایی که لازم است روی سیستم اصلی نیست و داخل خود کانتینر تمام وابستگیهای آن بسته نرمافزاری وجود دارد. بنابراین میتوان کدها را بین سیستمهای مختلف و محیطهای با شرایط متفاوت و زیرساختهای گوناگون جابجا کرد و مشکلی پیش نیاید و بدون ایراد آن بسته نرمافزاری اجرا شود. کانتینرها تا قبل از پدید آمدن Docker نیز وجود داشتند اما این داکر بود که در واقع مفهوم کانتینرها را متحول کرد.
به صورت سنتی وقتی یک کد را یک تیم نرمافزاری میخواست بین دو محیط جابجا کند به علت کانفیگ متفاوت سیستم یا سرورها یا اینکه برخی پکیجها روی یکی نصب بود و روی دیگری نبود، مشکلاتی به وجود میآمد. با آمدن کانتینرها یک زیرساخت نسبتاً سبک و ایزوله برای توسعه یک قسمت از نرمافزار به همراه وابستگیهای لازم آن بخش فراهم شد. همه پروسههای یک بخش از نرمافزار مانند توسعه، نصب پکیجها و وابستگیهای مورد نیاز، تست و فرایند استقرار آن بخش توسط کانتینری که آن بخش را دارد قابل انجام است. همچنین با استفاده از کانتینرها اگر به هر دلیلی یکی از این کانتینرها دچار مشکل شود، تقریباً به بقیه کانتینرها آسیبی نمیرسد و دچار خطا نمیشوند. به همین دلایل است که امروزه معمولاً در همه تیمهای نرمافزاری استفاده از کانتینرها به یک فرهنگ متداول تبدیل شده است.
تا اکنون فهمیدیم که یک کانتینر چیست. حال ممکن است برای هر شخص در حوزه نرمافزار که به تازگی با این مفهوم آشنا شده سوال پیش بیاید که مگر قبلاً ماشینهای مجازی (Virtual Machines) یک سیستمعامل مستقل نداشتند که میشد پکیجهای مختلف روی آن به طور مستقل نصب کرد و سپس برای بیلد و استقرار نرمافزار نیز از آن استفاده کرد. پس کانتینرها چه مفهوم متفاوتی دارند؟
برای پاسخ به این سوال باید کمی به مفاهیم فنی کانتینرها وارد شویم. همان طور که پیش از این گفتیم، کانتینرها یک بسته نرمافزاری شامل وابستگیهای خود بودند که میتوانستند مستقلاً اجرا شوند. تفاوت اصلی کانتینرها با ماشین مجازی در اینجاست که تعداد زیادی کانتینر میتوانند در یک سیستم عامل و یک ماشین اجرا شوند. در واقع کانتینرهایی که در یک سیستمعامل در حال اجرا شدن هستند هسته (Kernel) سیستم عامل را با دیگر کانتینرهای موجود در آن ماشین، به اشتراک میگذارند. این کانتینرها به صورت فنی مانند پروسه (process) های مستقل از هم در فضای کاربر (user space) هستند. کانتینرها فضای بسیار کمی در حد چند ده مگابایت به خود اختصاص میدهند که در مقایسه با فضایی که VM ها نیاز دارند بسیار کمتر است.
از طرف دیگر VM ها یک ماشین مجازی هستند که هر یک سیستمعامل مخصوص به خود را دارند و در واقع این قابلیت را به توسعهدهندگان میدهند که یک سرور فیزیکی خود را به چندین سرور مجازی تبدیل کنند. هر یک از VM ها یک سیستمعامل کامل مخصوص به خود، اپلیکیشن و وابستگیها و کتابخانههای مخصوص به خود را دارند. VM ها فضایی در حد چندین گیگابایت نیاز دارند.
همانطور که تفاوت کانتینر با ماشین مجازی را دیدیم، باید بدانیم که به علت سرعت بیشتر به علت عدم نیاز به boot شدن سیستمعامل (چون سیستمعامل مخصوص به خود ندارند اصلاً!)، مقدار فضای مورد نیاز کمتر و کارایی بهتر و راحتتر و سبکتر، اکنون کانتینرها از ماشینهای مجازی محبوبتر و پراستفادهتر هستند. البته باید دقت کرد که ماشینهای مجازی و کانتینرها میتوانند در کنارهم استفاده شوند.
در ادامه به برخی مزایای کانتینرها اشاره میکنیم که باعث محبوب شدن آن شدهاند:
توسعهدهندگان وقتی نرمافزار خود را در یک کانتینر به صورت مستقل توسعه میدهند در واقع مزیت کاهش هزینههای استقرار (deploy) نرمافزار خود روی سرورهایی که در اختیار دارند را به علت عدم وابستگی به واحدی دیگر و عدم داشتن دغدغه پلتفرم مناسب به دست میآورند. این مزیت کمک میکند که کارایی و چابکی تیم توسعه بالاتر برود و ارتباط راحتتری با تیم DevOps داشته باشند.
کانتینرها دارای یک فرمت استاندارد برای پکیج کردن یک نرمافزار و قرار دادن تمامی وابستگیها در آن هستند. همچنین این کانتینرها به صورت مستقل قابل اجرا، تست و استقرار هستند که باعث فراموشی مشکل سنتی اجرا نشدن بخشی از نرمافزار روی سروری دیگر شدهاند. همچنین با استفاده از کانتینرها دیگر پلتفرم و فضای ابری خاصی مورد نیاز نیست و قابل اجرا روی سیستمهای گوناگون هستند.
به این خاطر که کانتینرها مانند VM ها سنگین نیستند و نیاز به سیستمعامل مستقل ندارند، تعداد زیادی کانتینر میتوانند صرفاْ روی یک ماشین، سیستم یا زیرساخت قابل اجرا باشند. این سبکی به توسعهدهندگان و افراد مرتبط با نرمافزار در حال توسعه کمک میکند که با سرعت بالایی بتوانند نرمافزار را اسکیل کنند یا حتی از اسکیل آن بکاهند.
چون کانتینرها واحدهایی مستقل هستند که از محیط پیرامون خود ایزولهاند میتوان امنیت بیشتری نسبت به VM ها برای آنها متصور بود.
سازماندهی یا ارکستراسیون کانتینرها یعنی فرایند مدیریت، اسکیل پذیری، نگهداری و استقرار کانتینرها خودکار سازی شود. برای این منظور ابزارهای مختلفی که به آنها سازمانده (orchestrator) گفته میشود مانند Kubernetes و Docker Swarm وجود دارد.
به علت این که کانتینرها سبک هستند تعداد زیادی از آنها میتوانند روی یک سیستم نصب شوند که اگر این فرایند به صورت دستی انجام شود، در سیستمهای بزرگ به علت پیچیدگیهای متعدد، نگهداری و مدیریت این کانتینرها برای تیمهای مختلف مخصوصاً تیم DevOps بسیار مشکل خواهد شد. این جاست که ابزارهایی مانند Kubernetes و Docker Swarm کمک میکنند که مدیریت این کانتینرها به صورت دستی انجام نشود بلکه خودکار سازی مدیریت و پیکربندی آنها صورت پذیرد. البته باید دقت کرد که Orchestration میتواند شامل خودکارسازی چندین بخش باشد نه فقط خودکار سازی یک بخش و تفاوت آن با خودکارسازی صرف، در این موضوع است.
همان طور که دیدیم در سیستمهای بزرگ تقریباً بدون یک orchestrator نمیتوان انواع کانتینرها را مدیریت و نگهداری کرد. اکنون میخواهیم بگوییم چرا باید از ابزارهایی مانند Docker Swarm استفاده کنیم.
مهمترین دلیل و سود استفاده از ابزارهای مربوط به سازماندهی کانتینرها، همین سادهشدن عملیاتهاست که بدون استفاده از آنها پس از اضافه شدن هر کانتینر مقداری پیچیدگی به نرمافزار اضافه شده که ممکن است غیرقابل کنترل شود.
ابزارهای سازماندهی کانتینرها میتوانند به صورت اتوماتیک یک کانتینر را دوباره راهاندازی یا آن را اسکیل کنند.
این ابزارها میتوانند به دلیل کاهش دخالت انسان در فرایند مدیریت داکرها از خطاها جلوگیری یا پیشگیری کنند و در واقع امنیت مضاعفی برای کانتینرها فراهم آورند.
در این بخش با دو تا از مهمترین ابزارهای مرتبط با سازماندهی و پیکربندی کانتینرها آشنا میشویم. اول درباره Kubernetes صحبت میکنیم و بعد سراغ Docker Swarm میرویم.
ابزار kubernetes یک ابزار متنباز برای orchestration کانتینرهاست که با استفاده از آن میتوان کانتینرها را مدیریت و اسکیل کرد و استقرار داد. به این ابزار به صورت مخفف k8s نیز گفته میشود.
این ابزار وقتی به کار میآید که تعداد زیادی کانتینر که ممکن است در سرورهای مختلفی مستقر باشند داریم و میخواهیم آنها را مدیریت کنیم. به این منظور kubernetes به توسعهدهندگان و متخصصان DevOps، یک API ارائه میدهد که میتوان با آن کنترل کرد که هر کانتینر چگونه و کجا ران شود.
این ابزار با توجه به میزان منابع موجود در هر سرور و اینکه هر کانتینر به چه میزان از منابع احتیاج دارد، آنها را بین سرورها و ماشینهای مجازی مختلف پخش و پیکربندی میکند. به گروهی از کانتینرها در ادبیات kubernetes، نام pod داده میشود که در واقع واحد عملیاتی برای kubernetes است. همچنین ابزار kubernestes میتواند به صورت اتوماتیک مواردی مانند میزان منابع اختصاص دادهشده و load سرورها را track میکند و سپس میتواند بر این اساس عملیات پیکربندی کانتینرها را انجام دهد. همچنین kubernetes به صورت اتوماتیک میزان سلامت هر منبع را چک میکند و میتواند مثلا با restart کردن یک کانتینر سلامت آن را به حالت عادی برگرداند.
این ابزار نیز مانند kubernetes برای مدیریت و پیکربندی و اسکیل container هاست. این ابزار برای موتور داکر نوشته شده و API مخصوص به خود را دارد. به صورت بسیارعالی با docker compose یکپارچه میشود و تمام امکاناتی که در کانتینرهای داکر وجود دارد در Swarm نیز قابل استفاده است. البته کمی کاستوم کردن آن ممکن است مشکل زا باشد و همه امکانات kubernetes را نیز ندارد. مثلاً docker swarm به طور پیشفرض امکانات پایش (monitoring) اتفاقاتی که میافتد را ندارد و باید از طریق کتابخانهها این مورد به docker swarm اضافه شود در حالی که kubernetes این امکانات را داراست.
شرکتهایی مانند فندق، ابرآروان و ایران هاست خدمات Docker ارائه میدهند.
شرکت فندق با ارائه یک زیرساخت و سرویسهای مدیریت شده به کاربران خود امکانات کامل و در عین حال ساده برای مدیریت میدهد.
شرکت ابرآروان نیز با ارائه سرویسهای ابری مبتنی بر داکر و کانتینرها، به استارتاپها و صاحبان کسب و کار اجازه میدهد که سیستمهای امن و سریع مبتنی بر کانتینر ابری داشته باشند.
شرکت ایران هاست نیز داکر اختصاصی ارائه میدهد که شامل اکثر image ها و برنامههای معروف و کاربردی است.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.