داکر، کانتینر و اتوماسیون

مقدمه

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

خواهش من مثل همیشه، انه که ان مطلب رو بخونید، ازش لذت ببرید و برای دوستاتون هم بفرستید و اگر جایی اشکالی دیدید، بهم خبر بدید. ضمنا، حقوق نویسنده رو هم فراموش نکنید و اگر جایی از این مطلب استفاده میکنید، اسم نویسنده اصلی (من، آیین) رو توش درج کنید.

سپاس

داکر (Docker) چی هست؟

اول از همه، داکر اسم شرکتی هست که واژه کانتِینِر یا Container رو روانه‌ی دنیای آی‌تی کرده. البته که قبلا هم از این واژه استفاده‌های گسترده‌ای میشده، اما داکر باعث شده که واژه کانتِینِر معنی مشخص‌تر و دقیق‌تری پیدا کنه.

خود نرم‌افزار داکر، یه سرویس برای مدیریت کانتینرها یا Container Service Manager هست. کلیدواژه‌هایی که میشه برای داکر استفاده کرد، توسعه‌دادن، دیپلوی کردن و اجرا کردن هستن. در واقع داکر هدفش اینه که وقتی برنامه‌نویس‌ها، نرم‌افزاری رو می‌نویسن، اون رو به کانتینرها منتقل و به سادگی اون رو هر جایی اجرا کنن.

پلتفرم (سَکو؟!) کانتینر چی هست؟

پلتفرم کانتینر یا Container Platform یه سرویس کامل برای سازمان‌ها و شرکت‌هاست که بتونن باهاش مشکلات مختلفی رو حل کنن. مهمترین ویژگی کانتینرها اینه که تمام نرم‌افزارهایی که برنامه لازم داره رو، توی خودشون نگه‌میدارن. اما یکم در مورد کانتینرها عمیق بشم...

کانتینر یه پراسِس (Process) داکر هست که فقط روی لینوکس یا ویندوز اجرا میشه (ظاهرا برای مک هم هست ولی من جایی ندیدم) و داخل خودش هرچیزی که برای اجرا شدن نیاز داشته‌باشه رو داره. در واقع یه کانتینر یکمی شبیه به ماشین‌مجازی یا Virtual Machine هست با این تفاوت که هسته‌ی سیستم‌عامل میزبان یا Host رو به اشتراک میذاره.

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

این رو اضافه میکنم، فرض کنید داکر همون نرم‌افزار Oracle VirtualBox یا VMWare هست و کانتینرها، همون سیستم‌عامل‌هایی که توشون نصب می‌کنیم.

Containerization vs Virtualization

قبل از اینکه وارد این مبحث بشم، یه نگاهی به ترمینولوژی داکر داشته باشیم:

موتور داکر یا Docker Engineقسمتی از داکر که وظیفه‌ی ایجاد و اجرای کانتینرها رو دارههاب داکر یا Docker Hubسرویسی از داکر برای به اشتراک‌گذاری کانتینرها با دیگرانداکر کامپوز یا Docker Compose

ابزاری که باهاش برنامه‌های چند کانتینری تعریف میکنیم. این ابزار از فایلهای Yaml استفاده میکنه تا فایل‌ها و تنظیمات رو کانفیگ کنه و کانتینر رو آماده اجرا کنه.

در کل استفاده از این ابزار سه مرحله داره:

  1. محیط برنامه رو با یه Dockerfile تعریف میکنیم تا همه‌جا بشه ازش استفاده کرد.
  2. سرویس‌هایی که لازم هست برای اجرای این کانتینر رو تو فایل docker-compose.yml میذاریم تا با فایل Dockerfile یه جا اجرا بشن.
  3. دستور docker-compuse up رو اجرا میکنیم و تموم میشه!

داکر ایمِج یا Docker Image

تو داکر، همه‌چیز بر اساس ایمِج‌ها ساخته شده!

داکر فایل یا Docker fileدستوراتی که برای ساخت ایمِج لازم هست اینجا تعریف میشه.

حالا کانتِینِریزِیشن در مقابل ویرچوالیزِیشن یا مجازی‌سازی چی هست؟

هرچه‌قدر که زمان میگذره، تکنولوژی داکر بین حرفه‌ای‌های IT محبوبیت بیشتری پیدا می‌کنه، که باعث میشه برای برنامه‌نویس‌ها دونستن حداقل مبانی کانتینر‌ها به یک «باید» تبدیل بشه.

