برنامه‌نویسی

مقدمه‌ای بر پلتفرم Docker

مقدمه‌ای بر پلتفرم docker

اگر قصد دارید در حوزه‌ی DevOps کار خود را شروع کنید اما Docker جزوی از رزومه‌ی شما نیست بی‌تردید وقت آن رسیده که مهارت Docker را فرا بگیرید زیرا این پلتفرم یکی از مهارت‌های مهم برای کسانی است که می‌خواهند در حوزه‌ی DevOps کار کنند. حال ما در این مقاله قصد داریم تا Docker را به ساده‌ترین شکل ممکن برای شما توضیح دهیم.

Docker چیست؟

به زبان ساده Docker یک پلتفرم نرم‌افزاری است که روند ساخت (build)، اجرا، مدیریت و توزیع برنامه‌ها را ساده می‌کند.

اولین نسخه Docker در سال ۲۰۱۳ منتشر شد. شاید برایتان جالب باشد که بدانید این پلتفرم با زبان Go توسعه داده شده است و توانسته با ارائه‌ی راه حل‌های مختلف برای بسیاری نیازها در حوزه‌ی زیرساخت توجه زیادی را به خود جلب کند. Visa، PayPal و دانشگاه‌های Indiana و Cornell برای اجرا و مدیریت برنامه‌های خود از Docker استفاده می‌کند.

راه حل‌های ارائه شده توسط Docker برای مشکل‌های موجود در حوزه‌ی زیرساخت

فرض کنید سه برنامه‌ی مختلف دارید که هر کدام از آن‌ها با نسخه متفاوتی از زبان Python توسعه داده شده‌اند و شما قصد دارید تا آن‌ها را در یک سرور میزبانی کنید. همچنین کتابخانه‌ها و وابستگی‌های این برنامه‌ها از یک برنامه به برنامه‌ی دیگر متفاوت است.

از آنجا که نصب نسخه‌های مختلف زبان Python بر روی یک میزبان به‌راحتی امکان‌پذیر نیست، این امر مانع از میزبانی هر سه برنامه در یک سرور می‌شود. در چنین سناریویی می‌توان این مشکل را با داشتن سه سرور متفاوت یا یک سرور بسیار قوی که قدرت اجرای سه virtual machine را داشته باشد، برطرف کرد. هر دوی این گزینه‌ها به ما امکان می‌دهند تا نسخه‌های مختلفی از زبان Python را به‌همراه وابستگی‌های مرتبط با هر برنامه در یک سرور یا یک ‌virtual machine نصب کنیم. صرف نظر از اینکه کدام راه حل را انتخاب کنیم، هزینه‌های مربوط به تهیه و نگهداری سخت‌افزار بسیار گران تمام می‌شود. حال که مشکل را متوجه شده‌اید به سراغ راه‌ حل‌های ارائه شده توسط Docker می‌رویم.

پلتفرم Docker توانسته یک راه حل مقرون به صرفه و کارآمد برای این مشکل ارائه دهد. برای درک راه حل ارائه شده توسط این پلتفرم به تصویر زیر توجه کنید:

راه حل ارائه شده توسط docker

سیستم یا دستگاهی که Docker بر روی آن نصب و اجرا می‌شود معمولا Docker Host یا Host نامیده می‌شود. بنابراین هر زمان که می‌خواهید برنامه‌ای را روی Host مستقر کنید، یک logical entity برای میزبانی آن برنامه ایجاد می‌شود. حال در اصطلاح‌های ارائه شده توسط Docker به logical entity ایجاد شده Docker container یا container می‌گویند.

توجه داشته باشید که Docker container، هیچ سیستم‌عاملی را نصب و اجرا نمی‌کند اما یک نسخه‌ی مجازی شده از process table، network interface و file system mount point را در اختیار دارد که تمام آن‌ها از منابع سیستم‌عامل میزبان یا همان Docker Host که container در آن میزبانی و اجرا شده در اختیار برنامه‌ی ما قرار داده می‌شود.

همچنین لازم به ذکر است که هسته‌ی سیستم‌عامل میزبان با تمام containerهایی که روی آن اجرا می‌شوند به‌اشتراک گذاشته می‌شود بنابراین ما می‌توانیم چندین container در یک Docker Host داشته باشیم که برنامه‌های مورد نیاز ما را به‌صورت جداگانه در یک محیط ایزوله و جداگانه اجرا می‌کنند اما باید سیستم‌عامل مورد نیاز برای اجرای برنامه‌ها یکسان باشد.

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

