از مبتدی تا حرفه‌ای: یادگیری Docker قدم به قدم


۰


داکر چیست؟

داکر مجموعه‌ای از محصولات Platform as a Service است که با استفاده از مجازی‌سازی در سطح سیستم‌عامل (OS-level virtualization) نرم‌افزار را در بسته‌هایی به نام کانتینر ارائه می‌کند. کانتینرها از یکدیگر ایزوله هستند و نرم‌افزار، کتابخانه‌ها و فایل‌های پیکربندی خود را بسته‌بندی می‌کنند؛ آن‌ها از طریق کانال‌های مشخص با یکدیگر ارتباط دارند. همه کانتینرها توسط یک کرنل سیستم‌عامل واحد اجرا می‌شوند و به همین دلیل نسبت به ماشین‌های مجازی (Virtual Machines) سبک‌تر هستند.[8]

کانتینر چیست؟

Docker Container یک واحد استاندارد شده است که می‌توان آن را به سرعت ساخت تا یک برنامه یا محیط خاص را مستقر (deploy) کند. این کانتینر می‌تواند مثلاً یک کانتینر اوبونتو (Ubuntu container)، سنت‌اواس (CentOS) و ... باشد تا نیازمندی‌های سیستم‌عامل را برآورده کند. همچنین می‌تواند کانتینری ویژه برنامه باشد، مثل کانتینر CakePHP یا Tomcat-Ubuntu.


مفاهیم داکر

داکر یک پلتفرم برای توسعه‌دهندگان و مدیران سیستم است تا برنامه‌ها را بسازند، به اشتراک بگذارند و اجرا کنند با استفاده از کانتینرها. استفاده از کانتینرها برای استقرار برنامه‌ها به نام containerisation شناخته می‌شود. کانتینرها جدید نیستند، اما استفاده آسان آن‌ها برای استقرار اپلیکیشن‌ها تازه و رایج شده است.

مزایای محبوبیت containerisation عبارت‌اند از:

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

خوش آمدید! خوشحالیم که می‌خواهید داکر را یاد بگیرید. دوره شروع به کار Docker به شما یاد می‌دهد چطور:

  1. محیط داکر خود را راه‌اندازی کنید (در این صفحه)
  2. یک image بسازید و به عنوان یک کانتینر اجرا کنید
  3. کوبِرنِتس (Kubernetes) را روی ماشین توسعه خود راه‌اندازی و استفاده کنید
  4. محیط Swarm را روی ماشین توسعه ایجاد و استفاده کنید
  5. اپلیکیشن‌های کانتینری‌شده خود را روی Docker Hub به اشتراک بگذارید

تصاویر (Images) و کانتینرها

به طور پایه، یک کانتینر چیزی جز یک پروسس در حال اجرا نیست که ویژگی‌های انضمامی‌ای روی آن اعمال شده تا ایزوله باقی بماند و از سیستم‌عامل میزبان و کانتینرهای دیگر جدا باشد. یکی از مهم‌ترین ویژگی‌های ایزوله‌سازی کانتینر، این است که هر کانتینر با یک فایل‌سیستم خصوصی خود کار می‌کند؛ این فایل‌سیستم از یک Docker image فراهم می‌شود. این image شامل همه چیز برای اجرای برنامه است — کد یا باینری، runtimeها، وابستگی‌ها و همه فایل‌های لازم.


کانتینرها و ماشین‌های مجازی (VMها)

یک کانتینر روی لینوکس به صورت native اجرا می‌شود و کرنل سیستم میزبان را با کانتینرهای دیگر به اشتراک می‌گذارد. کانتینر یک پروسس جداگانه است که به اندازه هر اجرایی دیگر حافظه مصرف می‌کند و به همین دلیل سبک‌وزن است.

در مقابل، یک ماشین مجازی یک سیستم‌عامل مهمان کامل را اجرا می‌کند که از طریق یک hypervisor به منابع سیستم میزبان به صورت مجازی دسترسی دارد. به طور کلی، VMها سربار زیادی نسبت به منطق اپلیکیشن دارند.


خلاصه‌ای از آنچه تا الان یاد گرفتیم:

  • ماشین‌های مجازی بوت شدن‌شان کند و زمان‌بر است.
  • کانتینرها سریع بوت می‌شوند چون از سیستم‌عامل میزبان و کتابخانه‌های مرتبط آن استفاده می‌کنند.
  • کانتینرها منابع میزبان را هدر نمی‌دهند یا مسدود نمی‌کنند، بر خلاف ماشین‌های مجازی.
  • هر کانتینر کتابخانه‌ها و باینری‌های مختص برنامه اجرا شده خود را دارد.
  • کانتینرها توسط موتور containerisation مدیریت می‌شوند.
  • داکر یکی از پلتفرم‌های containerisation است که می‌توان برای ایجاد و اجرای کانتینرها استفاده کرد.