صنعت IT هرروز درحال تغییر و پیشرفته و «سرعت و بهینه‌سازی» تبدیل به اساس این صنعت شدن. تکنولوژی‌ها سعی کردن روش‌های بهتری رو برای اتوماسیون ارائه بدن تا پروسه ساخت و تولید برنامه‌ها روراحتتر و سریع‌تر کنن.

نمیدونم که آیا با Industry 4.0 آشنایی دارید یا نه، اما مجازی‌سازی یا ویرچوالیزیشن (Virtualization) سعی کرده تا این نسخه از صنعت IT رو بهینه‌تر و قابل‌حمل‌تر یا Portable کنه. با این‌حال، تکنولوژی مجازی‌سازی نقاط ضعف جدی رو داره، مثل کاهش محسوس پرفورمنس نرم‌افزارها که بخاطر وزن زیاد و ساختار سنگین VMها یا Virtual Machineها اتفاق میوفته. یا مثلا غیرقابل حمل بودن برنامه‌ها و کارایی پایین در مدیریت منابع سیستم و چیزهای دیگه از این دسته.

اینجاست که صنعت IT رفته سراغ تکنولوژی داکر و کانتینریزیشن! دقیق‌تر میگم، موتور داکر برای کانتینریزیشن ساخته شده که مراحل بسته‌بندی، حمل و گسترش برنامه‌ها رو بسیار ساده کرده.

شکافت هسته‌ی اتم!

برای یادگیری و راه‌اندازی داکر، نیازی نیست فیزیک کوانتوم بلد باشید یا بتونید حداقل یکی از سوالای میلنیوم ریاضی رو حل کنید! فقط کافیه یکمی با محیط ترمینال و cli دوست باشید و یک تکست‌ادیتور هم کنار دستتون باشه، و خب قطعا داشتن یکمی دانش برنامه‌نویسی هم میتونه به کارتون بیاد!

نصب و راه‌اندازی داکر

گرفتن تمام ابزارهای مورد نیازتون برای داکر میتونه کمی خسته‌کننده به نظر برسه. اما توصیه‌ی من اینه که قبل از نصب داکر، حتما نرم‌افزار vscode رو دانلود کنید و در نهایت داکر رو برای سیستم‌عامل خودتون دریافت کنید.

بعد از نصب داکر، دستور زیر رو اجرا کنید تا مطمئن بشیم همه‌چیز درست انجام شده:

$ docker run hello-world

که در پاسخش باید نتیجه‌ی زیر رو دریافت کنید:

Hello from Docker.
This message shows that your installation appears to be working correctly.
...

بازی با BusyBox

حالا که داکر نصب شده، بریم و یکم دستامون رو کثیف کنیم. برای اینکار یه کانتینر BusyBox (یه نرم‌افزار که یسری از ابزارهای Unix رو توی یه فایل به شما میده) رو نصب میکنیم تا طعم دستور docker run رو بچشیم.

برای شروع، دستور زیر رو اجرا کنید:

$ docker pull busybox

دقت داشته باشید که ممکن هست به ارور permission denied برخورد کنید. بهترین راه اینه که خودتون رو توی گروه docker اضافه کنید تا ازش پیشگری بشه.

دستور pull ایمِج BusyBox رو از رجیستری داکر (Docker Registry) یا همون داکرهاب (Docker Hub) دریافت و اون روی روی سیستممون ذخیره میکنه. ضمنا شما میتونید دستور docker images رو اجرا کنید تا ببینید چه ایمِج‌هایی روی سیستمتون نصب شدن.

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
nexus.ida-analytics.de/ida/moira     latest              e3503776559a        6 days ago          387MB
nexus.ida-analytics.de/ida/grafana   latest              a1192aa71c7f        7 days ago          387MB
nexus.ida-analytics.de/ida/grafana                 6145fb02ee49        7 days ago          387MB
nexus.ida-analytics.de/ida/moira                   1323d422a434        7 days ago          387MB
busybox                              latest              8c811b4aec35        7 weeks ago         1.15MB

Docker Run

عالی شد! حالا وقتش شده که یه کانتینر داکر، مبتنی بر ایمِجی که گرفتیم رو اجرا کنیم. برای اینکار از دستور زیر استفاده میکنیم:

$ docker run busybox
$