مزیت‌های استفاده از Docker

  • با استفاده از Docker می‌‌توانید چندین برنامه با وابستگی‌های مختلف را در یک Docket Host در کنار هم اجرا کنید به شرط اینکه به سیستم‌عامل یکسانی نیاز داشته باشند.
  • فضای disk مورد نیاز برای هر container با بهینه‌سازی‌های انجام شده معمولا چند مگابایت است بنابراین فضای disk بسیار کمی را اشغال خواهند کرد و می‌توانید تعداد زیادی از برنامه‌ها را در یک Docket Host اجرا کنید.
  • Docker فضای memory کم‌تری را نسبت به virtual machinها که یک سیستم‌عامل کامل هستند، اشغال می‌کند بنابراین توان اجرایی که می‌تواند در اختیار برنامه قرار داده شود، بیشتر خواهد بود. علاوه‌براین زمان راه‌اندازی container به چند ثانیه کاهش پیدا می‌کند.
  • Docker تاثیر بسیار زیادی در کاهش هزینه‌های شما خواهد داشت زیرا به سخت‌افزار کم‌تری برای اجرای برنامه‌هایتان نیاز خواهید داشت.

عیب استفاده از Docker

  • برنامه‌هایی که به سیستم‌عامل‌های مختلفی نیاز دارند نمی‌توانند با هم در یک Docker Host میزبانی شوند. برای مثال فرض کنید که چهار برنامه‌ی مختلف وجود دارد که سه برنامه مبتنی بر سیستم‌عامل Linux اجرا می‌شوند و یک برنامه به سیستم‌عامل Windows نیاز دارد. در چنین شرایطی، سه برنامه‌ای که مبتنی بر Linux هستند می‌توانند در یک Docker Host میزبانی شوند اما برنامه‌ای که مبتنی بر Windows است باید در یک Docker Host جداگانه میزبانی شود.

اجزای اصلی Docker

Docker Engine یک برنامه‌ی مبتنی بر مدل client-server است که یکی از اجرای اصلی Docker محسوب می‌شود و مسئول عملکرد کلی این پلتفرم است. حال Docker Engine از سه جز اصلی دیگر تشکیل شده است:

  1. Server
  2. REST API
  3. Client
اجزای docker engine

Server یک daemon که به dockerd (Docker Daemon) معروف است را اجرا می‌کند. حال مسئولیت ایجاد و مدیریت imageها، containerها، networkها و volumeها در پلتفرم Docker بر ‌عهده‌ی این فرایند است.

REST API نحوه‌ی تعامل برنامه‌ها با Server را تعیین می‌کند.

Client نیز یک command line interface است که به توسعه‌دهنده یا مسئول DevOps امکان می‌دهد با اجرای دستور با Docker ارتباط برقرار کند.

اصطلاح‌های پلتفرم Docker

در این بخش به‌طور مختصر به برخی اصطلاح‌های مرتبط با پلتفرم Docker می‌پردازیم.

Docker image و Docker container دو اصطلاح پایه‌ای Docker هستند. به زبان ساده می‌توان Docker image را یک template دانست که برنامه و تمام وابستگی‌های مورد نیاز برای اجرای برنامه را شامل می‌شود.

از طرف دیگر Docker container یک logical entity است که به‌عبارت دقیق‌تر می‌توانیم آن را یک نمونه‌ی در حال اجرا از Docker image بدانیم.

Docker Hub چیست؟

Docker Hub یک ریپازیتوری رسمی است که می‌توانید تمام Docker imageهایی که برای استفاده‌ی عموم در دسترس هستند را در آن پیدا کنید. همچنین به کمک Docker Hub می‌توانید در صورت تمایل image سفارشی‌سازی شده‌‌ خودتان را به‌صورت public یا private ذخیره و توزیع کنید.

البته توجه داشته باشید که حساب‌های کاربری رایگان فقط می‌توانند یک Docker image را به‌صورت Private در Docket Hub میزبانی کنند.

نسخه‌های مختلف Docker

در اصل Docker در دو نسخه‌ی مختلف ارائه می‌شود:

  • Community Edition (CE)
  • Enterprise Edition (EE)

