اگر به والها و یا به (continuous delivery (cd سریع و بدون مشکل نرمافزار خود علاقمند هستید، پیشنهاد میکنیم ادامه این مقاله را که در مورد داکر است، بخوانید. شواهد نشان میدهند که کانتینرهای نرمافزاری، آینده صنعت آیتی هستند؛ پس به سراغ دو وال container، یعنی موبی داک و مالی (Moby Dock and Molly) میرویم.
داکر چیست؟
داکر که از یک وال دوستداشتنی به عنوان لوگو استفاده میکند، یک پروژه متنباز است که استقرار اپلیکیشنها در کانتینرهای نرمافزاری را ساده میکند. عملکرد اصلی داکر به وسیله قابلیت جداسازی منابع هسته لینوکس ممکن میشود؛ اما این پروژه، APIهای کاربرپسندی را در اختیار شما قرار میدهد.
نسخه اول این پروژه در سال ۲۰۱۳ منتشر شده و از آن زمان محبوبیت فوقالعادهای پیدا کرده است. حالا شرکتهای بزرگی مثل eBay، اسپاتیفای، بایدو و… از داکر استفاده میکنند. داکر در آخرین دور جذب سرمایه، ۹۵ میلیون دلار سرمایه جذب کرده و در مسیر تبدیل شدن به بازیگر اصلی در خدمات دواپس است.
مقایسه داکر با کالاهای ترانزیتی
فلسفه پشت داکر را میتوان در مثال ساده زیر نشان داد. در صنعت حمل و نقل بینالمللی، کالاها باید با وسایل مختلفی مانند لیفتراک، کامیون، قطار، جرثقیل و کشتی جابجا شوند. این کالاها شکلها، اندازهها و نیازمندیهای انبارداری مختلفی دارند.
برای مثال کیسههای شکر، قوطیهای شیر، گیاهان و …. از نظر تاریخ انقضا و مصرف، کار حمل و نقل بسیار سخت و پرریسکی دارند و برای بارگذاری و خالی کردن در هر نقطه، حجم کاری سنگینی را تحمیل میکنند.
همه چیز با شروع به کار کانتینرهای بین مدلی تغییر کرد. با توجه به این که این کانتینرها در ابعاد استاندارد هستند و سازندگان آن موقع طراحی به فکر حمل و نقل بودهاند، ماشینهای مربوط به بارگیری را میتوان به شیوهای طراحی کرد، که با حداقل دخالت انسانی فعالیت کنند.
مزیت دیگر کانتینرهای مهر و موم شده، این است که میتوانند محیط داخلی مانند دما و رطوبت را برای کالاهای حساس حفظ کنند. به همین دلیل دیگر لازم نیست فعالان صنعت حمل و نقل نگران سالم ماندن کالاها باشند و میتوانند تمرکز خود را روی جابجایی از نقطه A به B معطوف کنند.
اینجا جایی است که داکر وارد میشود و مزایای مشابهی را برای صنعت نرمافزار به ارمغان میآورد.
تفاوت داکر با ماشینهای مجازی در چیست؟
در نگاه اول ممکن است ماشینهای مجازی و کانتینرهای داکر شبیه هم به نظر برسند. اما اگر به شکل زیر نگاه کنید، متوجه تفاوتهای این دو میشوید.
اگر hypervisor (مجازیساز – برنامهای که زمینه لازم برای مجازیسازی را فراهم میکند) را در نظر نگیریم، برنامههایی که روی ماشینهای مجازی اجرا میشوند، به یک نسخه کامل از سیستم عامل و کتابخانههای پشتیبان نیاز دارند. اما در طرف مقابل، کانتینرها سیستمعامل را، با میزبان به اشتراک میگذارند.
hypervisor را میتوان با موتور کانتینر (که در تصویر به عنوان داکر معرفی شده است) مقایسه کرد؛ به این معنا که چرخه عمر کانتینرها را مدیریت میکند. تفاوت مهم این است که فرایندهای در حال اجرا در کانتینر، درست مانند فرایندهای اصلی در میزبان هستند و هیچ سرباری که مربوط به اجرای hypervisor باشد، را ایجاد نمیکنند. علاوه بر این، برنامههای کاربردی میتوانند مجددا از کتابخانهها استفاده کرده و دادهها را بین کانتینرها به اشتراک بگذارند.
از آنجایی که هر دو تکنولوژی نقاط قوت متفاوتی دارند، یافتن سیستمهایی که ماشینهای مجازی و کانتینرها را ترکیب کنند، رایج است. مثالی خوب برای این ترکیب، ابزاری است که Boot2Docker نام دارد و در بخش نصب داکر آن را توضیح میدهیم.
معماری داکر
در بالای نمودار معماری Docker، رجیستریها وجود دارند. به طور پیشفرض، هاب داکر رجیستری اصلی است که ایمیجهای عمومی و رسمی را میزبانی میکند. سازمانها اگر بخواهند میتوانند رجیستریهای پرایوت را هم میزبانی کنند.
در سمت راست ایمیجها (تصاویر) و کانتینرها را داریم. ایمیجها را میتوان به صورت مستقیم از رجیستریها دانلود (docker pull imageName) کرد و یا به طور ضمنی در زمان آغاز یک کانتینر، آنها را گرفت. زمانی که ایمیج دانلود شد، به صورت لوکال ذخیره میشود. کانتینرها نمودی از ایمیجها هستند؛ به عبارتی نسخه زنده ایمیج محسوب میشوند. ممکن است چندین کانتینر براساس یک ایمیج وجود داشته باشد.
در مرکز این اتفاقات daemon داکر (مرکز کنترل) مسئولیت ایجاد، اجرا و مانیتور کردن کانتینرها و همچنین وظیفه ساختن و ذخیرهسازی ایمیج را بر عهده دارد. در نهایت، در سمت چپ یک کلاینت داکر وجود دارد. کلاینت از طریق HTTP با daemon صحبت میکند. سوکتهای یونیکس زمانی استفاده میشوند که روی همان ماشین باشند، اما مدیریت از راه دور آنها از طریق API مبتنی بر HTTP امکان پذیر باشد.
نصب داکر
برای دریافت آخرین دستورالعملها همیشه باید به اسناد و مدارک رسمی مراجعه کنید.
داکر به صورت نیتیو (Native) روی لینوکس اجرا میشود؛ به همین دلیل بسته به این که از چه توزیعی از لینوکس استفاده میکنید میتوانید داکر را با دستور sudo apt-get install docker.io نصب کنید. برای آگاهی از جزئیات بیشتر میتوانید به مستندات مراجعه کنید.
با توجه به این که daemon داکر از ویژگیهای هسته مختص لینوکس استفاده میکند، اجرای آن در سیستمعامل Mac OS یا ویندوز امکان پذیر نیست. در عوض، باید برنامه Boot2Docker را نصب کنید. این برنامه شامل ماشین مجازی VirtualBox، خود داکر و ابزارهای مدیریت Boot2Docker میشود.
استفاده از داکر
بیایید این بخش را با یک مثال سریع شروع کنیم:
docker run phusion/baseimage echo “Hello Moby Dock. Hello Molly.”
ما باید این خروجی را ببینیم:
Hello Moby Dock. Hello Molly.
با این حال، خیلی بیشتر از آن چیزی که فکر میکنید، در پشت صحنه اتفاق افتاده است.
- ایمیج “phusion/baseimage” از داکر هاب دانلود شده است. (با فرض این که به صورت لوکال وجود نداشته است.)
- یک کانتینر براساس این ایمیج شروع به کار میکند.
- دستور echo در داخل کانتینر اجرا میشود.
- وقتی که از دستور خارج شد، کانتینر متوقف میشود.
در اجرای اول، ممکن است قبل از چاپ متن با تاخیر مواجه شوید. اگر ایمیج به صورت لوکال ذخیره شده باشد، همهچیز در کسری از ثانیه اتفاق میافتد. جزئیات مربوط به آخرین کانتینر را میتوانید از طریق کد زیر مشاهده کنید.
مرحله اول: docker ps
مرحله بعدی
همانطور که ملاحظه میکنید، اجرای یک دستور ساده در داکر، به سادگی اجرای مستقیم آن در ترمینال است. برای این که یک استفاده عملیتر از داکر را نشان دهیم، در ادامه این مقاله با هم بررسی میکنیم و که چطور میتوانیم از داکر، برای استقرار یک برنامه وبسرور ساده استفاده کنیم. برای ساده نگهداشتن کار، یک برنامه جاوا مینویسیم که درخواست HTTP GET را با ‘/ping’ میگیرد و با رشته ‘pong\n’ پاسخ میدهد.
Dockerfile
قبل از این که بخواهید ایمیج داکر خود را بسازید، بهتر است، بررسی کنید که آیا در داکرهاب یا رجیستریهای پرایوت دیگر میتوانید به یک ایمیج مشابه دسترسی پیدا کنید یا خیر؟ مثلا در این جا، به جای نصب خود جاوا، از یک ایمیج رسمی استفاده خواهیم کرد؛ جاوا ۸.
برای ایجاد یک ایمیج، اول باید در مورد ایمیج پایهای که میخواهیم از آن استفاده کنیم، تصمیم بگیریم. برای این کار از FROM استفاده میکنیم. در این لینک میتوانید یک ایمیج رسمی از جاوا ۸ را در داکر هاب ببینید. با استفاده از دستور COPY، آن را به فایل جاوا اضافه میکنیم. سپس، با استفاده از RUN، کد را اجرا میکنیم. دستور EXPOSE نشان میدهد که ایمیج، یک سرویس را در یک درگاه خاص فراهم میکند. ENTRYPOINT دستوری است، که وقتی میخواهیم یک کانتینر براساس این تصویر آغاز شود، آن را اجرا میکنیم و CMD پارامترهای پیشفرضی را که میخواهیم، به آن انتقال دهیم را مشخص میکند.
پس از ذخیره این دستورالعملها در فایلی به نام «پوشه داکر»، میتوانیم ایمیج داکر مربوطه را با اجرای کد زیر بسازیم:
docker build -t toptal/pingpong.
مستندات رسمی داکر بخشی دارد که بهترین اقدامات مربوط به نوشتن داکر فایل را مشخص میکند.
اجرای کانتینرها
هنگامی که ایمیج ساخته شد، میتوانیم از آن به عنوان یک کانتینر زنده استفاده کنیم. راههای مختلفی وجود دارد که کانتینرها را اجرا کنیم، اما بیایید با یک مورد ساده شروع کنیم:
docker run -d -p 8080:8080 toptal/pingpong
این دستور، پورت هاست و کانتینر را مشخص میکند. علاوه بر این، ما به داکر اعلام می کنیم که کانتینر را به عنوان فرایند daemon در پسزمینه با مشخص کردن -d اجرا کند. با وارد کردن آدرس http://localhost:8080 میتوانید ببینید که برنامه وبسرور درست کار میکند یا خیر.
توجه داشته باشید ،در پلتفرمی که در آن Boot2docker مورد استفاده قرار میگیرد، باید localhost را با آدرس آیپی ماشین مجازیای که داکر روی آن در حال اجراست، جایگزین کنید.
در لینوکس:
curl http://localhost:8080/ping
در پلتفرمهایی که نیاز به Boot2Docker دارند:
curl $(boot2docker ip):8080/ping
اگر همه چیز خوب پیش برود، این جواب را خواهید گرفت:
pong
اولین کانتینر داکر ما حالا زنده است و شنا میکند! به جای این کار میتوانستیم کانتینر را در یک حالت اینتراکتیو شروع کنیم. در مثال گفته شده، دستور entrypoint را تبدیل به override میکنیم، تا ترمینال به ما نمایش داده شود. اکنون میتوانیم هر دستوری که میخواهیم را اجرا کنیم، اما خروج از کانتینر آن را متوقف خواهد کرد:
docker run -i -t –entrypoint=”bash” toptal/pingpong
گزینههای بسیار بیشتری وجود دارد، که برای شروع کردن کانتینرها میتوانیم از آنها استفاده کنیم. چند مورد دیگر را در ادامه معرفی خواهیم کرد.
برای مثال، اگر بخواهیم دادهها بیرون از کانتینر باقی بمانند، میتوانیم با استفاده از دستور -v ،فایلهای سیستمی هاست را با کانتینر به اشتراک بگذاریم. به طور پیشفرض، حالت دسترسی روی خواندن/نوشتن تنظیم شده است؛ اما با استفاده از اضافه کردن :ro به آن، میتوان کانتینر را به حالت، فقط خواندن در مسیر داخلی کانتینر تغییر داد.
ولومها (v) زمانی اهمیت پیدا میکنند، که نیاز داشته باشیم از اطلاعات امنیتی مثل اعتبارسنجی و کلیدهای پرایوت در داخل کانتینر استفاده کنیم؛ یعنی اطلاعاتی که نباید روی ایمیج ذخیره شوند. کار دیگری که انجام میدهند، این است که از تکرار دادهها (duplication) جلوگیری میکنند؛ برای این کار مثلا میتوانید ریپازیتوری Maven لوکال را روی کانتینر مپ کنید؛ با این کار، دیگر لازم نیست که کل موارد را دوباره دانلود کنید.
داکر همچنین قابلیت اتصال کانتینرها به یکدیگر را دارد. کانتینرهای متصل شده، میتوانند حتی وقتی که پورتی مشخص نشده است ، با هم در ارتباط باشند. برای این کار میتوانید از دستور -link other-container-name استفاده کنید. در مثال زیر، ترکیبی از پارامترهای ذکر شده در بالا را میبینید:
مثالهایی دیگر از عملکردهای ایمیج و کانتینر
جای تعجب نیست که فهرست عملیاتهایی که میتوانیم برای کانتینرها و ایمیجها به کار ببریم، نسبتا طولانی است. به صورت خلاصه میتوانیم به موارد زیر اشاره کنیم:
- stop – یک کانتینر درحال اجرا را متوقف میکند.
- start – یک کانتینر متوقف شده را اجرا میکند.
- commit – از تغییرات کانتینر، یک ایمیج جدید میسازد.
- rm – یک یا چند کانتینر را پاک میکند.
- rmi – یک یا چند ایمیج را پاک میکند.
- ps – کانتینرها را لیست میکند.
- images – ایمیجها را لیست میکند.
- exec – یک دستور را در یک کانتینر در حال اجرا، اجرا میکند.
دستور آخر به خصوص برای دیباگ کردن مفید است؛ چون به شما اجازه میدهد، که به یک ترمینال در داخل یک کانتینر در حال اجرا متصل شوید.
docker exec -i -t <container-id> bash
Docker Compose برای میکروسرویسها
اگر بیش از چند کانتینر متصل به هم دارید، استفاده از ابزاری مثل docker-compose منطقی به نظر میرسد. برای این کار در یک فایل پیکربندی، نحوه شروع کانتینرها و نحوه اتصال آنها به یکدیگر را شرح دهید. صرف نظر از تعداد کانتینرهای درگیر و وابستگیهای آنها، میتوانید آنها را با دستور زیر اجرا کنید.
docker-compose up
داکر در دنیای واقعی
بیایید نگاهی به سه مرحله از چرخه عمر پروژه بیندازیم و ببینیم که این وال دوستداشتنی چگونه میتواند به ما کمک کند.
توسعه
داکر به شما کمک میکند محیط توسعه لوکال خود را تمیز نگه دارید. به جای داشتن نسخههای متعدد از سرویسهای مختلف نصبشده، مثل جاوا، کافکا، اسپارک، کاساندرا و…، میتوانید فقط کانتینر مورد نیاز را شروع یا متوقف کنید. حتی میتوانید چند بسته نرمافزاری را در کنار هم و بدون تداخل ورژنهای مورد نیاز اجرا کنید.
با کمک داکر میتوانید در زمان، انرژی و هزینه صرفهجویی کنید. اگر راهاندازی پروژه شما خیلی پیچیده است، آن را داکرایز کنید. یک بار درد ساختن داکر ایمیج را بپذیرید و بعد از آن، همه میتوانند در یک چشم به هم زدن، یک کانتینر را اجرا کنند.
همچنین شما میتوانید یک محیط یکپارچهسازی شده، داشته باشید که به صورت لوکال (یا روی CI) اجرا شده باشد و بخشهای کوچک را با سرویسهایی که در کانتینرهای داکر در حال اجرا هستند، جایگزین کنید.
تست / یکپارچهسازی مستمر
با استفاده از داکرفایل، دستیابی به buildهایی که قابلیت بازتولید داشته باشند، راحتتر خواهد بود. میتوان جنکینز یا دیگر راهکارهای CI را به شکلی تنظیم کرد که برای هر بیلد، یک داکر ایمیج بسازند. برای اینکه بعدها بتوانید به ایمیجها ارجاع بدهید، میتوانید همه یا بخشی از آنها را در یک داکر رجیستری پرایوت، ذخیره کنید.
با استفاده از داکر، فقط چیزی که نیاز به تست دارد، را تست میکنید و محیط را از معامله خارج میکنید. انجام تست روی یک کانتینر در حال اجرا باعث میشود، اتفاقها بیشتر قابل پیشبینی باشند.
یکی دیگر از ویژگیهای جالب داشتن کانتینرهای نرمافزاری این است که به راحتی میتوانید ماشینهای برده را با تنظیمات توسعه از دور خارج کنید. این موضوع به ويژه برای آزمایش بار استقرارهای خوشه ای مفید است.
تولید
داکر میتواند رابط بین تیم توسعه و تیم عملیات باشد و با این کار اصطکاک را کم کند. همچنین باعث میشود که از ایمیج / باینریهای ثابت در هر مرحله از پایپلاین استفاده شود. علاوه بر این، استقرار کانتینرهای کاملا تستشده، بدون تفاوتهای محیطی باعث میشود که مطمئن باشید هیچ خطایی در پروسه بیلد اتفاق نمیافتد.
شما میتوانید به طور یکپارچه اپلیکیشنها را به پروداکشن منتقل کنید. کاری که قبلا یک فرایند خستهکننده بود، حالا میتواند به سادگی کد زیر باشد:
docker stop container-id; docker run new-image
و اگر موضوعی هنگام استفاده از نسخه جدید اشتباه پیش برود، همیشه میتوانید به سرعت آن را برگردانید یا به یک کانتینر دیگر تغییر بدهید:
docker stop container-id; docker start other-container-id
این کار باعث میشود که مطمئن باشید که هیچ چیز خرابی باقی نمیماند و چیزی به حال خود رها نمیشود.
جمعبندی
به طور خلاصه برای توضیح کارهای داکر میتوانیم با هم شعار داکر را مرور کنیم:
Build
داکر به شما اجازه میدهد بخشهای مختلف میکروسرویسهای خود را بدون نگرانی در مورد ناسازگاری محیطهای توسعه و تولید و بدون محدود شدن به پلتفرم یا زبان خاص به هم متصل کنید.
Ship
داکر به شما اجازه میدهد کل چرخه توسعه برنامه، تست، توزیع را طراحی کنید و با یک رابط کاربری مناسب آن را مدیریت کنید.
Run
داکر به شما امکان دیپلوی کردن سرویسهای توسعهپذیر را به صورت امن و قابل اعتماد، و روی طیف گستردهای از پلتفرمها میدهد.
دیدگاهتان را بنویسید