چی شد؟! چرا هیچ اتفاقی رخ نداد؟! خب، واقعیت اینه که کلی اتفاقات اینجا افتاده که با چشم غیر مسلح قابل رویت نیست :دی. وقتی که شما دستور run رو صدا میزنید، داکر ایمِجی که گفتید رو پیدا میکنه (اینجا میشه Busybox)، یه کانتینر براش میسازه و یه دستور رو توی کانتینر اجرا میکنه. اگر دقت کنید، تو دستور docker run busybox ما هیچ دستور اضافی رو فراهم نکردیم. بنابراین کانتینر ساخته شده، بالا اومده، یه دستور خالی رو اجرا کرده و خارج شده.

دستور بالا رو میشه اینطور هم نوشت:

$ docker run busybox echo "Salam Donya!!"
Salam Donya!!

اینجا داکر، دستور echo رو اجرا کرده و در نهایت بسته شده. حالا فکر کنید میخواستید همه‌ی اینا رو با ماشین‌مجازی اجرا کنید! چقدر باید صبر می‌کردید؟

حالا وقتش شده که دستور docker ps رو اجرا کنیم.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

از اونجایی که هیچ کانتینری در حال اجرا نیست، ما هم یه لیست خالی رو دریافت کردیم. حالا یکم دستور رو دقیق‌تر میکنیم:

$ docker ps -a
CONTAINER ID        IMAGE                                       COMMAND                CREATED             STATUS                      PORTS               NAMES
2059d101f971        busybox                                     "echo Hallo"           15 minutes ago      Exited (0) 15 minutes ago                       hopeful_nightingale
45f36d883bd4        busybox                                     "sh"                   15 minutes ago      Exited (0) 15 minutes ago                       kind_mcnulty
375b34dfa64c        nexus.ida-analytics.de/ida/moira:latest     "/bin/moira"           6 days ago          Exited (137) 6 days ago                         moira
45ba50ce36f9        nexus.ida-analytics.de/ida/grafana:latest   "/bin/start_grafana"   6 days ago          Exited (0) 6 days ago                           grafana

همون‌طور که مشخصه، پارامتر -a دستور داده که لیست تمام کانتینرها، فاقد از وضعیتشون (که اینجا exited هست) برگردونده بشه.

شاید براتون سوال بشه که چطور میشه دستورات بیشتری رو توی کانتینر اجرا کرد؟ خیلی آسون. اگر با دستور ssh آشنایی داشته باشید، میخوایم اینجا یه کاری مشابه اون رو انجام بدیم:

$ docker run -it busybox sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # pwd
/
/ # uptime
 22:30:58 up  3:26,  0 users,  load average: 1.54, 1.46, 1.48
/ #

اجرا کردن دستور run با پارامتر -it باعث میشه که ما به داخل کانتینر (در واقع با ساخت یه سِشِن tty) بریم و دستوراتی که میخوایم رو اونجا اجرا کنیم.

قبل از اینکه به مرحله‌ی بعدی برم، بهتون این نکته رو هم میگم که چطور میشه کانتینرها رو حذف کرد. بالاتر دیدیم که با اجرا کردن دستور docker ps -a میتونیم لیست تمام کانتینرهامون رو بدست بیاریم. برای حذف یه کانتینر کافیه که CONTAINER ID او کانتینر رو برداریم و بعد دستور docker rm CONTAINER_ID رو اجرا کنیم. که در پاسخش باید آی‌دی کانتینر دوباره به شما نمایش داده بشه.

دستور زیر هم هست:

$ docker rm $(docker ps -a -q -f status=exited)

اجرا کردن این دستور، تمام کانتینرهایی که وضعیت exited دارن رو پاک میکنه.

وب‌اَپ تو داکر

تا اینجا فهمیدیم که دستور docker run تا حدودی چطور کار میکنه، همزمان یکمی هم با کانتینرها بازی کردیم و با ترمینولوژی داکر بیشتر آشنا شدیم. حالا وقتش شده که بریم سراغ مسائل اساسی، و ببینیم که چطور میشه یه وب‌اَپ رو تو داکر دیپلوی یا Deploy کرد.

سایت‌های استاتیک

بذارید قدم‌های کوچک برداریم. اولین چیزی که میریم سراغش، دیپلوی کردن یه سایت استاتیک خیلی ساده هست. یه ایمِج رو از داکر‌هاب دریافت یا pull میکنیم و اجراش میکنیم تا ببینیم چقدر راه‌اندازی سایت‌های استاتیک کار آسونیه.

