برو به محتوای اصلی
اسکریپت

Docker چیه؟

yasin

Docker یه پلتفرم متن‌بازه که برای توسعه، ارسال و اجرای اپلیکیشن‌ها استفاده می‌شه. Docker این امکان رو بهت می‌ده که اپلیکیشن‌هات رو از زیرساخت جدا کنی تا بتونی سریع‌تر نرم‌افزار منتشر کنی. با Docker می‌تونی مدیریت زیرساخت رو مثل مدیریت خود اپلیکیشن انجام بدی. با استفاده از روش‌های Docker برای ارسال، تست و دیپلوی کد، می‌تونی فاصله‌ی بین نوشتن کد و اجرای اون توی محیط عملیاتی رو به حداقل برسونی.

پلتفرم Docker

پلتفرم Docker این امکان رو فراهم می‌کنه که یه اپلیکیشن رو داخل یه محیط ایزوله به اسم کانتینر بسته‌بندی و اجرا کنی. این ایزوله‌سازی و امنیت باعث می‌شه که بتونی چندین کانتینر رو هم‌زمان روی یه سرور اجرا کنی. کانتینرها سبک هستن و شامل همه‌ی چیزایی که برای اجرای اپلیکیشن لازمه، پس دیگه وابسته به چیزایی که روی سیستم میزبان نصب شده نیستی.

می‌تونی کانتینرها رو حین کار با دیگران به اشتراک بذاری و مطمئن باشی که همه دقیقاً همون کانتینری رو دریافت می‌کنن که روی سیستم تو درست کار می‌کنه.

Docker ابزارهایی برای مدیریت چرخه‌ی عمر کانتینرها ارائه می‌ده:

  • اپلیکیشن و اجزای مورد نیازش رو با کانتینرها توسعه بده.
  • کانتینر به واحدی برای توزیع و تست اپلیکیشن تبدیل می‌شه.
  • وقتی آماده شد، اپلیکیشن رو به محیط عملیاتی منتقل کن، چه به‌صورت یه کانتینر تکی، چه به‌عنوان بخشی از یه سیستم هماهنگ‌شده (Orchestrated Service). این کار فرقی نداره که محیط عملیاتی یه دیتاسنتر محلی باشه، یه سرویس ابری، یا ترکیبی از هر دو.

Docker چه کاربردی داره؟

۱. ارسال سریع و یکدست اپلیکیشن‌ها

Docker فرآیند توسعه رو ساده می‌کنه و به برنامه‌نویس‌ها این امکان رو می‌ده که توی یه محیط استاندارد شده با کانتینرها کار کنن. این ابزار مخصوصاً برای چرخه‌های CI/CD (توسعه و استقرار مداوم) خیلی مفیده.

یه مثال از نحوه‌ی استفاده از Docker در تیم‌های توسعه:

  • برنامه‌نویس‌ها کدشون رو روی سیستم لوکال می‌نویسن و با استفاده از Docker، اون رو بین همکاراشون به اشتراک می‌ذارن.
  • اپلیکیشن رو توی محیط تست دیپلوی می‌کنن و روش تست‌های خودکار و دستی اجرا می‌شه.
  • اگه مشکلی پیدا بشه، توی محیط توسعه اصلاحش می‌کنن و دوباره توی محیط تست اجرا می‌کنن تا مطمئن بشن مشکل برطرف شده.
  • بعد از تکمیل تست‌ها، انتشار نسخه‌ی جدید برای کاربرا خیلی ساده می‌شه و فقط کافیه ایمیج به‌روزرسانی شده رو به محیط عملیاتی ارسال کنن.

دیپلوی سریع و مقیاس‌پذیری انعطاف‌پذیر

پلتفرم مبتنی بر کانتینر Docker این امکان رو می‌ده که برنامه‌ها رو به‌راحتی روی محیط‌های مختلف اجرا کنی. کانتینرهای Docker می‌تونن روی لپ‌تاپ توسعه‌دهنده، روی ماشین‌های فیزیکی یا مجازی توی دیتاسنتر، روی سرویس‌های ابری یا ترکیبی از این محیط‌ها اجرا بشن.

