Docker چیست؟
Docker از زمان انتشار آن در سال 2012، به یکی از فناوریهای در حال رشد سریع در حوزهی Devops و توسعه وب تبدیل شدهاست. با این حال، مانند دیگر تکنولوژیهای جدید، هنوز در حال توسعه است، دارای محدودیت هایی بوده و برای تمام پروژهها مناسب نیست. در این مقاله نمایی کلی از مزایا و معایب Docker را بیان میکنیم تا شما بتوانید تصمیم بگیرید که برای پروژهی شما، استفاده از آن روش مناسبی میباشد یا خیر.
مزایای Docker
۱. تکرارپذیری:
یک برنامهی جاوا در هر دستگاهی است که قادر به اجرای یک ماشین مجازی جاوا باشد، دقیقا به صورت مشابه قابل اجراست. اجرای Docker نیز همانند جاوا، در هر سیستمی که میتواند Docker را اجرا کند، تضمین شده است. مشخصات دقیق container در یک فایل Dockerfile ذخیره میشود. با توزیع این فایل در بین اعضای تیم، یک سازمان میتواند تضمین کند که تمام فایلهای image ساخته شده با همان Dockerfile یکسان کار میکنند. علاوه بر این، داشتن محیطی ثابت و مستند، باعث میشود که track کردن اپلیکیشن شما و شناسایی مشکلات آسان تر شود.
۲. جداسازی:
متعلقات و تنظیمات یک container، روی برنامههای دیگر رایانهی شما تاثیر نمیگذارند. حتی اگر یک container دیگر نیز همزمان درحال اجرا باشد. با استفاده از containerهای جداگانه برای هر جزء یک برنامه (به عنوان مثال یک وب سرور، رابط کاربری و یا پایگاه داده برای میزبانی یک وبسایت)، میتوانید از مغایرت متعلقات جلوگیری کنید. شما همچنین میتوانید پروژه های متعددی را در یک سرور داشته باشید بدون آنکه نگران مغایرتها باشید.
۳. امنیت:
جداسازی اجزای مختلف یک برنامه بزرگ در containerهای مختلف میتواند مزایای امنیتی داشته باشد. برای مثال اگر یک container به خطر بیافتد دیگران امن باقی می مانند. به یاد داشته باشید که Docker در مباحث امنیتی دارای معایبی نیز میباشد که در ادامه ذکر خواهیم کرد.
۴. Docker Hub:
برای موارد رایج و ساده استفاده میشود، مانند یک استک LAMP. توانایی ذخیره image و انتقال آنها به Docker Hub به این معنی است که همیشه تعداد زیادی image که به خوبی میتوان آنها را مدیریت و کنترل کرد، در دسترس هستند. اینکه بتوانیم به راحتی یک image را دریافت و تغییر داده و آن را build کنیم، بسیار به سرعت و سهولت روند راهاندازی کمک میکند.
۵. مدیریت محیط:
Docker مدیریت و نگهداری ورژنهای مختلف را آسان میکند؛ مثلا ورژنهای مختلف وبسایتی که از nginx استفاده میکند. شما میتوانید برای هریک از اهداف آزمایش، توسعه و تولید، یک container جداگانه در یک Linode داشته باشید و به راحتی هریک را توسعه دهید.
۶. یکپارچه سازی مداوم:
Docker به عنوان جزئی از سری پیوسته integration با ابزارهایی مانند Travis، Jenkins و Wercker کار میکند. هر بار که کد source شما به روز می شود، این ابزار می تواند نسخه جدید را به عنوان یک Docker Image ذخیره کند، آن را با یک شماره نسخه برچسبگذاری کرده و به Docker Hub منتقل کند، سپس آن را deploy کند.
در چه برنامههایی از Docker استفاده کنیم؟
اگر نرم افزار شما در یک یا چند دسته زیر میگنجد، استفاده از Docker ممکن است برای شما مناسب باشد:
۱. یادگیری فناوریهای جدید:
برای شروع با استفاده از ابزار جدید بدون صرف زمان برای نصب و پیکربندی، Docker محیطی جداگانه و یکبار مصرف را ارائه میدهد. پروژههای بسیاری Docker Imageهایی با برنامههای ازپیش نصب و پیکربندیشده، نگهداری میکنند. به عنوان مثال، اگر می خواهید یک سیستم ردیابی توزیع شده مانند Zipkin را بررسی کنید، میتوانید به سادگی با دستور زیر، آن را روی localhost داشته باشید
sudo docker run -d -p 9411:9411 openzipkin/zipkin
۲. موارد استفاده پایه:
اگر برنامه شما به قدری استاندارد یا پایه باشد که با یک image پیشفرض Docker کار کند، دریافت image از Docker Hub نیز راهحل خوبی است. مواردی مانند میزبانی یک وبسایت با استفاده از یک استک LAMP، استفاده از یا تنظیم یک سرور Minecraft اغلب دارای یک image رسمی و دارای پشتیبانی در Docker Hub هستند. اگر تنظیمات پیشفرض این imageها برای نیازهای شما قابل قبول باشد، دریافت image میتواند موجب صرفهجویی در زمان شود. درحالیکه اگر از Docker استفاده نکنید، تنظیمات محیط و نصب ابزارهای ضروری زمان زیادی میبرد.
۳. توسعهی بیش از یک برنامه همزمان:
اگر میخواهید برنامههای متعددی را روی یک سرور اجرا کنید، نگهداری هر برنامه در containerهای جداگانه، از مشکلات مربوط به مدیریت متعلقات جلوگیری می کنند.
۴. تیمهای توسعهدهنده:
اگر تیم شما توسعهدهندگانی دارد که با تنظیمات مختلف کار می کنند، Docker راهی مناسب برای ایجاد محیط توسعه محلی که با محیط تولید سازگار است، فراهم میکند؛ بدون آنکه به SSH به یک سرور خارجی، نیاز داشته باشید.
در چه مواردی از Docker استفاده نکنیم؟
در زمانهایی، استفاده از Docker بهترین راه حل نیست. در اینجا چند نمونه را میبینید:
۱. برنامه شما پیچیده است و یک sysadmin ندارید.
برای برنامه های بزرگ و پیچیده، استفاده از یک Dockerfile از پیش ساخته شده و یا دریافت یک image موجود، گزینهی مناسبی نخواهد بود. ساخت، ویرایش و مدیریت ارتباط بین چند container در چندین سرور یک کار زمانبر است.
۲. بازدهی برای برنامه شما بسیار مهم است.
Docker، زمانی که بحث بازدهی به میان میآید، در مقایسه با ماشینهای مجازی، درخشان است؛ زیرا kernel میزبان را به اشتراک می گذارد و یک سیستمعامل کامل را شبیهسازی نمیکند. با این حال، Docker هزینههایی در زمینهي بازدهی دارد. فرایندهایی که درون یک container اجرا میشوند، به اندازهی فرایندهایی که در native OS اجرا میشوند، سریع نیستند. اگر شما نیاز دارید که بهترین بازدهی ممکن را از سرور خود داشته باشید، ممکن است بهترباشد که از این روش استفاده نکنید.
۳. شما نمیخواهید بهروزرسانیهای عجیب و غریب انجام دهید!
Docker یک تکنولوژی جدید است که هنوز در حال توسعه است. برای به دستآوردن ویژگیهای جدید، احتمالا باید به طور مرتب بهروزرسانی کنید و نکته ی حائز اهمیت در این روند آنست که پشتیبانی از نسخههای قبلی تضمینشده نیست.
۴. امنیت برای برنامه شما بسیار مهم است.
همانطور که پیشتر ذکر شد، نگه داشتن اجزای مختلف یک برنامه در containerهای جداگانه، مزایای امنیتی را فراهم می آورد، زیرا اختلال در یک container نمیتواند به راحتی بر سایر سیستمهای شما تاثیر بگذارد. با این حال، رویکرد مبتنی بر container در Docker چالش های امنیتی خود را به ویژه برای برنامه های پیچیدهتر، دارد.
۵. برنامهای با سیستم عامل چندگانه.
از آنجایی که Docker Container سیستمعامل میزبان را به اشتراک میگذارند، اگر میخواهید برنامه کاربردی مشابهی را در سیستمعامل های مختلف اجرا یا آزمایش کنید، به جای این روش، باید از ماشینهای مجازی استفاده کنید.
۶. Clusterها.
Containerهای Docker میتوانند در سرورهای جداگانه ترکیب شوند تا با Docker Swarm کلاستر بسازد. با این حال، Docker جایگزین ابزارهای تولید و یا اتوماتیکسازی مانند Ansible، SaltStack و Chef نیست. علاوه بر این، Docker اخیرا پشتیبانی از Kubernetes را اعلام کرده است، که توضیح میدهد که Docker Swarm به عنوان یک مدیر کلاستر مستقل کافی نیست.
آیا باید از Docker Container استفاده کنیم؟
Docker به یک راه بسیار محبوب برای پیکربندی، ذخیره و به اشتراک گذاری محیط سرور با استفاده از container تبدیل شده است. به همین دلیل، نصب یک برنامه یا حتی یک استک بزرگ اغلب می تواند به سادگی اجرای دستورات docker pull
یا docker run
باشد. جداکردن توابع کاربرد در containerهای مختلف نیز مزایایی را در مدیریت امنیت و متعلقات ارائه میدهد.
با این حال، Docker یک جایگزین برای سیستمهای مهندسی و یا مدیریت پیکربندی نیست و رویکرد آن نقاط ضعفی دارد. توسعهدهندگان باید دربرابر وسوسهی انتقال همهی برنامههای جدیدشان به Docker، مقاومت کنند، به این دلیل که یک راه حل محبوب و کاربر پسند است! اما به یاد داشته باشید که قبل از تصمیم به استفاده از این روش، الزامات هر پروژه باید با دقت بررسی شود.