نسخه‌ی Community برای استفاده‌ی شخصی توسعه‌دهندگان و تیم‌های کوچک مناسب است زیرا در مقایسه با نسخه‌ی Enterprise عملکرد محدودتری دارد. از طرف دیگر نسخه‌ی Enterprise برای تیم‌های بزرگ و استفاده از Docker در Production environment مناسب است.

نسخه‌ی Enterprise نیز در سه نسخه مختلف طبقه‌بندی می‌شود:

  • Basic Edition
  • Standard Edition
  • Advanced Edition

نصب Docker

مطمئنا قبل از کار با Docker بایستی آن را بر روی سیستم‌عامل فعلی خود نصب کنید. لیست زیر راهنماهای نصب Docker CE بر روی سیستم‌عامل‌های ذکر شده است:

آموزش استفاده از Docker بدون نیاز به نصب

بعضی اوقات شاید زمان کافی برای نصب Docker را نداشته باشید یا حتی منابع سخت‌افزاری کامپیوتر شما کافی نباشد. در این شرایط نیازی به نگرانی نیست زیرا شما به کمک Play with Docker که یک بازی آنلاین برای یادگیری Docker است می‌توانید از این پلتفرم به‌صورت رایگان استفاده کنید.

دستورهای Docker

اکنون زمان آن رسیده که با دستورهای Docker آشنا شوید:

docker create

دستور docker create به شما امکان می‌دهد تا یک container جدید ایجاد کنید و سینتکس آن به شکل زیر است:

docker create [options] IMAGE [commands] [arguments]

توجه داشته باشید مواردی که در [] قرار دارند، اختیاری هستند. حال با اجرای دستور زیر می‌توانید یک container را با استفاده از آخرین‌ نسخه‌ی fedora image ایجاد کنید:

$ docker create fedora
02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

اولین موردی که پس از اجرای دستور فوق بررسی می‌شود وجود image مورد نظر ما بر روی Docker Hub است. اگر image ما که در این مثال fedora است در Docker Host موجود نباشد، Docker به‌صورت خودکار آخرین نسخه‌ی موجود از fedora image را در Docker Hub جستجو و در صورت وجود، بارگیری می‌کند. در غیر این صورت Docker از fedora image موجود در Docker Host استفاده می‌کند و container را ایجاد خواهد کرد.

Docker پس از ایجاد موفقیت آمیز container مورد نظر یک شناسه را در Console برمی‌گرداند:

02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

این شناسه‌ی container ایجاد شده توسط Docker است.

هر container یک شناسه‌ی منحصربه‌فرد دارد که برای انجام عملیات‌ مختلف بر روی container مورد نظرتان مانند start، stop، restart و … می‌توانید از آن شناسه استفاده کنید. حال در مثال زیر به گزینه‌هایی که می‌توانید از آن‌ها استفاده کنید می‌پردازیم:

$ docker create -t -i ubuntu bash
30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005

همان‌طور که قبل‌تر گفتیم با اجرای دستور فوق به همان ترتیب قبل یک container که از Ubuntu image استفاده می‌کند، ساخته می‌شود اما -t -i یک interactive tty به container اختصاص می‌دهد. علاوه‌برآن پس از start شدن این container دستور bash اجرا خواهد شد.

docker ps

دستور docker ps به شما امکان می‌دهد تا تمام containerهایی که در Docker Host در حال اجرا هستند را مشاهده کنید:

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

حال اگر می‌خواهید تمام containerهایی که در Docker Host ایجاد شده‌اند را مشاهده کنید می‌توانید از -a استفاده کنید:

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS    PORTS     NAMES
a8a33482cc23   ubuntu    "bash"    25 seconds ago   Created             UbuntuWithCLI
  • CONTAINER ID: یک string منحصربه‌فرد متشکل از ۱۲ کاراکتر اول شناسه‌ای که پس از اجرای دستور docker create به container اختصاص داده شده در این ستون نمایش داده می‌شود.
  • IMAGE: نام Docker image مورد استفاده container در این ستون نمایش داده می‌شود.
  • COMMAND: دستورهای مشخص شده‌ای که بایستی هنگام start شدن container، اجرا شوند در این ستون قابل مشاهده است.
  • CREATED: این ستون زمان سپری شده از ایجاد container را نشان می‌دهد.
  • STATUS: وضعیت فعلی container در این ستون نمایش داده می‌شود. اگر container در حال اجرا باشد، مدت زمان سپری شده از start آن نمایش داده می‌شود.
  • PORTS: اگر پورت باز برای container تعریف شده باشد در این ستون نمایش داده می‌شود.
  • NAMES: جدا از شناسه container، یک نام منحصربه‌فرد به هر container اختصاص داده می‌شود که می‌توانیم برای اشاره به container از آن استفاده کنیم. این نام به‌طور خودکار توسط Docker به هر container اختصاص داده می‌شود اما می‌توانید با --name یک نام دلخواه برای container مشخص کنید.