قابلیت قابل‌حمل بودن و سبک بودن Docker باعث می‌شه مدیریت بار کاری خیلی راحت‌تر بشه. می‌تونی اپلیکیشن‌ها و سرویس‌ها رو به‌صورت پویا مدیریت کنی و هر زمان که لازم بود، اون‌ها رو مقیاس‌گذاری کنی یا کاهش بدی، اون هم تقریباً در لحظه و بدون دردسر.

اجرای وظایف بیشتر روی همان سخت‌افزار

Docker سبک و سریع هست و یه جایگزین مقرون‌به‌صرفه برای ماشین‌های مجازی سنتی که مبتنی بر هایپروایزر هستن، ارائه می‌ده. این یعنی می‌تونی از ظرفیت سرورهای خودت بهتر استفاده کنی و به اهداف کسب‌وکارت برسی بدون اینکه نیاز به سخت‌افزار اضافی داشته باشی.

Docker مخصوصاً برای محیط‌هایی که نیاز به اجرای تعداد زیادی سرویس دارن یا برای استقرارهای کوچک و متوسط که باید با منابع کمتر کار کنن، عالیه.

معماری Docker

Docker از یک معماری کلاینت-سرور استفاده می‌کنه.

  • Docker Client با Docker Daemon ارتباط برقرار می‌کنه و وظایف سنگین مثل ساخت، اجرا و توزیع کانتینرها رو به اون می‌سپره.
  • کلاینت و دایمون می‌تونن روی یک سیستم اجرا بشن، یا می‌تونی Docker Client رو به یه دایمون Docker از راه دور متصل کنی.
  • ارتباط بین کلاینت و دایمون از طریق REST API، سوکت‌های UNIX یا یه رابط شبکه‌ای انجام می‌شه.

یه ابزار دیگه به اسم Docker Compose هم وجود داره که بهت کمک می‌کنه اپلیکیشن‌هایی که از چندین کانتینر تشکیل شدن رو راحت‌تر مدیریت کنی.

Docker Daemon

Docker Daemon (dockerd) درخواست‌های Docker API رو دریافت و پردازش می‌کنه و وظیفه‌ی مدیریت آبجکت‌های Docker مثل ایمیج‌ها، کانتینرها، شبکه‌ها و حجم‌های ذخیره‌سازی (Volumes) رو بر عهده داره.

علاوه بر این، یه دایمون Docker می‌تونه با دایمون‌های دیگه ارتباط برقرار کنه و سرویس‌های Docker رو مدیریت کنه.

Docker Client

Docker Client (docker) اصلی‌ترین راه تعامل کاربران با Docker هست.

  • وقتی یه دستور مثل docker run اجرا می‌کنی، Docker Client این دستور رو به دایمون Docker (dockerd) می‌فرسته تا پردازش بشه.
  • دستورات Docker از طریق Docker API اجرا می‌شن.
  • Docker Client می‌تونه هم‌زمان با بیش از یک دایمون Docker ارتباط برقرار کنه.

Docker Desktop

Docker Desktop یه برنامه‌ی قابل نصب روی Mac، Windows و Linux هست که بهت این امکان رو می‌ده که اپلیکیشن‌های کانتینری و میکروسرویس‌ها رو بسازی و به اشتراک بذاری.

این ابزار شامل موارد زیره:

  • Docker Daemon (dockerd)
  • Docker Client (docker)
  • Docker Compose
  • Docker Content Trust
  • Kubernetes
  • Credential Helper

Docker Registries

Docker Registry یه مخزن برای ذخیره‌ی ایمیج‌های Docker هست.

  • Docker Hub یه ریجستری عمومیه که همه می‌تونن ازش استفاده کنن، و به‌صورت پیش‌فرض Docker ایمیج‌ها رو از اونجا دریافت می‌کنه.
  • می‌تونی ریجستری خصوصی خودت رو هم راه‌اندازی کنی.

دستورات مرتبط با ریجستری:

  • docker pull یا docker run → ایمیج مورد نیاز رو از ریجستری دریافت می‌کنه.
  • docker push → ایمیج مورد نظر رو به ریجستری ارسال می‌کنه.

آبجکت‌های Docker

وقتی با Docker کار می‌کنی، در واقع در حال ایجاد و استفاده از آبجکت‌هایی مثل ایمیج‌ها، کانتینرها، شبکه‌ها، حجم‌های ذخیره‌سازی (Volumes)، پلاگین‌ها و سایر موارد هستی. در این بخش یه مرور کوتاه روی این آبجکت‌ها داریم.