ایمِجی که برای اینکار استفاده میکنیم، یه ایمِج از قبل آماده شدست:

$ docker run prakhar1989/static-site

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

خب تو این حالت، داکر هیچ پورتی رو نمایش یا اصطلاحا اِکسپوز (Expose) نمیکنه، برای همین لازم هست که مجددا دستور docker run رو اجرا کنیم تا پورت‌ها رو نمایش بدیم. همزمان هم باید کاری کنیم که ترمینال روی این حالت قفل نشه و ما بتونیم از ترمینال، بدون بستن سرور خارج بشیم. به این حالت میگن Detached Mode یا حالت جدا شده!

$ docker run -d -P --name static-site prakhar1989/static-site
531b38e65151ba7ee133aff085d4c3e31d9ab349d0fed2b48b91cf28d53ca685

تو دستور بالا، -d حالت detached mode رو اجرا و -P پورت‌هارو باز میکنه. --name هم اسمی رو برای کانتینر درنظر میگیره. حالا میتونیم پورت‌های باز شده رو پیدا کنیم:

$ docker port static-site
443/tcp -> 0.0.0.0:32768
80/tcp -> 0.0.0.0:32769

حالا، http://localhost:32769 رو باز کنید و نتیجه رو ببینید.

?

همچنین میتونید یه آدرس پورت دلخواه هم به ایمِجتون بدید:

$ docker run -p 8888:80 prakhar1989/static-site
Nginx is running...

این دستور میگه که: به پورت ۸۸۸۸ سیستم هاست یا میزبان، هرچیزی که تو پورت ۸۰ ایمِج بود رو اختصاص بده. برای اینکه کانتینر رو متوقف کنید، دستور docker stop رو به همراه آی‌دی کانتینر اجرا کنید.

مطمئن هستم که شما هم موافقید این کار واقعا آسون بود! فکر کنید شما یه سرور دارید و میخواید سایتتون رو روش راه‌اندازی کنید، کل کار اینه که داکر رو نصب کنید و دستورات بالا رو وارد کنید!

ولی خب، این برای ما کافی نیست، چون ما دوست داریم بیشتر بدونیم :) برای همین باید یاد بگیریم چطور داکر ایمِج خودمون رو بسازیم...

داکر ایمِج‌ها

ما با ایمِج‌ها تا حدودی آشنا شدیم، ولی تو این بخش میخوام عمیق‌تر شیرجه‌ بزنیم تو ایمِج‌ها و ببینیم اصلا ایمِج‌های داکر چی هستن... کاری که انجام دادیم این بود که ایمِج busybox رو از رجیستری دریافت یا pull کردیم، و به داکر گفتیم که یه کانتینر مبتنی بر اون ایمِج برامون بسازه. اول بیاید یه لیستی از ایمِج‌هامون رو بگیریم:

$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
nexus.ida-analytics.de/ida/moira     latest              e3503776559a        7 days ago          387MB
nexus.ida-analytics.de/ida/grafana   latest              a1192aa71c7f        7 days ago          387MB
nexus.ida-analytics.de/ida/grafana                 6145fb02ee49        7 days ago          387MB
nexus.ida-analytics.de/ida/moira                   1323d422a434        7 days ago          387MB
busybox                              latest              8c811b4aec35        7 weeks ago         1.15MB
prakhar1989/static-site              latest              f01030e1dcf3        2 years ago         134MB

این لیست، لیست همه‌ی ایمِج‌هایی هست که من روی این سیستمم نصب دارم و از رجیستری‌های مختلف دریافت کردم. TAG به یک نسخه‌ی مشخص از ایمِج اشاره می‌کنه و IMAGE ID به آی‌دی منحصر به فرد اون ایمِج.

برای سادگی فهم، ایمِج‌ها رو به چشم ریپازیتوری‌های گیت ببینید. ایمِج‌ها میتونن کامیت بشن و ورژن‌های مختلفی داشته باشن، در حالت عادی هم، داکر نسخه latest رو دریافت میکنه که مشابه شاخه یا branch اصلی یا main تو گیت هست. مثلا میخوایم یه نسخه از اوبونتو رو دریافت کنیم:

$ docker pull ubuntu:12.04

برای اینکه از یه ایمِج استفاده کنید، یا میتونید اون رو از رجیستری داکر یا همون داکر هاب دریافت کنید یا یه ایمِج برای خودتون بسازید.