docker start

با اجرای این دستور می‌توانید هر container متوقف شده‌ای را start کنید. سینتکس این دستور به شکل زیر است:

docker start [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

برای start کردن container می‌توانید از CONTAINER ID یا NAME اختصاص داده شده استفاده کرد:

$ docker start 30986

در مثال بالا یک container با شناسه 30986 شروع به کار خواهد کرد و همچنین در مثال زیر یک container با نام elated_franklin اجرا خواهد شد:

$ docker start elated_franklin

docker stop

با دستور docker stop می‌توانید یک container در حال اجرا را متوقف کنید و سینتکس این دستور به شکل زیر است:

docker stop [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

docker restart

با دستور docker restart می‌توانید یک container در حال اجرا را restart کنید و سینتکس آن به شکل زیر است:

docker restart [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

docker run

با اجرای دستور docker run در ابتدا یک container ایجاد شده و سپس start می‌شود. به‌طور خلاصه می‌توان این دستور را ترکیبی از دستورهای docker create و docker start دانست که سینتکس آن به شکل زیر است:

docker run [options] IMAGE [commands] [arguments]

همان‌طور که مشاهده می‌کنید سینتکس دستور docker run مشابه دستور docker create است:

$ docker run ubuntu
30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520

در مثال بالا یک container با آخرین نسخه از Ubuntu image ساخته شده و بلافاصله راه‌اندازی می‌شود. اما اگر دستور فوق را اجرا کنید متوجه خواهید شد که container راه‌اندازی شده بلافاصله متوقف می‌شود و شما هیچ فرصتی برای تعامل با container نخواهید داشت.

اگر بخواهید با container تعامل داشته باشید بایستی -it را به‌عنوان گزینه‌های موجود در دستور تعریف کنید تا یک interactive tty به container اختصاص داده شود:

$ docker run -it ubuntu
root@e4e633428474:/#

برای خارج شدن از container می‌توانید دستور exit را در همین terminal اجرا کنید.

docker rm

برای حذف یک container می‌توانید از دستور docker rm استفاده کنید که سینتکس آن به شکل زیر است:

docker rm [options] CONTAINER ID/NAME [CONTAINER ID/NAME...]

برای حذف دو container با شناسه 30fa و نام elated_franklin می‌توانید به‌ شکل زیر عمل کنید:

$ docker rm 30fa elated_franklin

توجه داشته باشید که containerها بایستی در حالت stop باشند تا بتوانید آن‌ها را حذف کنید.

docker images

با اجرای دستور docker images تمام Docker imageهای موجود در Docker Host نمایش داده می‌شوند:

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    22667f53682a   2 days ago    1.23MB
node         latest    ea27efc47a35   7 days ago    936MB
ubuntu       latest    f63181f19b2f   2 weeks ago   72.9MB
golang       latest    3360fba69704   2 weeks ago   839MB
ruby         latest    d8039aa1bb97   3 weeks ago   850MB
  • REPOSITORY: این ستون نام Docker imageهای موجود در Docker Host را نمایش می‌دهد.
  • TAG: هر image یک tag منحصربه‌فرد دارد و از آن برای نمایش نسخه‌ی image استفاده می‌کنند.
  • IMAGE ID: یک string منحصربه‌فرد که به image اختصاص داده می‌شود.
  • CREATED: این ستون زمان سپری شده از ایجاد image را نشان می‌دهد.
  • SIZE: مقدار disk مصرفی توسط image در این ستون نمایش داده می‌شود.

docker rmi

برای حذف یک یا چند image می‌توانید از دستور docker rmi استفاده کنید که سینتکس آن به شکل زیر است:

docker rmi [options] IMAGE NAME/ID [IMAGE NAME/ID...]

منبع: https://www.freecodecamp.org/news/docker-simplified-96639a35ff36