ایمیج‌ها (Images)

ایمیج یه قالب فقط خواندنی (Read-Only) شامل دستورالعمل‌های لازم برای ساخت یه کانتینر Docker هست.

  • معمولاً یه ایمیج بر پایه‌ی یه ایمیج دیگه ساخته می‌شه و یه سری تنظیمات و سفارشی‌سازی‌های اضافی روی اون انجام می‌شه.
    مثلاً می‌تونی یه ایمیج بر اساس Ubuntu بسازی و روش Apache و اپلیکیشن خودت رو نصب کنی.
  • می‌تونی ایمیج‌های خودت رو بسازی یا از ایمیج‌های آماده‌ای که بقیه توی ریجستری منتشر کردن استفاده کنی.
  • برای ساخت ایمیج، از Dockerfile استفاده می‌کنی. این یه فایل متنی با دستورات ساده‌ست که مشخص می‌کنه ایمیج چطور ساخته بشه و چطور اجرا بشه.

هر دستور داخل Dockerfile یه لایه جدید به ایمیج اضافه می‌کنه.
وقتی Dockerfile رو تغییر بدی و ایمیج رو دوباره بسازی، فقط لایه‌هایی که تغییر کردن، از نو ساخته می‌شن. این همون چیزی هست که باعث سبک‌تر، کوچک‌تر و سریع‌تر بودن ایمیج‌های Docker نسبت به ماشین‌های مجازی سنتی می‌شه.

کانتینرها (Containers)

کانتینر یه نمونه‌ی اجرایی از یه ایمیجه.

  • می‌تونی یه کانتینر رو ایجاد، اجرا، متوقف، جابجا یا حذف کنی، هم از طریق Docker API و هم از طریق خط فرمان (CLI).
  • می‌تونی یه کانتینر رو به چندین شبکه متصل کنی، بهش فضای ذخیره‌سازی اختصاص بدی، یا حتی ازش یه ایمیج جدید بسازی.
  • به‌صورت پیش‌فرض، هر کانتینر از بقیه‌ی کانتینرها و سیستم میزبان تا حد زیادی ایزوله‌ست، اما می‌تونی میزان این ایزولاسیون رو کنترل کنی.

ویژگی‌های کانتینر:

  • هر کانتینر بر اساس یه ایمیج ساخته می‌شه و هر تنظیماتی که هنگام اجرا بهش بدی، روی رفتار اون تأثیر داره.
  • وقتی یه کانتینر حذف بشه، تغییراتی که توی فایل‌های داخلش انجام شده، از بین می‌ره، مگر اینکه داده‌ها رو روی یه فضای ذخیره‌سازی پایدار ذخیره کرده باشی.

مثال اجرای یه کانتینر در Docker

دستور زیر یه کانتینر Ubuntu اجرا می‌کنه و به /bin/bash متصل می‌شه:

docker run -i -t ubuntu /bin/bash

مراحل اجرای این دستور:

  1. اگه ایمیج Ubuntu روی سیستم نباشه، Docker اون رو از ریجستری دانلود می‌کنه.
  2. یه کانتینر جدید ساخته می‌شه، انگار که docker container create رو اجرا کرده باشی.
  3. یه فایل‌سیستم خواندنی-نوشتنی به کانتینر اختصاص داده می‌شه تا بتونه فایل‌ها رو داخلش تغییر بده یا ذخیره کنه.
  4. یه رابط شبکه‌ای برای کانتینر ایجاد می‌شه و به شبکه‌ی پیش‌فرض متصل می‌شه (که شامل تخصیص یه IP به کانتینر هست).
  5. کانتینر اجرا می‌شه و /bin/bash داخلش اجرا می‌شه.
  6. چون -i و -t مشخص شده، ترمینال سیستم مستقیماً به کانتینر متصل می‌شه و می‌تونی توی اون دستور وارد کنی.
  7. اگه دستور exit رو بزنی، کانتینر متوقف می‌شه ولی حذف نمی‌شه. می‌تونی دوباره اجراش کنی یا اگه لازم نبود، حذفش کنی.