مهم‌ترین چیزی که باید موقع انتخاب ایمِج‌ها تو ذهن داشته باشید، تفاوت بین ایمِج‌های پایه یا base و ایمِج‌های مبتنی یا child هستن:

  • ایمِج‌های پایه یا Base images: ایمِج‌هایی هستند که بر هیچ ایمِج دیگه‌ای مبتنی نیستن، که معمولا (و نه همیشه) سیستم‌عامل هستن، و
  • ایمِج‌های مبتنی یا Child images: که مشخصا مبتنی بر ایمج‌های پایه هستن.

و دو جور ایمِج رسمی و عیر رسمی هم داریم:

  • ایمِج رسمی یا Official image: که توسط خود گروه داکر پشتیبانی و نگهداری میشن. معمولا تک‌کلمه‌ای هستن مثل ubuntu، busybox و hello-world. و
  • ایمِج‌های عیر رسمی یا Unofficial image: که توسط کاربرهایی مثل من و شما ساخته میشن و بر اساس ایمِج‌های اصلی هستن که معمولا شکل نمایششون user-name/image-name هست.

اولین ایمِج ما

حالا که درک بهتری از ایمِح‌های داکر داریم، وقتش شده که یه ایمِج برای خودمون بسازیم. برای اینکار، یه برنامه‌ی ساخته شده با ری‌اکت‌جی‌اس رو اصطلاحا داکرایز یا Dockerize میکنیم:

$ npm i -g create-react-app

اول که باید نصاب ری‌اکت رو نصب کنیم، و بعد پروژه رو میسازیم:

$ create-react-app our-awesome-app
$ cd our-awesome-app

از اینجا به بعد هر کار خواستید با پروژه بکنید... اما در نهایت یه فایل به اسم Dockerfile تو پوشه‌ی اصلی پروژه بسازید و اون رو بازش کنید و محتوای زیر رو بهش اضافه کنید:

FROM node:9.6.1

RUN mkdir /usr/src/app
WORKDIR /usr/src/app

ENV PATH /usr/src/app/node_modules/.bin:$PATH

COPY package.json /usr/src/app/package.json
RUN npm i --silent
RUN npm i react-scripts -g --silent

CMD ["npm", "start"]

و یه فایل .dockerignore بسازید (به . اول اسمش دقت کنید) و توش محتوای زیر رو بریزید:

node_modules

و در نهایت ایمِج رو بسازید:

$ docker build -t our-awesome-app .
...
Successfully built 8ab82c09e422
Successfully tagged our-awesome-app:latest

و بعد از اتمام ساخت، کانتینر مربوط به ایمِجتون رو ایجاد و اجرا کنید:

$ docker run -it \
  -v ${PWD}:/usr/src/app \
  -v /usr/src/app/node_modules \
  -p 3000:3000 \
  --rm \
  our-awesome-app

به همین سادگی! شما پروژتون رو داکرایز کردید :) حالا میتونید http://localhost:3000 رو باز کنید و ببینید پروژتون رو.

داکر کامپُز (Docker Compose)

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

  • Docker Machine که کمک میکنه هاست‌های داکر روی کامپیوترتون، کلاد یا فضاهای ابری و حتی دیتا‌سنترتون بسازید،
  • Docker Compose ابزاری برای ساخت اپلیکیشن‌های چند کانتینری داکر (چندتا کانتینر رو در کنار هم قرار میده) و
  • Docker Swarm که ابزاری برای ساخت کلاسترها یا خوشه‌های کانتینریه.

تو این بخش میخوایم بریم سراغ داکر کامپُز و ببینیم که چطور میشه اپلیکیشن‌های داکر مبتنی بر چند کانتینر ساخت.

اینطور فرض کنید که یه کانتینر مسئول اجرای کدهای PHP، Go، JavaScript و زبان‌های دیگست، یه کانتینر دیتابیس MySql و MongoDb رو داره، یه کانتینر وب‌سرور Apache یا NginX و...

گذشته‌ی داکر کامپُز جالبه، تقریبا چهار سال پیش (سال ۲۰۱۴) شرکتی به اسم OrchardUp ابزاری رو به اسم Fig به بازار عرضه کرد. هدف از ساخت Fig این بود که بشه محیط برنامه‌نویسی یا Development Environment مبتنی بر داکر ساخت و اونها رو ایزوله کرد، تا فضای کاری برنامه‌نویس‌ها مشابه به هم بشه.

