داکر چیست؟ سایت داکر، آن را «یک پروژه متنباز برای بستهبندی، انتقال و اجرای هر برنامهای به صورت یک حامل (Container) سبک» معرفی میکند. یکی از قابلیتهای منحصر به سیستمعامل لینوکس (داکر تنها بر روی لینوکس اجرا میشود و حاملهای آن هم تنها میتوانند لینوکس باشند) امکان ایجاد حامل است. یک حامل، به نوعی یک مجازیساز در سطح سیستمعامل است، به این معنی که به غیر از هسته سیستمعامل، همه اجزای سیستمعامل درون حامل از سیستمعامل بیرونی مستقل است.
این نوع مجازیسازی برخلاف مجازیسازی معمولی، سربار (Overhead) بسیار کمی دارد و برخلاف تکنیک chroot (یکی از قابلیتهای سیستمهای خانواده یونیکس، که امکان اجرا کردن یک سری دستورات در یک سیستمعامل خاموش را از طریق سیستمعامل روشن میدهد. به این معنی که با کمک سیستمعامل روشن با چند دستور میتوان یک خط فرمان از سیستمعامل داخلی گرفت و یکی از موارد استفاده آن تعمیر سیستمعاملهای دچار مشکل شده از طریق دیسک زنده است)، دو سیستمعامل کاملا از هم جدا هستند و همدیگر را مثل دو ماشین مجزا در شبکه میبینند. تنها نقطه اشتراک دو سیستمعامل، هسته سیستمعامل (لینوکس) است که در این ترکیب، هسته سیستمعامل بیرونی، سیستمعامل داخلی را هم کنترل میکند (لینوکس این قابلیت را به لطف cgroups و namespaceها برای مجزا کردن پروسهها از همدیگر دارد که از موضوع و سطح این مقاله خارج است).
این قابلیت سالهاست که در لینوکس وجود دارد (نگاه کنید به پروژه LXC) و سوال اینجاست که داکر چه چیزی به این قابلیت اضافه میکند؟ نسخههای اولیه داکر، از LXC برای مدیریت حاملها استفاده میکردند، اما از نسخه 9/0 به بعد، داکر به صورت مستقیم و با کمک کتابخانههایی که LXC هم از آن ها استفاده میکند، مدیریت حاملها را انجام میدهد. آن چه داکر را از بقیه متمایز میکند، تکنیک «مدیریت لایه لایه فایل سیستم» و امکان Copy-on-write فایل سیستم است. با توجه به فلسفه «همه چیز فایل است» در سیستمهای مبتنی بر یونیکس، برای انتقال یک سیستمعامل و حتی ذخیره کردن وضعیت برنامههای در حال اجرا، کافی است راهی برای مدیریت همه این فایلها وجود داشته باشد.
هر حامل در داکر یک فایلسیستمِ کاملِ لینوکسی است که از چندین لایه تشکیل شده و هر لایه عبارت است از تغییرات فایلهای لایه قبلی نسبت به لایه بعدی. داکر به جای نگه داشتن مجموع فایلهای هرلایه، تنها فایلهایی را که از لایه قبلی تا لایه بعدی تغییر کردهاند، نگه داری میکند. مدیریت این لایهها شبیه به سیستمهای کنترل نسخه (بیش تر از همه git) انجام میشود و امکان گرفتن انشعاب، تگ کردن و برگشتن به یک لایه بهخصوص در داکر وجود دارد. در داکر قابلیت ایجاد یک مخزن مرکزی از این لایهها وجود دارد و به این ترتیب با کمک docker-registry (که خود یک پروژه متنباز دیگر است) امکان انتقال این حاملها به راحتی فراهم میشود.
هنگامی که یک نسخه از یک حامل به یک ماشین دیگر انتقال پیدا میکند، میتوان تا بینهایت رونوشت (بسته به منابع سختافزاری آن ماشین) از آن حامل ایجاد کرد. همه حاملها در ابتدا در لایههای فایلسیستم مشترک هستند اما پس از اجرا در لایه جدید به صورت مستقل خواهند بود، این اشتراک در لایهها، باعث کم شدن فضای مورد استفاده میشود.
نصب داکر بسیار ساده است. داکر (بسته به توزیع گنو/لینوکس شما که میتوانید راهنمای آن را بخوانید) معمولا با یک یا دو دستور ساده نصب میشود. حتی اگر نسخه لینوکس شما به صورت رسمی پشتیبانی نشود، با توجه به این که برای نوشتن داکر از زبان Go استفاده شده است، میتوانید آن را کامپایل کنید که تنها با یک دستور اجرا میشود. (اگر Go نصب و تنظیم شده باشد، کل روند دانلود و کامپایل با این یک دستور انجام خواهد شد: go get github.com/docker/docker/ docker
). اگر تمایلی به نصب و کامپایل با Go ندارید، فایل باینری آن به صورت تنها (standalone) اجرا میشود که نیاز به هیچ کتابخانه جانبی ندارد. شما میتوانید به راحتی آن را از اینترنت دانلود کنید.
برای استفاده از داکر میتوانید به این صورت عمل کنید:
ابتدا سرویس داکر را اجرا کنید. بسته به توزیع گنو/لینوکس شما، طریقه اجرای سرویس متفاوت است. اما در نهایت دستور docker -d
با دسترسی کاربر ریشه، کافی است.
سپس دستورات زیر را اجرا کنید:
(این گام نیاز به اینترنت دارد و یک نسخه از اوبونتو رسمی داکر را دانلود خواهد کرد)
docker pull ubuntu
docker run -ti ubunt /bin/bash
تمام شد.
شما دستور bin/bash/ را در یک اوبونتو کاملا مستقل از سیستم خودتان اجرا کردهاید. اگر بیش تر کنکاش کنید متوجه چند نکته خواهید شد:
– یک کارت شبکه مجازی به صورت پُل(bridge) در سیستم شما به وجود آمده است که ارتباط شبکهای شما با این حامل و همه حاملهای روی یک ماشین را به عهده میگیرد.
– با این که شما در اوبونتو هستید، ولی خروجی دستور uname -a (که نسخه کرنل لینوکس شما را نشان میدهد) همچنان نسخه لینوکس اصلی شما را به شما نشان خواهد داد.
– شما تنها یک نسخه اجرا شده از bash را در سیستم داخلی خواهید دید. داکر هیچ سرویس، یا برنامه دیگری را اجرا نکرده است.
– هیچ گونه دسترسی به پروسههای بیرونی وجود ندارد، فایل سیستمِ بیرونی قابل دسترسی نیست (مگر این که شما قسمتی از آن را با حامل به اشتراک گذاشته باشید)
– از بیرون، پروسههای داخلی در دسترس هستند. میتوان آن ها را دید و حتی به آن ها سیگنال Kill فرستاد، ولی هیچ راهی از داخل به بیرون نیست.
– برنامهای مثل htop را در حامل نصب کنید و اجرا کنید. خواهید دید که کل CPUهای سیستم بیرونی، کل حافظه و فضای swap بیرونی شما در اختیار حامل نیز هست، یعنی اگر چندین حامل همزمان اجرا شوند، برخلاف مجازیسازی که از ابتدا همه منابع مورد نیازش را از سیستم جدا خواهد کرد، حامل هر زمان که لازم داشته باشد میتواند به منابع بیش تری دسترسی پیدا کند و هر زمان که در حالت ایدهآل باشد میتواند آن منابع را رها کند. البته امکان کنترل منابع برای حاملها نیز وجود دارد.
به جز مورد اول، تمام موارد بعدی، تفاوت داکر را با یک مجازیسازی معمولی نشان میدهد.
انتقال و بستهبندی برنامهها
اگر حتی یک بار سعی در نصب برنامهها (بیش تر برنامههای تحت وب) کرده باشید، حتما میدانید که یک برنامه برای اجرا، نیاز به اجزای فراوانی دارد. از وب سرور، پایگاهداده، مفسر (برای زبانهای اسکریپتی مثل پایتون یا روبی یا Node.js یا PHP) ماشین مجازی جاوا (برای زبانهای مبتنی بر ماشین مجازی جاوا) و… دارد که نصب هر کدام زمان و انرژی زیادی میطلبد. حال اگر چندین بار در روز این برنامهها را نصب کنید و یا این که نیاز به بروزرسانی مداوم آن ها باشد… خودتان حدس میزنید که چه انرژی و زمانی از شما گرفته میشود.
قابلیتهای داکر که ذکر شد (از جمله سربار کم، استقلال کامل دو سیستم از هم، در اختیار بودن همه منابع و همچنین اجرا نشدن سرویسها و برنامههای اضافی) آن را به یک انتخاب بسیار مناسب برای نصب و انتقال برنامهها به مکان نهایی و اجرای آن ها بدل میکند. نصب برنامهها در یک حامل از طریق یک فایل با ساختار خاص (Dockerfile) صورت میگیرد. در این سیستم هر برنامه بر روی یک حامل توسط یک نفر و فقط برای یک بار نصب میشود و هیچگونه تداخلی نیز با برنامههای دیگر نخواهد داشت.
بعد از ساختن این حامل ها میتوان آن را به مخازن اصلی داکر، یا مخازن اختصاصی فرستاد و آن ها را با دیگران به اشتراک گذاشت. برای جستجو در مخزن عمومی داکر میتوان از دستور docker search استفاده کرد، مثلا برای دیدن حامل هایی که دیگران در آن redmin نصب کردهاند کافی است این گونه جستجو کنید:
docker search redmine
و بعد یکی از حاملهای فهرست شده را (برمبنای نیاز خود) دریافت(pull) و اجرا کنید. هر چند داکر یک پروژه نسبتا جوان است اما میتوان از آن برای بستر نصب و انتقال نرمافزارها استفاده کرد. ابزارهای بسیاری (مثل coreOs، سایت koding.io و docker provider برای vagrant و…) نیز برمبنای داکر ایجاد شدهاند که هر کدام، امکانات فراوانی را به کاربران میدهند.
برای گرفتن اطلاعات بیش تر میتوانید سایت داکر را ببینید و مطالعه کنید.
منبع: Salam-Donya