چرا از داکر استفاده می‌کنیم؟

همانطور که توضیح دادیم، داکر چیست؛ اما چرا به داکر نیاز داریم؟ کانتینرهای داکر سبک‌وزن و بسیار ساده برای ساخت و استقرار هستند.

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


مزایای استفاده از کانتینرها نسبت به ماشین‌های مجازی

  • برخلاف VMها که روی سیستم‌عامل مهمان و توسط hypervisor اجرا می‌شوند، کانتینرهای داکر مستقیماً روی سرور میزبان (برای لینوکس) و با موتور داکر اجرا می‌شوند و سبک‌تر و سریع‌تر هستند.

  • ادغام کانتینرهای داکر آسان‌تر از VMهاست.
  • سیستم‌های مجازی‌شده کامل ایزوله‌ترند ولی منابع بیشتری مصرف می‌کنند؛ داکر ایزوله کمتر ولی مصرف منابع پایین‌تری دارد که اجازه می‌دهد هزاران کانتینر روی یک سرور اجرا شود.
  • شروع به کار یک VM حداقل یک دقیقه طول می‌کشد، اما داکر معمولاً در کسری از ثانیه آماده است.
  • فرار (Break out) از کانتینر آسان‌تر از VM است.
  • برخلاف VMها نیازی نیست RAM از قبل تخصیص داده شود؛ به همین دلیل داکر RAM کمتری نسبت به VM مصرف می‌کند و تنها به‌اندازه نیاز از حافظه استفاده می‌کند.


داکر چگونه کار می‌کند؟

با شناخت فواید داکر، اجازه دهید عملکرد داکر را هم بررسی کنیم. داکر دارای یک docker engine است که قلب سیستم داکر است و یک برنامه client-server محسوب می‌شود. سه بخش اصلی دارد:

  • سرور که یک پروسس طولانی‌مدت یا daemon است.
  • کلاینت که همان Docker CLI (رابط خط فرمان) است.
  • REST API برای ارتباط بین کلاینت (Docker CLI) و سرور (Docker Daemon).

Docker daemon فرمان‌ها را از کلاینت دریافت می‌کند و اشیاء داکر مثل تصاویر، کانتینرها، شبکه‌ها و حجم‌ها را مدیریت می‌کند. کلاینت و دیمون می‌توانند روی یک سیستم باشند یا از طریق شبکه به یکدیگر متصل شوند و با REST API، سوکت‌های UNIX یا رابط شبکه ارتباط برقرار کنند.

در لینوکس، میزبان داکر daemon را اجرا می‌کند و کلاینت را می‌توان از ترمینال فراخواند.

در ویندوز یا مک‌او‌اس، ابزاری اضافی به نام Docker Toolbox وجود دارد که محیط داکر را نصب می‌کند، شامل: Docker Client، Compose، Kitematic، Machine و VirtualBox.


تکنولوژی‌های استفاده شده در داکر

زبان برنامه‌نویسی داکر GO است. داکر از ویژگی‌های کرنل لینوکس مثل namespaces و cgroups بهره می‌برد.

  • namespaces: داکر از namespaces برای ایجاد فضای کاری ایزوله شده‌ای به نام کانتینرها استفاده می‌کند. هر بخش از کانتینر در یک namespace جدا اجرا می‌شود و دسترسی آن محدود به همان فضای اسمی است.

  • cgroups (control groups): برای محدود کردن و ایزوله کردن استفاده منابع سخت‌افزاری (مثل CPU، حافظه، Disk I/O، شبکه) توسط مجموعه‌ای از پروسس‌ها استفاده می‌شود. cgroups به موتور داکر اجازه می‌دهد منابع موجود را بین کانتینرها تقسیم کند و در صورت نیاز محدودیت اعمال نماید.

  • UnionFS (Union file systems): فایل‌سیستم‌هایی که با ساخت لایه‌ها کار می‌کنند، بسیار سبک و سریع هستند و توسط داکر برای ساخت پایه‌های کانتینرها استفاده می‌شوند.

موتور داکر این سه مورد (namespaces، cgroups و UnionFS) را در قالب قالبی به نام container format ترکیب می‌کند. قالب پیش‌فرض، libcontainer است.


نصب Docker Desktop

بهترین راه برای شروع توسعه اپلیکیشن‌های کانتینری شده، نصب Docker Desktop در macOS یا Windows است. با Docker Desktop به راحتی می‌توانید Kubernetes یا Swarm روی ماشین توسعه خود راه‌اندازی کنید و بدون نیاز به خوشه (cluster) از تمام ویژگی‌های هماهنگ‌کننده استفاده کنید. دستورالعمل‌های نصب برای سیستم عامل خود را دنبال کنید:


