داکر چیست و چگونه کار میکند و چرا باید از Docker استفاده کنیم؟
در این مقاله میخوانید
اگر توسعهدهنده نرمافزار باشید، حتماً نام داکر به گوشتان خورده است. داکر پلتفرمی منبعباز است که به توسعهدهندگان کمک میکند تا با استفاده از قابلیت مجازیسازی در سطح سیستمعامل، نرمافزارها را در قالب بستههایی با عنوان «کانتینر» ارائه دهند. اگر به این حوزه علاقهمندید، در این مقاله از آموزش داکر بلاگ پارس پک میخواهیم توضیح دهیم که Docker چیست. همچنین، درباره مفاهیم مهم دیگری مانند کانتینر، ابزارها، اصطلاحات داکر و عملکرد Docker صحبت خواهیم کرد. توجه کنید برای اینکه این مقاله بتواند برایتان مفیدتر باشد، لازم است با برخی از مفاهیم اولیه داکر آشنا باشید.
Docker چیست و چه کاربردهایی دارد؟
همانطورکه در مقدمه این مطلب گفتیم، داکر پلتفرمی منبعباز است که برای ساخت و استقرار و مدیریت برنامههای کانتینری بهکار برده میشود. بنابراین، با استفاده از این ابزار توسعهدهندگان میتوانند کانتینرها را بسازند و آنها را مستقر، اجرا، بهروزرسانی و مدیریت کنند. همچنین، این ابزار به توسعهدهندگان امکان میدهد تا کامپوننتهایی را اجرا کنند که کد منبع (Source Code) را با کتابخانههای سیستمعامل و وابستگیهایی برای اجرای آن کد در هر محیطی ترکیب میکنند.
در این مسیر، کانتینرها نیز وظیفه دارند تا توسعه و تحویل برنامههای کاربردی توزیعشده را آسانتر کنند. استفاده از این ابزارها از محبوبیت بیشتری نیز برخوردار شده است؛ بهویژه حالا که سازمانها بهسمت توسعه بومی ابری یا Native-Cloud و استفاده از محیطهای چندابری ترکیبی حرکت میکنند. اگرچه برای توسعهدهندگان این امکان وجود دارد تا کانتینرها را بدون استفاده از Docker و با قابلیتهای موجود در سرور لینوکس و سایر سیستمعاملها ایجاد کنند، استفاده از Docker برای ساخت کانتینرها سریعتر و آسانتر و ایمنتر است. گواه این موضوع هم گزارش خودِ داکر است. براساس این گزارش، بیش از ۱۳میلیون نفر توسعهدهنده در سرتاسر دنیا از این پلتفرم منبعباز استفاده میکنند!
برای مقایسه و آشنایی با نقاط قوت و ضعف Kubernetes و Docker مقاله زیر را بخوانید.
کانتینر چیست و مزایای استفاده از آن کداماند؟
باتوجهبه اینکه کانتینرها جزء جدانشدنی داکر هستند، درادامه میخواهیم آنها را دقیقتر بررسی کنیم.
۱. کانتینر و مفهوم آن
کانتینرها نوعی از مجازیسازی سیستمعامل هستند. یک کانتینر تکی ممکن است برای اجرای هرچیزی، از میکروسرویس کوچک یا فرایندهای نرمافزاری گرفته تا برنامه بزرگتر، استفاده شوند. در هر کانتینر، تمامی فایلهای اجرایی، کدهای باینری، کتابخانهها و فایلهای موردنیاز برای پیکربندی قرار دارد. بااینحال، درمقایسهبا رویکرد مجازیسازی سرور یا ماشین، کانتینرها حاوی تصویر سیستمعامل (OS image) نیستند. این موضوع باعث میشود تا کانتینرها کمحجمتر شوند و علاوهبر انتقال سادهتر، هزینههای سربار کمتری نیز داشته باشند.
در استقرار برنامههای بزرگتر، ممکن است چندین کانتینر بهصورت دستهای بهکار گرفته شوند. چنین خوشههای بزرگی را معمولاً ارکستراتورهای کانتینری مانند Kubernetes مدیریت میکند. درمجموع، میتوان گفت کانتینرها تمامی عملکردها و مزایای ماشینهای مجازی را دارند؛ ازجمله قابلیت جداسازی برنامه و مقیاسپذیری و مقرونبهصرفهبودن.
۲. مزایای استفاده از کانتینر
کانتینرها روشی ساده برای ساخت، آزمایش، استقرار و استقرار مجدد برنامهها در محیطهای مختلف، از لپتاپ گرفته تا دیتاسنترهای داخلی و حتی فضاهای ابری هستند. ازجمله مزایای استفاده از کانتینر میتوان به اینها اشاره کرد:
- سربار کمتر: کانتینرها باتوجهبه اینکه OS Image نمیشوند، درمقایسهبا محیطهای ماشین مجازی سنتی یا سختافزاری به منابع سیستمی کمتری نیاز دارند.
- راحتی در حمل: برنامههای در حال اجرا در کانتینرها را میتوان بهراحتی در سیستمعاملها و پلتفرمهای سختافزاری مختلفی مستقر کرد.
- عملکرد منسجمتر: تیمهای DevOps بهخوبی میدانند که برنامههای قرارگرفته در کانتینرها بدون توجه به جایی که در آن مستقر شدهاند، بهصورت کاملاً یکسان اجرا خواهند شد.
- کارایی بیشتر: Containerها به برنامهها امکان میدهند تا سریعتر استقرار یابند. همچنین، درصورتیکه بخواهید آنها را مقیاسبندی کنید، این کار با استفاده از کانتینرها خیلی سریعتر انجام خواهد شد.
- توسعه بهتر برنامه: Containerها از Agile و DevOps برای تسریع چرخههای توسعه و آزمایش و تولید برنامهها پشتیبانی میکنند.
برای آموزش کامل نصب داکر روی اوبونتو 20.04 و نحوه کار با داکر مقاله زیر را بخوانید.
چرا باید از داکر استفاده کرد؟
در دنیایی که تکنولوژی با سرعت سرسامآوری به پیشرفتهای خود ادامه میدهد، تمامی خدماتی که ازطریق بستر اینترنت به مشتریان ارائه میشود، نیازمند معجزهای است که کمک کند تا زمان استقرار را به حداقل برسانید و از حداقل منابع سیستمهایتان استفاده کنید. داکر همان معجزهای است که این قابلیتها را دراختیارتان قرار میدهد. علاوهبراین، داکر منبعباز است و همین موضوع نیز یکی دیگر از ویژگیهای مهم این پلتفرم محسوب میشود. درادامه، به هشت دلیل مهمی اشاره میکنیم که شما را قانع میکند تا از داکر استفاده کنید.
۱. سادگی استفاده
داکر یک شعار اصلی دارد: «Docker For Everyone!» دلیل این ادعا هم آن است که یادگیری داکر اصولاً خیلی ساده است و شما بهراحتی میتوانید از آن استفاده کنید. حتی افراد غیرفنی هم میتوانند پروژههای داکر را تنها با چند دستور شروع و اجرا کنند.
۲. جداسازی محیط
تا قبل از داکر، پیکربندی محیط برای نسخههای مختلف نرمافزار روی یک دستگاه یکی از مشکلات مهم توسعهدهندگان بود؛ اما حالا میتوانید محیطی ایزوله با نام Docker Container برای هر نسخه از برنامه ایجاد کنید. با استفاده از این قابلیت، هر کانتینر پیکربندی محیط ایزوله جداگانهای دارد که هیچیک از آنها بر پیکربندی سیستمعامل یا هر کانتینر دیگری که همزمان روی دستگاه شما در حال اجراست، تأثیری نمیگذارد.
۳. استقلال از سیستمعاملها
یکی از ویژگیهای مهم استفاده از داکر این است که توسعهدهنده را از سیستمعامل مستقل میکند؛ بههمیندلیل، اجرای داکر روی سیستمعاملهای مختلف، از لینوکس گرفته تا ویندوز یا حتی پلتفرمهای مبتنیبر ARM، چندان متفاوت نیست.
۴. توسعه و استقرار سریع
Docker با اجرای خودکار اکثر کارهای تکراری، به توسعهدهندگان کمک میکند تا در زمان خود صرفهجویی کنند؛ البته این راهکار علاوهبر زمان، موجب صرفهجویی در منابع خواهد شد. همچنین، استقرار آن بهدلیل حجم کم Docker Image یا فایلی که برای اجرای کد در کانتینر استفاده میشود، بهراحتی کنترلکردنی است.
۵. مقیاسپذیری و انعطافپذیری سادهتر
ازآنجاکه داکر براساس فناوری کانتینریسازی ساخته شده، هم مقیاسپذیر و هم انعطافپذیر است. حالا دیگر میدانیم که هر کانتینر مجموعهای از تنظیمات و وابستگیهای خاص خود را دارد که داخل آن بستهبندی شده است و اجرای چندین نمونه از یک کانتینر را آسانتر میکند. این بدانمعنا است که استقرار Docker Image در چندین سرور بسیار ساده است. تنها کاری که باید انجام دهید، این است که تغییرات را در Docker Image اِعمال و درنهایت کانتینرهای جدید را آزمایش و مستقر کنید. این یعنی با ایجاد فرایند شروع و خاتمه سریع برنامه، انعطافپذیری بسیاری تجربه خواهید کرد.
۶. خداحافظی با مشکلات امنیتی
کانتینرهای Docker بهطورپیشفرض بسیار ایمنتر از برنامههای معمولی هستند. حتی یک کانتینر نمیتواند بدون مجوز دسترسی، به دادههای کانتینرهای دیگر دسترسی داشته باشد. همچنین درصورت نیاز، لایههای امنیتی بیشتری میتوانید اضافه کنید. بدینترتیب، داکر میتواند امنیت را برایتان تضمین کند.
۷. ارسال در زمان و مکان دلخواه
انتقال یا ارسال برنامه ازجمله مشکلات همیشگی توسعهدهندگان نرمافزارهاست. این موضوع نهتنها به منابع انسانی نیاز دارد؛ بلکه زمان زیادی نیز از توسعهدهنده برای اِعمال تنظیمات و راهاندازی خواهد گرفت. در این زمینه نیز، Docker به یاری شما خواهد شتافت و کمک میکند تا برنامههایتان را در زمان دلخواه و بدون محدودیت مکانی ارسال کنید. تنها کاری که باید انجام دهید، این است که داکر را روی دستگاه مدنظر نصب و با استفاده از دستورهای موجود برای این منظور، پروژهتان را تنها در چند دقیقه اجرا کنید.
۸. مدیریت سادهتر وابستگیها
تا قبل از داکر، اگر میخواستید پروژهای را روی ماشین دیگری اجرا کنید، باید تمام وابستگیها ازجمله کتابخانهها و پیکربندیها و سرویسهایی مانند پایگاه داده یا حافظه Cache را تنظیم میکردید. این موضوع تا وقتی روی یک پروژه کار میکنید، احتمالاً برایتان مزاحمتی ایجاد نخواهد کرد؛ اما وقتی درگیر انجام پروژههای موازی هستید و هریک از این پروژهها نیز وابستگیهایی دارند که امکان نصب همزمان آنها وجود ندارد، قطعاً با مشکل روبهرو خواهید شد.
اجازه دهید این موضوع را با ذکر مثالی بیشتر توضیح دهیم. فرض کنید که یکی از پروژههای شما به SQL و دیگری به MariaDB نیاز داشته باشد. درصورتیکه بخواهید پس از یکی از این پروژهها، کار روی پروژه دیگری را شروع کنید، قطعاً باید یکی از این دو را حذف کنید و این کار باعث میشود که پروژه قبلیتان بیاستفاده شود.
داکر اینجا نیز بهعنوان ناجی وارد میدان میشود و موضوع را حل میکند. در این مواقع، داکر میتواند مکانیسم مدیریت وابستگی ایجاد کند که با استفاده از آن هر پروژه یا برنامه میتواند بههمراه وابستگیهایش در کانتینر جداگانهای ایزوله شود و برگبرنده آن هم این است که چندین برنامه (کانتینر) را همزمان روی یک دستگاه میتوانید اجرا کنید.
چگونه Imageها، کانتینرها و دیگر موارد بیاستفاده در داکر را حذف کنیم؟ در مقاله زیر بخوانید.
مزایا و معایب استفاده از داکر
هر ابزار درکنار مزایایش، معایبی نیز باشد. درباره Docker نیز همین موضوع صدق میکند. درادامه مقاله، به برخی از معایب و مزایای مهم استفاده از داکر اشاره میکنیم.
۱. مزیتهای استفاده از داکر
- داکر میتواند از چندین برنامه با الزامها و وابستگیهای مختلف پشتیبانی کند. بدینترتیب، درصورتیکه تمامی این برنامهها به سیستمعامل مشابهی نیاز داشته باشند، میتوانند روی یک هاست استقرار یابند.
- با استفاده از داکر میتوانید فضای ذخیرهسازی خود را بهینه کنید؛ زیرا تعداد زیادی از برنامهها را میتوانید روی یک هاست نگهداری کنید. دلیل این امر نیز آن است که کانتینرها معمولاً حجم کمی دارند و فضای هارد کمی را اشغال میکنند.
- کانتینر هیچ سیستمعاملی را روی خود ندارد و این دقیقاً نقطه مقابل ماشینهای مجازی است که روی خود OS دارند؛ بههمیندلیل، کانتینرها درمقایسهبا ماشینهای مجازی، از حافظه بسیار کمی استفاده میکنند. این موضوع علاوهبراینکه موجب قدرت بیشتر Container میشود، زمان بوت چنددقیقهای برای ماشینهای مجازی را به چند ثانیه کاهش میدهد. تمامی این مزیتها علاوهبر افزایش عملکرد، از هزینهها میکاهد.
۲. معایب استفاده از داکر
اگرچه استفاده از داکر معایب چندانی ندارد، قبل از استفاده از آن بد نیست بدانید برنامههای کاربردی با نیازهای سیستمعاملی مختلف را نمیتوان با یکدیگر در یک Docker Host میزبانی کرد. بهعنوان مثال، فرض کنید چهار برنامه دارید که از این تعداد سه برنامه از سیستمعامل لینوکس و یک برنامه از سیستمعامل ویندوز استفاده میکند. در چنین شرایطی، سه برنامهای که به سیستمعامل لینوکس نیاز دارند، روی یک Docker Host میتوانند میزبانی شوند؛ اما برنامهای را که به سیستمعامل ویندوز نیاز دارد، باید روی یک Docker Host مجزا قرار دهید.
داکر چطور کار میکند؟
درادامه، گردش کار داکر را با استفاده از اجزای مختلف موجود در آن بررسی میکنیم. برای این منظور، ابتدا اجزای تشکیلدهنده داکر را معرفی میکنیم. تصویر زیر به شما کمک میکند تا به درک دقیقی از گردش کار رایج داکر دست پیدا کنید.
عملکرد داکر چگونه است؟
همانطورکه در تصویر بالا مشاهده میکند، اکوسیستم داکر از چهار جزء اصلی تشکیل شده است:
- Daemon Docker
- Docker Client
- Docker Images
- Docker Registries
- Docker Containers
درادامه، هریک از این اجزا را توضیح میدهیم.
Daemon Docker .۱ چیست؟
داکر از معماری موسوم به کلاینتسرور استفاده میکند. Daemon Docker مسئولیت همه اقدامات مربوط به این کانتینرها را برعهده دارد. طرز کار Daemon بدینصورت است که دستورها را از کلاینت Docker با استفاده از Rest API یا CLI دریافت میکند. فراموش نکنید که Daemon Docker بهطورپیشفرض به سوکت یونیکس docker.sock گوش میدهد؛ بنابراین، اگر موردی برای دسترسی از راه دور به داکر دارید، آن را ازطریق پورت میزبان باید درمعرض دید قرار دهید. یکی از این کاربردها، اجرای داکر بهعنوان ایجنتهای Jenkins است. همچنین، اگر میخواهید از داکر درون خود داکر استفاده کنید، docker.sock را در ماشین هاست میتوانید بهکار بگیرید.
با هاست پارس پک، کسبوکار خود را به اوج برسانید
وبسایتها برای میزبانی ترافیک بالای کاربران و ارائه سریع پاسخ به درخواستها، به سرویس میزبانی پایدار و پرسرعت نیاز دارند. هاست با بهرهگیری از منابع چندین سرور بهطور همزمان، میتواند دسترسپذیری بالایی را برای وبسایتها فراهم کند. سرعت و آپتایم، نقش مؤثری در سئو و تجربه کاربری دارند که هاست پارس پک با منابع پرقدرت خود، به شما هدیه میدهد. هاست پارسپک با امکان انتخاب منابع بهمیزان دلخواه و ارتقای آنی، به شما کمک میکند کسبوکار خود را بهسرعت رشد و توسعه دهید. برای آشنایی با قابلیتهای هاست پارسپک به صفحه زیر مراجعه کنید.
Docker Image .۲ چیست؟
Imageها همان بلوکهای اصلی سازنده Docker هستند که کتابخانههای سیستمعامل و وابستگیها و ابزارهایی برای اجرای برنامه را شامل میشوند. Imageها را با وابستگیهایی که برای ایجاد کانتینرها استفاده میشوند، میتوان ساخت. بهعنوان نمونه، اگر میخواهید سرور Nginx را بهعنوان کانتینر اوبونتو استفاده کنید، باید Image داکر را با باینری Nginx و تمامی کتابخانههای سیستمعامل موردنیاز برای اجرای Nginx ایجاد کنید.
Dockerfile .۳ چیست؟
Dockerfile فایلی متنی است که حاوی یک دستورالعمل در هر خط است. در تصویر زیر، نمونهای از Dockerfile را مشاهده میکنید:
نمونهای از Dockerfile
Image داکر بهصورت لایهای سازماندهی شده است. هر دستورالعمل روی Dockerfile یک لایه را به Image اضافه میکند و بالاترین لایه نوشتنی Image همان کانتینر است. همچنین، هر Image برپایه Image ایجاد میشود. برای نمونه، اگر قصد دارید از Image اوبونتو استفاده و با Nginx تصویر دیگری ایجاد کنید، Image پایه میتواند Image والد یا Image ساختهشده از والد باشد.
حالا ممکن است این سؤال در ذهنتان مطرح شود که این Image والد (Parent Image) از کجا آمده است؟ اینجا دیگر قضیه مانند سؤال «اول مرغ بوده یا تخممرغ؟» نیست؛ بلکه پاسخ این پرسش کاملاً واضح و ساده است: در داکر ابزارهایی برای ایجاد Image پایه والد وجود دارد. این ابزارها کتابخانههای سیستمعامل موردنیاز را میگیرند و آنها را در Image والد وارد میکنند. گفتن است نیازی نیست کار خاصی انجام دهید؛ زیرا Imageهای پایه رسمی داکر میتوانند دردسترس شما قرار بگیرند.
معرفی عملکرد Dockerfile
همانطورکه گفتیم، لایه بالایی Image قابلیت نوشتن دارد و کانتینر در حال اجرا از آن استفاده میکند. لایههای پایینتر نیز که در تصویر زیر آنها را مشاهده میکنید، لایههایی صرفاً خواندنی هستند.
لایههای فقط خواندنی کانتینر
Docker Registry .۴ چیست؟
درواقع، Docker Registry مخزنی برای Imageهای داکر است. هر رجیستری میتواند بهصورت عمومی یا خصوصی باشد. بهعنوان مثال، Docker, Inc. سرویس رجیستری میزبانیشدهای به نام Docker Hub را ارائه میکند که به شما امکان میدهد تا Imageها را از مکان مرکزی آپلود یا دانلود کنید.
توجه: هنگامیکه Docker را نصب میکنید، بهطورپیشفرض بهدنبال Imageهایی از هاب عمومی Docker میگردد؛ مگر اینکه رجیستری سفارشیای در تنظیمات Docker قرار داده باشید تا از این کار جلوگیری کند.
اگر مخزن شما بهصورت عمومی تعریف شده باشد، دیگر کارکنان Docker Hub نیز میتوانند به Imageهای شما دسترسی داشته باشند. همچنین، این امکان برایتان فراهم است که رجیستری خصوصی در Docker Hub ایجاد کنید. عملکرد Docker Hub را میتوانید مانند GIT در نظر بگیرید. Docker Hub جایی است که میتوانید Imageهای خود را بهصورت لوکال روی لپتاپ خود بسازید و سپس آن را روی Docker Hub پوش کنید.
۵. کانتینر Docker چیست؟
Docker Container از Imageهای موجود ایجاد میشود و درواقع، لایهای با قابلیت نوشتن از Image است. شما میتوانید برنامههای خود را در یک کانتینر بستهبندی و آن را به یک Image طلایی تبدیل کنید تا بتوانید کانتینرهای بیشتری از آن بسازید. انجام عملیات مختلفی روی کانتینرها امکانپذیر است. بهعنوان نمونه، میتوانید کانتینر را راهاندازی (Setup)، متوقف (Stop)، اجرا (Commit) یا خاتمه (Terminate) دهید. درصورتیکه خاتمه کانتینر را بدون اجراکردن آن انجام دهید، تمامی تغییرات کانتینر از بین خواهد رفت.
در حالت ایدئال، کانتینرها بهعنوان اشیائی تغییرناپذیر در نظر گرفته میشوند و اِعمال تغییرات در کانتینر در حال اجرا توصیه نمیشود. درعوض، اِعمال تغییرات روی Containerها فقط برای موارد آزمایشی انجام میشود. همچنین، دو یا چند کانتینر میتوانند به یکدیگر متصل شوند و بدینترتیب، معماری برنامههای چندلایه تشکیل خواهد شد. فراموش نکنید که امروزه با ظهور ابزارهای ارکستراسیون کانتینر مانند Kubernetes، میزبانی برنامههای مقیاسپذیر با Docker بسیار ساده شده است.
جمعبندی
اگر توسعهدهنده نرمافزار باشید، حتماً نام داکر به گوشتان خورده است. Docker پلتفرمی منبعباز است که برپایه سیستمعامل لینوکس طراحی شده و از آن برای ایجاد و پیادهسازی و اجرای برنامه با کانتینرها میتوان استفاده کرد. داکر و کارکرد آن یکی از مفاهیم پایهای در حوزه توسعه نرمافزارها و DevOps است. باتوجهبه اهمیت این موضوع، در این مقاله از بلاگ پارس پک، تصمیم گرفتیم تا درباره این پلتفرم با شما صحبت و به نکاتی اشاره کنیم که برای شروع کار با داکر به آنها نیاز دارید.
سؤالات متداول
۱. داکر چیست و چرا استفاده از آن محبوبیت زیادی دارد؟
Docker پلتفرم منبعبازی است که با استفاده از آن میتوانید برنامههای مدنظرتان را بهسرعت بسازید و آزمایش و منتشر کنید. همین تعریف کافی است تا بدانیم داکر در حوزه توسعه نرمافزارها تا چه حد میتواند کارساز باشد؛ بههمیندلیل، استفاده از آن بسیار محبوب است.
۲. کانتینر چیست؟
Docker نرمافزار را در واحدهای استانداردی با نام کانتینرها بستهبندی میکند. کانتینرها همه آنچه نرمافزار برای اجرا نیاز دارد (مانند کتابخانهها و ابزارهای سیستم و کد)، در خود دارد.
۳. داکر بیشتر چه کاربردهایی دارد؟
داکر پلتفرمی کانتینریسازی است که بهصورت متنباز طراحی شده و عمدتاً بهعنوان پلتفرم توسعه نرمافزار و برای توسعه اپلیکیشنهای توزیعشده که در محیطهای مختلف کار میکنند، استفاده میشود.
۴. داکر چند کانتینر را میتواند اجرا کند؟
با محاسبهای ساده، میتوان به این نتیجه رسید که با استفاده از Docker میتوان حدود هزار کانتینر را روی هاستی با ده گیگابایت هارد دیسک خالی و دردسترس اجرا کرد.