داکر چیست؟داکرفایل چیست؟ کانتینر ها چه هستند؟چگونه با داکرفایل یک کانتینر می سازیم؟ در این مقاله به همه این سوالات پاسخ دادیم.
داکر یک بستر نرم افزاری برای ساخت برنامه های کاربردی مبتنی بر کانتینر است . (.محیط های اجرای کوچک و سبک که از هسته سیستم عامل به صورت مشترک استفاده می کنند.) اما در عین حال جدا از یکدیگر اجرا می شوند. در حالی که کانتینرها به عنوان یک مفهوم از مدتی قبل وجود داشته اند . یک پروژه منبع باز Docker که در سال 2013 آغاز به کار کرد ، به محبوبیت این فن آوری کمک کرد و به ایجاد روند توسعه کانتینر و ریز سرویس ها در توسعه نرم افزار که به عنوان ابر بومی شناخته می شود ، کمک کرد.
یکی از اهداف توسعه نرم افزار مدرن این است که برنامه ها روی همان هاست یا کلاستر اما جدا از یکدیگر باقی بمانند تا بی جهت در عملکردو یا تعمیر و نگهداری یکدیگر اختلال ایجاد نکنند. به لطف بسته ها ، کتابخانه ها و سایر مولفه های نرم افزاری که برای اجرای آنها لازم است . این کار بسیار دشوار است. یک راه حل برای این مشکل ماشین های مجازی بوده است . که برنامه ها را روی همان سخت افزار کاملاً جدا نگه می دارد و اختلافات بین اجزای نرم افزار و رقابت برای استفاده از منابع سخت افزاری را به حداقل می رساند. اما ماشین های مجازی حجیم هستند – هرکدام به سیستم عامل خاص خود نیاز دارند . بنابراین اندازه آن معمولاً گیگابایت است و نگهداری و ارتقا آنها دشوار است.
در مقابل ، کانتینرها محیط اجرای برنامه ها را از یکدیگر جدا می کنند . اما هسته اصلی سیستم عامل شما را به اشتراک می گذارند. آنها معمولاً در مگابایت اندازه گیری می شوند . از منابع بسیار کمتری نسبت به ماشین های مجازی استفاده می کنند و تقریباً بلافاصله راه اندازی می شوند. می توان آنها را بسیار متراکم تر از همان سخت افزار بسته بندی کرد. و با تلاش کمتر به صورت دسته جمعی بالا و پایین آورد. کانتینرها مکانیزمی بسیار کارآمد برای ترکیب اجزای نرم افزار در انواع برنامه ها و سرویس های مورد نیاز ارایه می دهند و به روز نگه داشتن و نگهداری مولفه های نرم افزار را بسیار آسان می کنند.
Docker یک پروژه منبع باز است که ایجاد کانتینر و برنامه های مبتنی بر کانتینر را آسان می کند. در ابتدا برای لینوکس ساخته شده است ، اکنون Docker روی ویندوز و MacOS نیز اجرا می شود. برای درک نحوه کارکرد Docker ، بیایید نگاهی به برخی از اجزایی که برای ایجاد برنامه های حاوی Docker استفاده می کنید بیاندازیم.
هر کانتینر Docker با یک داکرفایل شروع می شود . داکرفایل یک فایل متنی است که به شکل قابل فهم نوشته شده است. داکرفایل شامل دستورالعمل های ساخت ایمیج Docker است. یک داکرفایل سیستم عاملی را مشخص می کند که در کنار آن زبانها ، متغیرهای محیطی ، مکان پرونده ها ، پورت های شبکه و سایر اجزای مورد نیاز ، پایه و اساس کانتینر قرار خواهد گرفت – و البته اینکه کانتینر در صورت اجرای آن داکرفایل در واقع چه کاری انجام می دهد.
هنگامی که داکرفایل خود را نوشتید ، از برنامه Docker بیلد را فراخوانی می کنید تا ایمیجی را براساس آن داکرفایل ایجاد کنید. در حالی که داکرفایل مجموعه دستورالعملهایی است که نحوه ساخت ایمیج را بیان می کند . ایمیج Docker یک فایل قابل حمل است که شامل مشخصات اجزای نرم افزار و نحوه اجرای آن است. از آنجا که یک داکرفایل احتمالاً شامل دستورالعمل هایی در مورد گرفتن برخی از بسته های نرم افزاری از مخازن آنلاین است ، باید دقت کنید که نسخه های مناسب آن را صریحاً در داکرفایل مشخص کنید .در غیر این صورت ممکن است بسته به زمان فراخوانی ، داکرفایل شما ایمیج های متناقضی تولید کند. اما هنگامی که یک ایمیج ایجاد می شود ، دیگر آن ثابت است.
Docker run دستوری است که در واقع یک کانتینر را راه اندازی می کند. هر کانتینر نمونه ای از یک ایمیج است. کانتینرها بصورت گذرا و موقتی طراحی شده اند اما می توان آنها را متوقف و دوباره راه اندازی کرد . در این صورت کانتینر در همان حالت متوقف شده دوباره راه اندازی می شود. بعلاوه ، چندین نمونه کانتینر از یک ایمیج به طور همزمان قابل اجرا هستند .(به شرطی که هر کانتینر یک نام خاص داشته باشد).
در حالی که ساخت کانتینر آسان است ، تصور نکنید که برای ساختن هر یک از ایمیج های خود باید از ابتدا شروع کنید. Docker Hub یک مخزن SaaS برای به اشتراک گذاری و مدیریت کانتینرها است ، که در آن ایمیج های رسمی Docker از پروژه های منبع باز و فروشندگان نرم افزار و ایمیج های غیر رسمی از عموم مردم را پیدا خواهید کرد. می توانید ایمیج های کانتینر حاوی کد به درد بخور برای خود را بارگیری کنید ، یا ایمیج های خود را بارگذاری کنید ، به صورت آزاد به اشتراک بگذارید یا حتی به طور خصوصی ارایه کنید. در صورت تمایل می توانید یک رجیستری محلی Docker نیز ایجاد کنید . (Docker Hub در گذشته با ایمیج هایی که با بک دور(ابزاری برای نفوذ به سیستم) تعبیه شده اند بارگذاری شده اند) با مشکلاتی روبرو شده بود.
Docker Engine هسته اصلی Docker است .فناوری اصلی سرویس گیرنده و سرور که کانتینرها را ایجاد و اجرا می کند. به طور کلی ، وقتی کسی حرفی از داکر می زند و در مورد شرکت یا پروژه کلی صحبت نمی کند . منظور آنها موتور داکر است. دو نسخه مختلف از Docker Engine در دسترس است: Docker Engine Enterprise و Docker Engine Community .
Docker نسخه Enterprise خود را در سال 2017 منتشر کرد . اما پیشنهاد اصلی آن که به Docker Community Edition تغییر نام یافت . همچنان منبع باز و رایگان است و هیچ ویژگی را در این روند از دست نداد. در عوض ، Enterprise Edition که هزینه آن برای هر نود 1500 دلار در سال است . ویژگی های پیشرفته مدیریتی شامل کنترل برای مدیریت کلاستر و ایمیج و نظارت بر آسیب پذیری ایمیج را به آن اضافه کرد.
این ایده که یک پروسه معین را می توان با انزوا از بقیه محیط سیستم اجرا کرد . برای چندین دهه در سیستم عامل های یونیکس مانند BSD و Solaris تعبیه شده است. فناوری اصلی کانتینر لینوکس ، LXC ، یک روش مجازی سازی در سطح سیستم عامل برای اجرای چندین سیستم جداگانه لینوکس در یک میزبان است. LXC توسط دو ویژگی لینوکس امکان پذیر شده است: namespaces ، که مجموعه ای از منابع سیستم را جمع می کند. و آنها را به پروسه ای ارائه می دهد تا به نظر برسد که به آن پروسه اختصاص یافته اند. و cgroups ، که بر جدا کردن و استفاده از منابع سیستم ، مانند CPU و حافظه ، برای گروهی از فرآیندها حاکم هستند.
کانتینرها برنامه ها را از سیستم عامل ها جدا می کنند .به این معنی که کاربران می توانند یک سیستم عامل لینوکس تمیز و کوچک داشته باشند و سایر موارد را در یک یا چند کانتینر ایزوله اجرا کنند. و به دلیل انتزاع سیستم عامل از کانتینرها ، می توانید یک کانتینر را به سرورهای مختلف لینوکس که محیط آن کانتینر را پشتیبانی می کنند انتقال دهید.
داکر چندین تغییر قابل توجه در LXC ایجاد کرد که باعث می شود کانتینرها قابل استفاده و انعطاف پذیرتر باشند. با استفاده از کانتینرهای Docker . می توانید کار را با سرعت و سهولت بیشتری نسبت به آنچه با استفاده از ماشین های مجازی انجام دهید به عمل بیاورید. بارگیری ، تکثیر ، جابجایی و پشتیبان تهیه کنید. Docker انعطاف پذیری شبه ابر را به هر زیرساختی که قابلیت راه اندازی کانتینر را داشته باشد به ارمغان می آورد. ابزار ایمیج کانتینر Docker همچنین پیشرفتی نسبت به LXC بود که به توسعه دهنده اجازه می داد کتابخانه هایی از ایمیج ها بسازد ، از چندین ایمیج برنامه بسازد و آن کانتینر و برنامه ها را در زیرساخت های محلی یا راه دور راه اندازی کند.
Docker Compose ، Docker Swarm و Kubernetes
Docker همچنین هماهنگی بین کانتینرها را آسانتر می کند . بنابراین با قرار دادن کانتینرها روی هم ، پشته های برنامه را می سازد. Docker Compose توسط Docker ایجاد شده است تا روند توسعه و آزمایش برنامه های چند کانتینری را ساده کند. این یک ابزار خط فرمان است ، که یادآور داکر ساده است . و یک فایل توصیفگر قالب بندی شده خاص را برای جمع آوری برنامه ها از چندین کانتینر و اجرای آنها به صورت هماهنگ بر روی یک هاست مهیا می کند.
نسخه های پیشرفته تری از این رفتارها – که container orchestration نامیده می شود . توسط محصولات دیگری مانند Docker Swarm و Kubernetes ارائه می شود . اما داکر اصول اولیه را ارائه می دهد. با اینکه Swarm از پروژه Docker بیشتر رشد کرد و از آن خارج شد . Kubernetes به عنوان پلتفرم انتخابی Docker شناخته شده است.
کانتینرهای داکر روشی را برای ساخت برنامه های شرکتی و تجارتی ارائه می دهند .که جمع آوری ، نگهداری و جابجایی آنها آسان تر از نمونه های معمولی آنها است.
کانتینرهای داکر برنامه ها را نه تنها از یکدیگر ، بلکه از سیستم عامل نیز جدا می کنند. این امر نه تنها باعث ایجاد پشته نرم افزاری تمیزتر می شود . بلکه به راحتی می توان نحوه استفاده یک برنامه کانتینرایز شده از منابع سیستم – CPU ، GPU ، حافظه ، I / O ، شبکه و غیره را تعیین کرد. همچنین می توان از جدا بودن داده ها و کد مطمعن بود.
یک کانتینر Docker بر روی هر دستگاهی که از محیط داکر پشتیبانی می کند ، کار می کند. لازم نیست برنامه ها به سیستم عامل میزبان گره خورده باشند . بنابراین هم محیط برنامه و هم محیط سیستم عامل اصلی را می توان تمیز نگه داشت.
به عنوان مثال ، یک کانتینر MySQL برای لینوکس در اکثر سیستم های لینوکس که از کانتینرها پشتیبانی می کنند اجرا می شود. تمام وابستگی های برنامه معمولاً در یک کانتینر قرار می گیرند.
برنامه های مبتنی بر کانتینر را می توان به راحتی از سیستم های روشن به محیط های ابری یا از لپ تاپ های برنامه نویسان به سرورها منتقل کرد . به شرطی که سیستم هدف از Docker و سایر ابزارهای شخص ثالثی که ممکن است از آن استفاده شود پشتیبانی کند ، مانند Kubernetes .
به طور معمول ، ایمیج های کانتینر داکر باید برای یک سیستم عامل خاص ساخته شوند. به عنوان مثال یک کانتینر ویندوز در لینوکس اجرا نمی شود و بالعکس. پیش از این ، یکی از راه های دور کردن این محدودیت ، راه اندازی یک ماشین مجازی بود که نمونه ای از سیستم عامل مورد نیاز را اجرا می کرد و کانتینر را در ماشین مجازی اجرا می کرد.
با این حال ، تیم Docker از آن زمان راه حل ظریف تری به نام Manifest را ابداع کرده است. که به شما امکان می دهد تصاویر چندین سیستم عامل در یک ایمیج کنار هم قرار دهید. مانیفست ها هنوز در مرحله آزامایش در نظر گرفته می شوند . اما آنها نشان می دهند که چگونه کانتینرها می توانند به عنوان یک راه حل کاربردی برای کراس پلتفرم استفاده شوند.
بیشتر برنامه های تجاری از چندین مولفه جداگانه در پشته تشکیل شده اند . وب سرور ، پایگاه داده ، حافظه پنهان در حافظه. کانتینر امکان ترکیب این اجزا را به صورت یک واحد کاربردی با اجزای قابل تغییربه شکل آسان فراهم می کند. هر جز توسط کانتینتر متفاوتی تهیه می شود و می تواند مستقل از اجزای دیگر نگهداری ، به روز ، عوض و یا اصلاح شود.
این را مدل ریز سرویس ها از طراحی برنامه می نامند . با تقسیم قابلیت های کاربردی به سرویس های مجزا و خودمختار ، مدل ریز سرویس ها پادزهری برای کند بودن فرایندهای توسعه سنتی و برنامه های یکپارچه انعطاف ناپذیر ارائه می دهد. کانتینرهای سبک و قابل حمل – ساخت و نگهداری برنامه های مبتنی بر ریز خدمات را آسان می کنند.
از آنجا که کانتینرها سبک هستند و بار کمی را تحمیل می کنند ، امکان راه اندازی تعداد بیشتری از آنها در یک سیستم عامل وجود دارد. اما همچنین می توان از کانتینرها برای مقیاس گذاری یک برنامه در میان کلاستر های سیستم و افزایش سطح یا پایین آوردن تقاضا برای صرفه جویی از منابع استفاده کرد.
بیشتر نسخه های سازمانی ابزارهای استقرار ، مدیریت و مقیاس پذیزی کانتینرها از طریق پروژه های شخص ثالث ارائه می شود. اصلی ترین آنها Kubernetes گوگل است ، سیستمی برای خودکار کردن نحوه استقرار و مقیاس بندی کانتینرها ، همچنین نحوه اتصال ، تعادل بار و مدیریت آنها. Kubernetes همچنین روش هایی را برای ایجاد و استفاده مجدد از برنامه های چند کانتینری یا .”نمودارهای Helm”. ارائه می دهد تا پشته های پیچیده برنامه در صورت تقاضا ساخته و مدیریت شود.
Docker همچنین شامل سیستم ارکستراسیون داخلی خود ، حالت Swarm است که هنوز هم تقاضای آن چنانی برای استفاده از آن وجو ندارد. همانطور که گفته شد ، Kubernetes به عنوان گزینه اول انتخاب شده است. در واقع ، Kubernetes همراه با نسخه اصلی Docker است.
کانتینر بسیاری از مشکلات را برطرف می کنند ، اما همه آنها را خیر. برخی از نقایض آن از نظر طراحی است ، در حالی که برخی دیگر نقایض طراحی محصولات جانبی آن است.
رایج ترین اشتباه مفهومی مردم با کانتینر این است که آنها را با ماشین های مجازی برابر می کنند. با این حال ، از آنجا که کانتینرها و ماشین های مجازی از مکانیزم های مختلف جداسازی استفاده می کنند ، مزایا و معایب آنها کاملاً متفاوت است.
ماشین های مجازی درجه بالایی از ایزوله را برای فرآیندها ایجاد می کنند ، زیرا آنها در سیستم عامل خود اجرا می شوند. آن سیستم عامل نیز لزوماً همان موردی نیست که روی هاست اجرا می شود. یک ماشین مجازی ویندوز می تواند از طریق یک Hypervisor لینوکس و بالعکس اجرا شود.
در مقابل ، کانتینرها از قسمتهای کنترل شده از منابع سیستم عامل میزبان استفاده می کنند. بسیاری از برنامه ها به طور کاملاً مدیریت شده از هسته مشابه سیستم عامل استفاده می کنند. در نتیجه ، برنامه های حاوی کانتینر کاملاً جدا از ماشین های مجازی نیستند ، اما ایزوله ی کافی را برای اکثر قریب به اتفاق حجم کار فراهم می کنند.
کانتینرها تقریباً سرباری ماشین های مجازی را ندارند اما تأثیر عملکرد آنها بر سیستم عامل همچنان قابل توجه است . اگر کاری دارید که به سرعت بالا نیاز دارد ، یک کانتینر ممکن است شما را به اندازه کافی نزدیک کند .- بسیار نزدیکتر از یک ماشین مجازی -. اما هنوز هم کی سرباری بر سیستم خود خواهید دید.
کانتینرها از ایمیجی که محتوای آنها را توصیف می کند ، راه اندازی و اجرا می شوند. آن ایمیج به طور پیش فرض غیر قابل تغییر است – یعنی پس از ایجاد ، تغییر نمی کند.
در نتیجه ، کانتینر ها ماندگاری ندارند. اگر یک نمونه کانتینر را شروع کردید . آن را کامل پاک کنید و دوباره راه اندازی کنید ، نمونه کانتینر جدید هیچکدام از اطلاعات مربوط به نمونه قدیمی را نخواهد داشت.
این دیگر تفاوت کانتینر ها با ماشین های مجازی است. یک ماشین مجازی به طور پیش فرض در طول مراحل ماندگاری دارد ، زیرا دارای سیستم فایل خاص خود است. با یک کانتینر ، تنها چیزی که باقی می ماند ایمیجی است که برای راه اندازی نرم افزاری که در کانتینر قرار دارد استفاده می شود. تنها راه تغییر آن ایجاد ایمیج جدید و اصلاح شده از کانتینر است.
از طرف مثبت ، بی حالت بودن کانتینر ها باعث می شود محتوای کانتینر ها سازگارتر باشد. و ترکیب آنها به طور قابل پیش بینی در پشته های برنامه راحت تر باشد. همچنین توسعه دهندگان را مجبور می کند داده های برنامه را از کد برنامه جدا نگه دارند.
اگر می خواهید کانتینر هر نوع حالت ماندگاری داشته باشد ، باید آن اطالعات را در جای دیگری قرار دهید. این می تواند یک پایگاه داده یا یک فضای ذخیره سازی مستقل باشد که در زمان راه اندازی به کانتینر متصل می شود.
من قبلاً اشاره کردم که چگونه کانتینر ها برای ایجاد برنامه های ریز سرویس ها خود را اجاره می دهند.اما این بدان معنا نیست که استفاده از یک برنامه و قرار دادن آن در یک کانتینر باعث ایجاد خودکار یک ریز سرویس می شود. یک برنامه ریز سرویس ، خواه در کانتینر ها مستقر شده باشد یا نه . باید طبق الگوی طراحی ریز سرویس ساخته شود. این است که می توان با کانتینرایز کردن یک برنامه به عنوان بخشی از فرآیند تبدیل آن به یک میکروسرویس قدم برداشت. اما این تنها یک قدم از بسیاری از قدمهای بعدی است.
هنگامی که ماشین های مجازی آمدند . امکان جدا کردن برنامه ها از سیستم هایی که روی آنها کار می کردند ،را ایجاد کردند. کانتینرهای داکر این ایده را چند مرحله جلوتر می برند . نه تنها با داشتن وزن سبک تر ، قابل حمل تر و سریعتر از ماشین های مجازی ، بلکه با ارائه مقیاس بندی ، ترکیب و ویژگی های مدیریتی که ماشین های مجازی قادر به انجامش نیستند.
برای آموزش کامل داکر به دوره دوبله شده آموزش جامع داکر توسط تیم یودمی ایران مراجعه کنید.