خوش و بشی با داکر (Docker)

مبحثی که در موردش میخایم شروع به صحبت کنیم، در مورد Container ها و علی الخصوص داکر (Docker) هستش که به صورت کلی و مختصر به تعریف و توضیح کوتاهی در موردشون می پردازیم.

لازم به گفتن میدونم که بعضی از تعاریف برای سادگی به شکل دیگه ای بیان میشه و سعی میکنم زیاد ریز بینانه وارد نشم تا مبحث ویژگی فهم عمومی داشته باشه.

Container چیست؟

خب اول از همه بریم سراغ Container و ببینیم چی هست و کجا استفاده مون میشه.
به زبان خیلی ساده میشه گفت Container به گروهی از پروسس ها میگن که داخل یک فضای ایزوله شده‌ قرار گرفته‌اند (البته ما در docker سراغ این میریم که microprocess ها رو داشته باشیم و در هر کانینر یک پروسس اصلی رو اجرا کنیم). از نگاهی دیگه میشه گفتش که مدلی از مجازی سازی در لایه ی سیستم عامل هستش که هسته ی سیستم عامل این قابلیت رو به ما میده که تعدادی فضای ایزوله رو کاربر بتونه ایجاد کنه.

اینجا سؤال پیش میادش که فضای ایزوله ای که ازش اسم بردیم چی هستش؟ چه قابلیتی از سیستم عامل هستش که این ویژگی رو به ما داده؟

در سیستم عامل لینوکس، یکی از مزیت‌های هسته، Namespace هستش که منابع سیستمی رو برای ما به صورتی کاملاً مجزا جدا و شبیه سازی میکنن. مثلاً Process ID، دسترسی شبکه یا حتی فایل سیستم و یا ارتباطات داخلی پروسس ها.
پس اینطوری ما با استفاده از Namespace یک فضای ایزوله برای کارمون ایجاد کردیم.

خب، دوباره تعریف سادمون از Container رو اینجا باز گو میکنم: Container به گروهی از پروسس ها میگن که داخل یک فضای ایزوله شده قرار گرفته و هر Container میتونه قابلیت‌های Namespace رو که چندتاشون رو نام بردیم داشته باشه.

داکِر (Docker)

وقتش رسیده که بریم سراغ Docker و ببینیم نهنگ آبی و خندون داکر کی هستش و چی هست و رسالتش چیه.

هسته‌ی داکر که میتونیم بهش Docker Engine بگیم، یک نرم‌افزار متن باز هستش که روی سیستم عامل نصب میشه و به ما اجازه ی ساخت، پیاده‌سازی و مدیریت Container ها رو میده. این برنامه توسط تیم داکر و یا dotCloud نوشته شده و در اختیار من و شما قرار گرفته. Docker به ما این قابلیت رو میده که برنامه‌های خودمون رو به صورت اتوماتیک پیاده‌سازی کنیم و در قالب microprocess هر container رو دربیاریم و استفاده کنیم.

بزرگترین مزیتی که Docker بهمون ارايه میده این هستش که به سرعت میتونین کار development خودتون رو باهاش تست کنین، جلو ببرین و به حالت production برسونینش. ازین باحال تر این هستش که دیگه مثله نیازمندی های KVM، VMware و … به سیستم عجیب و غریبی نیاز نداریم؛ در واقع بسادگی میتونین روی سیستمی که دارین (که شاید RAM و CPU بالایی نداشته باشه)، داکِر رو نصب و ازش استفاده کنین.

موارد کاربردی داکر

در مورد مزیتی که اول گفتم (تسریع در Development) بگذارین یک مثال تجربیِ کوچیک بزنم:
امروز میخاستم یک اسکریپت کامپایل Nginx با OpenSSL ورژن 1.0.2j و یک سری enable/disable کردن‌های دیگه درست کنم. روال کار برای من اینجوری بودش:

  1. نصب پیش نیاز ها
  2. دانلود nginx و openssl
  3. کامپایل openssl
  4. کامپایل nginx

اگه تا به حال کامپایل انجام داده باشین، متوجه میشین بعضی وقتا حوصله سَربَر میشه، مخصوصاً زمانی که بخواین پکیج رو کم و زیاد کنین یا موقغی که بلا به دور با نقص پیش نیاز مواجه بشین.

