داکر (Docker) چیست؟
۱۱ اسفند ۱۴۰۰
به زبان ساده، داکر (Docker) یک پلتفرم است که روند ساخت (build)، اجرا، مدیریت و توزیع برنامهها را ساده میکند. حال اگر قصد دارید در حوزهی دوآپس (DevOps) کار خود را شروع کنید اما Docker جزوی از رزومهی شما نیست، بیتردید وقت آن رسیده که مهارت Docker را فرا بگیرید زیرا یادگیری نحوهی کار با این پلتفرم یکی از مهارتهای مهم برای کسانی است که میخواهند در حوزهی DevOps کار کنند.
اولین نسخه Docker در سال ۲۰۱۳ منتشر شد. شاید برایتان جالب باشد که بدانید این پلتفرم با زبان Go توسعه داده شده است و توانسته با ارائهی راه حل برای بسیاری از نیازهای حوزهی زیرساخت، توجه زیادی را به خود جلب کند. Visa، PayPal و دانشگاههای Indiana و Cornell برای اجرا و مدیریت برنامههای خود از Docker استفاده میکند.
راه حلهای ارائه شده توسط Docker برای مشکلهای موجود در حوزهی زیرساخت
فرض کنید سه برنامهی مختلف دارید که هر کدام از آنها با نسخه متفاوتی از زبان Python توسعه داده شدهاند و شما قصد دارید تا آنها را در یک سرور میزبانی کنید. همچنین کتابخانهها و وابستگیهای این برنامهها از یک برنامه به برنامهی دیگر متفاوت است.
از آنجا که نصب نسخههای مختلف زبان Python بر روی یک میزبان بهراحتی امکانپذیر نیست، این امر مانع از میزبانی هر سه برنامه در یک سرور میشود. در چنین سناریویی میتوان این مشکل را با داشتن سه سرور متفاوت یا یک سرور بسیار قوی که قدرت اجرای سه virtual machine را داشته باشد، برطرف کرد. هر دوی این گزینهها به ما امکان میدهند تا نسخههای مختلفی از زبان Python را بههمراه وابستگیهای مرتبط با هر برنامه در یک سرور یا یک virtual machine نصب کنیم. صرف نظر از اینکه کدام راه حل را انتخاب کنیم، هزینههای مربوط به تهیه و نگهداری سختافزار بسیار گران تمام میشود. حال که مشکل را متوجه شدهاید به سراغ راه حلهای ارائه شده توسط 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 از سه جز اصلی دیگر تشکیل شده است:
- Server
- REST API
- Client
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
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi