با Docker همه چیز را همه جا بدون دردسر اجرا کنید

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

داکر (docker) یک نرم افزار متن باز است که هدف آن بصورت کلی در سه کار خلاصه می شود:

  1. بسته بندی برنامه نرم افزاری (build containers)
  2. انتقال بسته های نرم افزاری از یک کامپیوتر به کامیپوتر دیگر ( ship containers)
  3. اجرای بسته نرم افزاری بر روی کامپیوتر مقصد (run containers)


کار اصلی داکر آسان کردن روند نصب برنامه های مختلف نرم افزاری برروی یک کامپیوتر است. اگر از داکر استفاده نمی کنید برای نصب یک برنامه بر روی کامپیوتر خود معمولا روند زیر را دنبال می کنید:

  1. یک فایل installer متناسب با سیستم عامل و توزیع خود دانلود می کنید (مثلا در ویندوز فایل msi یا exe یا در لینوکس redhat بسته RPM یا در لینوکس های debian based فایل DEB )
  2. باید مطمئن شوید که پیش نیازهای مورد نظر برای نصب آن برنامه را نصب کرده اید
  3. اقدام به نصب برنامه کنید

البته ممکن است در مرحله ۲ اتفاق بدتری هم بیافتد مثلا برنامه ای در کامپیوتر خود داشته باشید که باعث ایجاد تداخل برای نصب برنامه جدید شود و یا حتی اتفاق بدتر می تواند این باشد که پیش نیازی را که برنامه جدید لازم دارد شما درحال حاضر دارید اما نسخه آن قدیمی تر است و در صورت تغییر نسخه آن پیش نیاز ممکن است برنامه های دیگر که دارید دچار مشکل شوند


یک راه این است که از ابزارهایی مثل VMware یا VirtualBOX استفاده کنیم که تا حدی این مشکل را برطرف می کند اما مشکل اصلی این گونه ابزارها حجم بالا و سرعت پایین نصب و راه اندازی آن هاست. همین طور مشکل نداخل برنامه های داخل یک virtual machine همچنان برقرار است.

داکر راهکاری ارائه داده است که دردسرهای راه اندازی نرم افزار روی ماشین های مختلف را تقریبا از بین می برد.

در شکل بالا روش کار docker بصورت شماتیک نمایش داده شده است. بخش های اصلی سیستم داکر عبارتند از:

  • ساخت تصویر: تصویر یا image درواقع شامل برنامه اصلی به همراه تمام وابستگی های مرتبط با آن است که هنوز اجرا نشده (شبیه به فایل های فشرده iso یا zip که باید آنها را توسط یک برنامه اجرا کرد تا محتویات شان را دید) برای ساخت تصاویر از دستوری در داکر به نام build استفاده می شود. معمولا روش کار به این صورت است که یک تصویر اولیه را دانلود میکنیم و تغییراتی را که میخواهیم اعمال کنیم در فایلی به نام Dockerfile ذخیره می کنیم و با استفاده از دستور build تصویر جدید را میسازیم
  • اجرای تصویر: پس از اینکه تصویر ساخته شد می توان آن را با دستور docker run اجرا کرد در این حالت به تصویری که اجرا می شود container گفته می شود برعکس ماشین های مجازی سازی دیگر مانند VMware که میتوان فقط تعداد محدودی تصویر در آنها اجرا کرد (به دلیل محدودیت سخت افزاری) در داکر میتوان به تعداد زیادی container داشت و آنها را مدیریت کرد و مانند ماشین های مجازی سازی متوقف و یا کلا حذف کرد.
  • انتشار تصویر: میتوان تصویر ساخته شده را به مخزن های آنلاین همانند git فرستاد (با دستور push) و یا از تصاویر دیگر که برنامه نویسان دیگر آنها را ساخته اند استفاده کرد. یکی از این سرویس آنلاین docker hub نام دارد که برای مخزن های عمومی رایگان است.

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

Docker pull debian

با این دستور می توان یک image را از docker hub دانلود کرد (اگر image در حال حاضر وجود داشته باشد از خود دیسک خوانده می شود) 

docker run -it debian /bin/bash

با این دستور میتوان image دانلود شده را اجرا کرد پارامتر it- برای این است که بعد از اجرای container دستور بعدش را که اینجا /bin/bash است اجرا شود. لیست کامل پارامترهای دستورات docker را میتوان در خود داکیومنت های داکر پیدا کرد. 

docker ps

با این دستور میتوان لیست container های در حال اجرا را مشاهده کرد

docker logs container_id

با این دستور میتوان لاگ یک container در حال اجرا را مشاهده کرد (در این دستور بالا container_id همان مقداری است که از دستور docker ps در دستور قبل برای container مورد نظر بدست آمده) 

docker stop container_id
docker start container_id
docker pause container_id
docker restart container_id

این چهار دستور برای تغییر وضعیت اجرای container استفاده می شود. نکته قابل توجه در مورد متوقف کردن container در حال اجرا (دستور stop) این است که خود داکر برای container هایی که میسازد یک نوع فایل سیستم هم در نظر میگیرد و توقف یک container به معنی پاک شدن کل اطلاعات آن نیست بلکه مثلا اگر از دیتابیس در پروژه استفاده کرده باشید با توقف container و راه اندازی مجدد آن دیتابیس پاک نمیشود حتی اگر در فایل سیستم خودتان آن را حذف کنید به این دلیل که هنگام ساخته شدن container یک مکان برای ذخیره سازی اطلاعات آن در نظر گرفته میشود که برای سیستم های لینوکسی معمولا در این آدرس /var/lib/docker قرار دارد.

 مثالی از کار با docker

بعد از نصب داکر بر روی سیستم خود همانطور که در این لینک توضیح داده شده میتوانید از docker در command line استفاده کنید و image های مختلف را از سایت hub.docker.com و یا مخزن های دیگر دریافت کنید. توصیه میشود برای دانلود image ها از اینترنت پر سرعت استفاده کنید که نامحدود باشد چون حجم image ها معمولا بالاتر از ۱۰۰ مگابایت است اگر هم سرور اختصاصی یا مجازی دارید بهتر است روی آن تست کنید cool

ما برای آموزش از یک توزیع لینوکس (mint 17.2) استفاده کردیم شما میتوانید تقریبا از هر توزیع و یا سیستم عامل دیگری برای کار با داکر استفاده کنید برای نصب میتوانید به این لینک مراجعه کنید

 

docker pull python:2.7

 ابتدا تصویر python نسخه ۲.۷ را از docker hub با دستور بالا دریافت می کنیم دستورات مربوط به دریافت و ارسال docker شباهت زیادی با git دارد. (مثلا push و pull و commit) با استفاده از دونقطه ( : ) میتوان tag مربوط به یک تصویر خاص را مشخص کرد در اینجا tag نشان دهنده نسخه پایتونی است که لازم داریم. 

 

docker run -it --rm python:2.7

بعد از دریافت تصویر مربوط به پایتون ۲.۷ میتوان با دستور بالا آن را اجرا کنیم همانطور که در قبل گفته شد اضافه کردن it به عنوان option در دستور run به این معنی است که بعد از اجرای تصویر مورد نظر یک کنسول برای دریافت ورودی ایجاد میکند اگر it را در دستور نزنید تصویر اجرا می شود اما کنسولی برای اجرای دستورات برای شما درست نمی شود option دیگری که داده شده rm است و به این معنی است که container ایجاد شده بلافاصله بعد از پایان کار پاک شود و باقی نماند.

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

حالا میخواهیم که تغییراتی در تصویر فعلی بدهیم و آن را اجرا کنیم ابتدا یک folder را در نظر گرفته و در آن فایلی به نام Dockerfile میسازیم و کدهای زیر را در آن می نویسیم:

FROM python:2.7

EXPOSE 8888

CMD python -m SimpleHTTPServer 8888

 این فایل را با نام Dockerfile (حتما با همین نام) ذخیره کنید در اول هر خط این فایل یک سری دستور وجود دارد که داکر آنها را میشناسد و از روی ان image جدید می سازد.

در اولین خط FROM به این معناست که از کدام تصویر به عنوان تصویر پایه استفاده کند که ما در اینجا از تصویر پایتون نسخه ۲.۷ به عنوان نسخه پایه استفاده کرده ایم

در خط دوم EXPOSE به این معناست که در زمان اجرا container از کدام پورت listen میکند که در اینجا ما پورت آزمایشی ۸۸۸۸ را انتخاب کردیم

در خط سوم CMD به این معنی است که چه دستوری بعد از اجرای تصویر پایه اجرا شود. ما دراینجا یک سرور پیش فرض پایتون به اسم simpleHTTPServer را انتخاب کردیم و آنرا روی پورت ۸۸۸۸ همان پورتی که در خط قبل تعریف شد اجرا می کنیم. (simpleHTTPServer بعد از اجرا شبیه به ftp server عمل میکند و محتویات directory فعلی را نمایش می دهد)

ا\ر علاقه مندید توضیحات بیشتر دستورات مربوط به Dockerfile را میتوانید در اینجا ببینید

حالا که این فایل را ساختیم قدم بعدی build کردن آن است به صورت زیر آن را build میکنیم تا تصویر جدید ساخته شود:

sudo docker build -t test_server .

توجه کنید که حتما نقطه آخر خط گذاشته شود (نقطه به معنی directory فعلی است) با استفاده از دستور build میتوان تصویر جدید را ساخت با t- میتوانیم برای تصویر جدید اسم انتخاب کنیم که در اینجا نام آن را test_server گذاشتیم

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

docker run -d -p 8888:8888 test_server

در این دستور وظیفه d- این است که پس از اجرای container آن را به background ببرد در ادامه از p- استفاده شده که در ادامه دو عدد با : از هم جدا شده اند که اولی به معنای پورت اصلی است و دومی به معنی پورتی است که قرار است در داکر به آن وصل شود در اینجا هردوتا ۸۸۸۸ در نظر گرفته شده اند

حالا با زدن دستور docker ps میتوانید container های در حال اجرا را ببینید.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6fddea4542ae        test_server         "/bin/sh -c 'python -"   28 minutes ago      Up 28 minutes       0.0.0.0:8888->8888/tcp   awesome_einstein

بعد از دیدن container خود که در حال اجرا است اگر با مرورگر خود ip:port ای که دادید را وارد کنید لیست دارکتوری ای که داکر در آن درحال اجرای container است مشاهده میکنید (اگر کامپیوتر شخصی است 127.0.0.1:8888 و اگر برروی سرور این کار را انجام دادید server_ip:8888 را در url وارد کنید) چیزی شبیه به تصویر زیر نمایش داده می شود:

 برای متوقف کردن container همانطور که در قبل گفته شد میتوانید از دستور stop استفاده کنید.

منابع


  1. docs.docker.com
  2. elastico.io
  3. troubleshooters.com/linux/docker/docker_newbie.htm
  4. valdhaus.co/writings/docker-misconceptions
© از شما برای بازنشر مطالب به همراه لینک سایت ممنونیم!