۲ تا حالت رو با هم بررسی میکنیم. یکی حالت معمولی و روی یک سیستم عامل معمولی که میخایم یک template تر و تمیز بسازیم. و حالت بعدی استفاده از docker که میخایم یک کانتینر ازش بسازیم.

حالت عادی

فرض کنید اسکریپت ما تا مرحله ۴ رو کامل هر بار جلو میره و یک زمان زیادی رو کامپایل OpenSSL ازمون میگیره و بعدش میرسه به Nginx. حالا توی Nginx به ایراد میخورید و برطرفش میکنیم. اسکریپت با comment کردن کارای قبل تست اولیه میشه و بعدش از comment برای تست نهایی خارجش میکنیم و باز میبینیم یک feature زیاده و باز دوباره از اول. فرض کنین چند بار این اتفاق بیوفته. شما یک صبح کاری رو به همین سادگی از دست میدین. این صبح کاری به ساخت یک اسکریپ نصب گذشت که هر بار برای تست نهایی ۳ مرحله ابتدایی رو دوباره اجرا میکردش.

حالت دوم – استفاده از Docker

در این روال داکر برای هر مرحله‌ای که جلو میریم یک لایه در نظر میگیره. اینطور فرض کنید که از هر جای این ۴ مرحله میتونیم کار رو ادامه بدیماسکریپتمون مثل قبل تا مرحله ۴ میره و در مرحله ۴ ما شروع به enable/disable کردن ها میکنیم. اما اینجا کامپایلمون یک تفاوتی داره. دیگه نیازی به کامنت کردن نداریم. هر بار اجرا کنیم، چون ۳ مرحله ی قبلی تکراری هستن، از مرحله ۴ به بعد ادامه پیدا میکنه و زمان ۳ مرحله قبل رو (مخصوصاً کامپایل OpenSSL که طولانی هستش) می‌خریم و هر بار فقط مرحله ۴ تکرار میشه.

این یک مثال خیلی خیلی کوچیک اما ملموس و دم دستی بود که گفتم.

از مزیت‌های دیگه ای که Docker-Container بهمون میده، میتونیم به این اشاره کنیم که Image ها (فعلاً فرض رو بر این میگذاریم که Image مثل Template در دنیای مجازی سازی هستش) حجم های بسیار کمی دارن. مثلاً Image سیستم عامل Debian حدود ۱۲۳ مگابایت هستش. ولی شما وقتی یک Debian روی سیستم نصب میکنید حدود ۴ گیگابایت (تا جایی که یادمه) ازتون فضا میگیره … دلیلش رو اینطور فرض کنید که Image حداقل نیاز خود سیستم عامل مورد نظر بدون هیچ Kernel ای از خودش هست. چون Container گفتیم که از Kernel سیستم عامل اصلی استفاده میکنه، پس این مزیت تأکید بر حجم داشتش.

یک مزیت بزرگی که داکر بهمون میده، Registry اون هستش. Registry رو به چشم Repository ای از Image های مختلف ببینین. میشه گفت بزرگترین Registry مربوط میشه به Docker Hub که انواع و اقسام Image ها رو میشه داخلش پیدا کرد.

از ویژگی‌هایی که مربوط به داکر میشه، به Swarm میتونم اشاره کنم که قابلیت مدیریت چند سیستم دارای Docker رو بهمون ارایه میده و میتونیم از یک نقطه به صورت توزیع شده Application خودمون رو پیاده‌سازی کینم و دیگه به این فکر نکنیم که الان باید روی کدوم سیستم Container رو بالا بیارم.

مزیت دیگه میشه به HealthCheck اشاره کردش که با وجود Swarm دیگه نگرانی این رو نداریم که اگر Application از دسترس خارج شد، دیگه Application از کار بیوفته. با وجود این ویژگی در اسرع زمان، در یکی از نقاط در دسترس Application به صورت اتوماتیک اجرا میشه.

و …

خب، فکر میکنم وقتش باشه که به گپمون یک تنفسی بدم و بقیه صحبت‌ها رو میگذارم برای پست های بعدی.

ممنون

ضمناً به نصیحت برخی دوستان پیرو همه‌گیر شدن تلگرام در ایران، کانالی برای وبلاگ ایجاد کردم که با عضو شدن میتونین براحتی از مطالب جدید مطلع بشین. ID کانال networkz هست؛ میتونین براحتی با کلیک کردن در اینجا کانال رو ببنین.

13 دیدگاه برای “خوش و بشی با داکر (Docker)”

  1. دستتون درد نکنه عالی بود
    من یک سوالی دارم
    من چن تا ایمیج بر روی داکر میزارم
    و کارام رو انجام میدم
    بعد راهی هست که همین os رو ازش بک آپ بگیرم
    یا ساده تر یک Os نصب کنم بعد داکر و بعد داشته هام رو از روی یک سرور به سرور دیگه منتقل کنم؟

      1. البته دستور Save هم در داکر داریم که سرچ بزنید. و مقاله اقا سینا این رو پوشش می دهد.

        1. این ساده ترین کار و راحت ترین کار هستش و خودمم بخاطر تحریم خیلی خیلی از
          docker save MYDOCKER > MYDOCKER.tgz
          docker load < MYDOCKER.tgz
          استفاده کردم.
          فقط به موردی که میشه اشاره کرد این هستش که دستوراتی mount کردن هایی که داریم رو پوشش نمیده و باید حواسمون به این موضوع باشه.
          در خیلی از موارد به دلیل امنیت در یک موضوع و از بیرون اطلاعات رو به صورت فقط خواندنی به container میدیم. خلاصه اینطور موارد باید بهشون توجه کنیم.
          ممنونم از پاسختون.

  2. سلام
    اگر عجله ای ندارید، من همین موضوع رو با مطلب بعدی، یکی کنم و اونجا جواب سوالتون رو‌بدم
    تا هفته ی دیگه به امید خدا منتشرش میکنم

  3. سلام.
    ممنون . از دنیای بیکران داکر دید خیلی خوبی داده بودید. که به قول شاعر : آب داکر را اگر نتوان کشید، هم به قدر تشنگی وبلاگ سینا رو میشه خوند 🙂
    اقا بابت اینکه گفتید : داکر برای هر مرحله‌ای که جلو میریم یک لایه در نظر میگیره؛ من خیلی مشتاق شدم سبک اش رو بدونم. مقاله ای معرفی می کنید؟
    تنها اطلاعی که من دارم اینه که با هر دستور ران یک لایه می سازه. ولی من هر بار که بیلد می گرفتم همه ران ها رو از اول اجرا می کرد

    1. سلام
      لطف دارین مهندس
      نه فقط دستور RUN ، یک امتحان ساده میتونه این باشه که شما در بین RUN هادستور مثلا ENV بگذارید یا حتی یک COPY انجام بدین
      به طور کلی هر زمانی که شما یک دستور داکری اجرا کنین (مثلا RUN ,ENV, COPY, ADD) یک لایه براش ایجاد میشه.
      هر قدر تعداد این لایه ها کمتر باشه حجم image شما کوچیک تر میشه. من خودم معمولا اول یک Dockerfile پر از لایه برام درست میشه
      چون میخام سریع از خیلی از قسمت های اولیه رد بشم و وقتی که کارم تموم شد، تبدیلش میکنم به یک تک RUN. اختلاف حجمی Image هم خیلی محسوس هستش.
      برای درک بهترش، یک image برنامه (مثل nginx ) از هاب داکر بگیرین. و بعد history اون image رو بررسی کنین (docker history nginx) میبینین که چجور لایه
      بندی داره.

      اپدیت: یک نوشته ی زیبا دیدم فکر میکنم براتون جالب باشه https://www.ctl.io/developers/blog/post/caching-docker-images/

      1. ممنون. مقاله اش رو خوندم خوب بود. چقدر ریزه کاری داره این داکر.
        قشنگ فکر کنم یکسالی آدم باید باهش درگیر بشه تا درک کاملی ازش داشته باشه.
        چند روز پیش این مقاله رو دیدم واقعا لذت بردم :
        What We’ve Learned Launching Over 300 Million Containers !! 😳 in year : 2014!!
        https://www.iron.io/docker-in-production-what-weve-learned/

        1. ازین سبک موارد زیاد داره میشه، کلا دنیای container ها برای خودش چالش بزرگی توی دنیای مجازی سازی ایجاد کرد… و یکی از پرچم دار ها Docker هستش.
          این مقاله هم یکی از همین سبک مقالات هستش که چند وقت پیش بهش بر خوردم:
          http://highscalability.com/blog/2016/9/28/how-uber-manages-a-million-writes-per-second-using-mesos-and.html

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.