تا اینجا، داکر یه ابزاری بود برای ساخت پروسه‌ها یا Application Processes. بعد از این، داکر APIهای مختلفی رو ارائه داد که بشه پوشه‌ها رو بین کانتینرها به اشتراک گذاشت و پورتی رو از هاست به کانتینر فوروارد کرد، لاگ‌ها رو نمایش داد و غیره. ولی با همه‌ی اینها، داکر فقط یه چیز بود: ابزاری برای ساخت پروسه‌ها!

با اینکه داکر این امکان رو میده تا بشه کانتینرهای مختلف رو با هم اورکِسترِیت یا Orchestrate کرد (به زبان ساده یعنی هماهنگی بینشون ایجاد کرد تا منظم و درست کار کنن)، همچنان با این کانتینرها به شکل «یک موجودیت» یا Single Entity برخورد نمیکنه. یعنی مهندس نرم‌افزار باید همه‌چیز رو خودش مدیریت کنه. اینجاست که حضور ابزاری مثل Fig خیلی بدرد خورد! از این به بعد مهندسین باید به این شکل بهش نگاه میکردن: «یک برنامه‌ی داکر رو اجرا کنیم که کلاستری از کانتینرها رو مدیریت میکنه» و نه اینکه صرفا یه کانتینر رو اجرا کنیم.

مشخص شد که خیلی از بروبچه‌ها و مهندسینی که از داکر استفاده میکردن با این تعریف موافق بودن. برای همین هم وقتی که Fig در حال محبوب شدن بود، شرکت داکر اون رو خرید و اسمش رو به Docker Compose تغییر داد.

خب، حالا اصلا کامپُز برای چی استفاده میشه؟ کامپُز یه ابزاره که کمک میکنه برنامه‌هایی رو با چند کانتینر اورکستریت کنیم. این ابزاری فایلی رو ایجاد میکنه به اسم docker-compose.yml که کل دستوراتی رو که لازم هست رو در خودش داره و اونها رو فقط با یه دستور اجرا میکنه.

بذارید با هم برنامه‌ای رو که بالاتر با داکر ساختیم، اینبار با داکر کامپُز اجرا کنیم. برای اینکار فایل docker-compose.yml تو پوشه‌ی اصلی برنامه بسازید و محتوای زیر رو توش قرار بدید:

version: '3.5'

services:

  our-awesome-app:
    container_name: our-awesome-app
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - '.:/usr/src/app'
      - '/usr/src/app/node_modules'
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=development

حالا کامپُز رو نصب کنیم...

بعد از نصب کامپُز، دستور زیر رو اجرا کنید:

$ docker-compose up -d --build

ساختار داکر کامپُز

اصلی‌ترین دلیل ساخت داکر کامپُز، ایجاد برنامه‌ها بر اساس معماری مایکروسرویس بود، یا درواقع کانتینرها و روابط بینشون. اما داکر کامپًز ویژگی‌های دیگه‌ای هم داره:

  • ساخت یک ایمِج داکر (درصورتی که یک فایل Dockerfile معتبر تو پوشه‌ی اصلی موجود باشه) با دستور:
    docker-compose build
  • مقیاس‌بندی کانتینرها با دستور:
    docker-compose scale SERVICE=3
  • نجات‌دادن یا درواقع اجرای مجدد کانتینرها در صورت پَنیک با دستور:
    docker-compose up --no-recreate

یکی از مهم‌ترین دستورات داکر کامپُز، docker-compose up هست که اول دستور docker-compose build و بعد docker-compose run رو اجرا می‌کنه.

جریان کار یا Workflow در داکر کامپُز

جریان کار تو داکر کامپُز سادست:

  1. هر سرویس رو تو یه داکر فایل تعریف می‌کنیم (یک روش)،
  2. سرویس‌ها و روابطشون رو تو فایل docker-dompose.yml تعریف می‌کنیم و
  3. دستور docker-compose up رو اجرا می‌کنیم تا سیستم بالا بیاد.

اما برای اینکه بهتر متوجه بشیم، میریم که چندتا اپ مختلف بسازیم تا روش‌ها دیگه برای استفاده از داکر کامپُز رو یاد بگیریم


ادامه‌ی مطلب رو میتونید از سایت خودم بخونید...

https://www.saidi27.com/blog/%D8%AF%D8%A7%DA%A9%D8%B1-%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1-%D9%88-%D8%A7%D8%AA%D9%88%D9%85%D8%A7%D8%B3%DB%8C%D9%88%D9%86