دستورات پرکاربرد داکر

  1. docker --version

    گرفتن نسخه نصب‌شده فعلی داکر.

  2. docker pull

    1docker pull <image-name>

    دانلود یک ایمیج از رپوزیتوری داکر (مثل hub.docker.com)

  3. docker run

    1docker run -it -d <image-name>

    ساخت کانتینر از روی یک ایمیج و اجرای آن

  4. docker ps

    نمایش کانتینرهای در حال اجرا

  5. docker ps -a

    نمایش همه کانتینرها، شامل کانتینرهای در حال اجرا و متوقف شده

  6. docker exec

    1docker exec -it <container-id> bash

    دسترسی به یک کانتینر در حال اجرا (شبیه ssh به داخل کانتینر)

  7. docker stop

    1docker stop <container-id>

    توقف اجرای یک کانتینر

  8. docker kill

    1docker kill <container-id>

    توقف فوری کانتینر (برخلاف stop که به کانتینر اجازه خاموشی مرتب را می‌دهد)

  9. docker commit

    1docker commit <container-id> <username/image-name>

    ساختن یک ایمیج جدید از یک کانتینر ویرایش‌شده روی سیستم محلی

  10. docker login

    ورود به رپازیتوری Docker Hub

  11. docker push

    1docker push <username/image-name>

    ارسال ایمیج به Docker Hub

  12. docker images

    نمایش همه ایمیج‌های محلی

  13. docker rm

    1docker rm <container-id>

    حذف یک کانتینر متوقف شده

  14. docker rmi

    1docker rmi <image-id>

    حذف یک ایمیج از فضای ذخیره‌سازی محلی

  15. docker build

    1docker build <path-to-Dockerfile>

    ساخت یک ایمیج از روی یک Dockerfile مشخص‌شده


ساخت اولین اپلیکیشن Docker

فرض کنیم یک اپلیکیشن PHP داریم و می‌خواهیم آن را در سرور staging یا production مستقر کنیم. ابتدا مطمئن می‌شویم که فایل پیکربندی داکر را در ریشه پروژه داریم.

  1. ساخت Dockerfile در پروژه

در ریشه پروژه، فایلی با نام Dockerfile بسازید و کد زیر را قرار دهید تا داکر بداند هنگام اجرای پروژه در محیط staging یا production چه کار کند:

1FROM PHP:7.2-Apache  
2COPY src/ /var/www/html/  
3EXPOSE 80

این اسکریپت داکر نمونه نسخه PHP 7.2 را روی یک سرور staging یا production تنظیم می‌کند، فایل‌های PHP از پوشه src/ به مسیر /var/www/html/ کپی می‌شوند و پورت 80 برای دسترسی باز می‌شود.

  1. نصب Docker روی سرور Staging یا Production
  • برای Mac از اینجا نصب کنید.
  • برای ویندوز از اینجا اقدام کنید.
  1. اجرای داکر

پس از نصب روی سرور، روی آیکون نهنگ در سیستم کلیک کنید تا Docker اجرا شود.

  1. استقرار اپلیکیشن

اپلیکیشن را به سرور منتقل کنید و کارهای زیر را انجام دهید:

  • در ترمینال به دایرکتوری پروژه بروید و یک ایمیج داکر بسازید:
1docker build -t <name-to-give-your-image> .

این دستور یک Docker image می‌سازد و تمام وابستگی‌ها را دانلود می‌کند.

  • ایمیج ساخته شده را به یک کانتینر در حال اجرا تبدیل کنید:
1docker run -p 9090:80 <name-to-give-your-container>

پورت 9090 پورتی است که در میزبان برای دسترسی به برنامه استفاده می‌کنیم و 80 پورتی است که داخل کانتینر باز شده.


چند دستور مفید داکر

  • توقف کانتینر در حال اجرا:
1docker stop <container-id>
  • شروع کانتینری که متوقف شده:
1docker start <container-id>
  • حذف ایمیج داکر:
1docker rmi <image-id>
  • حذف کانتینر از داکر:
1docker rm <container-id>
دوآپس
داکر
کوبرنتیز
sysops
ظروف

۰


نظرات


author
نویسنده مقاله: حامد فیض آبادی

کد با می متعهد است که بالاترین سطح کیفی آموزش را در اختیار شما بگذارد. هدف به اشتراک گذاشتن دانش فناوری اطلاعات و توسعه نرم افزار در بالاترین سطح ممکن برای درستیابی به جامعه ای توانمند و قدرتمند است. ما باور داریم هر کسی میتواند با استمرار در یادگیری برنامه نویسی چالش های خود و جهان پیرامون خود را بر طرف کند و به موفقیت های چشم گیر برسد. با ما در این مسیر همراه باشید. کد با می اجتماع حرفه ای برنامه نویسان ایرانی.

تمام حقوق این سایت متعلق به وبسایتcodebymeمیباشد.