
مقدمات داکر (Docker)
در این پست قصد داریم گفت و گوی ابتدایی در مورد ظهور داکر و شروع فعالیت آن در شاخه DevOps داشته باشیم.
همچنین سعی داریم در ادامه، چند مثال کاربردی در مورد آن براتون بزنیم. و سر انجام با یک مثال در حوزه کار (real world example) این پست رو به پایان برسونیم.
پس با ما همراه باشید تا اطلاعات طبقه بندی شده و مفیدی رو در مورد داکر در کنار هم یاد بگیریم.
آشنایی با Docker
برای شروع و پرسش این سوال، یه سری به سایت IBM زدیم:
’’ Docker is an open source platform that enables developers to build, deploy, run, update and manage containers—standardized, executable components that combine application source code with the operating system (OS) libraries and dependencies required to run that code in any environment. ‘‘
داکر (Docker) یک پلتفرم متن باز است که بر مبنای سیستم عامل لینوکس راهاندازی شده است. ابزاری است که میتواند فرایند ایجاد، پیاده سازی و اجرای برنامهها را با استفاده از Container ها بسیار ساده کند.
داکر یک پلتفرم برای ساخت، استقرار ( Deployment ) و مدیریت نرمافزارهای کانتینرشده است. این فناوری، امکان ایجاد، اجرا و تست پروژههای نرمافزاری را در قالب Container قابل حمل و مجزا روی ابر ( Cloud )، دیتاسنتر مشتری یا سیستمعاملهای مختلف (مثل ویندوز یا لینوکس) برای توسعهدهندگان فراهم میکند.
توسعهدهندگان میتوانند بدون داکر نیز Container ایجاد کنند، اما این پلتفرم دارای مجموعه ابزارهایی است که توسعهدهندگان را قادر میسازد تا با استفاده از اتوماسیون و یکسری دستورات ساده و صرفهجویی در کار از طریق یک API واحد، Container های خود را بهراحتی بسازند و مستقر کنند و در هر زمان که بخواهند آنها را اجرا و بهروزرسانی کرده یا متوقف کنند.
داکر نوعی ماشین مجازی است و این امکان را برای برنامه ها فراهم میکند تا از یک Kernel واحد لینوکس استفاده کرده و از امکاناتی بهره مند شوند که در سیستم عامل میزبان ارائه نشده است. به این ترتیب میتوانند به صورت مستقل از پیش نیازها و امکانات مازاد بهره برداری کنند.
نکته: سرعت و عملکرد برنامه بهبود قابل ملاحظهای پیدا کند و حجم آن نیز کاهش یابد.
’’ داکر با زبان برنامه نویسی GO نوشته و در آن ویژگیهای بسیاری از کرنل لینوکس به کار گرفته شده است. داکر از فناوری به نام «Namespaces» برای ارائه فضای کاری ایزوله شدهای به نام Container بهره میبرد. وقتی که یک Container اجرا میشود، داکر مجموعهای از فضاهای نام (Namespaces) را برای کانتینر ایجاد میکند. این فضاهای نام، لایهای جداسازی شده را فراهم می کنند. هر جنبه از یک کانتینر در یک فضای نام مستقل اجرا میشود و دسترسیاش به آن Namespaces محدود است. ‘‘
مزایای داکر چیست؟
Docker مزایای منحصربفرد خود را دارد که در ادامه به برخی از آنها اشاره میکنیم:
امنیت
جداسازی اجزای مختلف یک برنامه بزرگ در Container های مختلف میتواند مزایای امنیتی داشته باشد. برای مثال، اگر یک Container در معرض خطر قرار بگیرد، بقیهی اجزا امن باقی خواهند ماند. اما به یاد داشته باشید که داکر در بحث امنیت، ضعفهایی هم دارد که در ادامه به آن میپردازیم.
قابلیت تکرارپذیری
اجرای داکر در هر سیستمی که بتواند آن را اجرا کند، تضمین شده است. مشخصات دقیق Container در فایل Dockerfile ذخیره میشود. با توزیع این فایل در بین اعضای تیم، یک سازمان میتواند تضمین کند که تمام فایلهای image ساخته شده با همان Dockerfile یکسان کار میکنند. علاوهبراین، داشتن محیطی ثابت و مستند، باعث میشود که track کردن نرم افزار شما و شناسایی مشکلات نیز آسانتر شود.
یکپارچه سازی مداوم
داکر (Docker) یک پلتفرم متن باز است که بر مبنای سیستم عامل لینوکس راهاندازی شده است. ابزاری است که میتواند فرایند ایجاد، پیاده سازی و اجرای برنامهها را با استفاده از Container ها بسیار ساده کند.
عدم تداخل تنظیمات
متعلقات و تنظیمات یک Container ، روی برنامههای دیگر رایانهی شما تاثیر نمیگذارند، حتی اگر یک Container دیگر نیز همزمان درحال اجرا باشد. با استفاده از Container های جداگانه برای هر جزء از یک برنامه (به عنوان مثال، یک وب سرور، رابط کاربری و یا پایگاه داده برای میزبانی یک وبسایت)، میتوانید از مغایرت متعلقات جلوگیری کنید و بدون نگرانی، پروژههای متعددی را روی یک سرور داشته باشید.
مدیریت محیط توسعه (Development environment)
داکر مدیریت و نگهداری از ورژنهای مختلف را آسان میکند؛ مثلا میتوان ورژنهای مختلف یک وبسایت که از nginx استفاده میکند را ذخیره کرد. شما میتوانید برای هریک از اهداف آزمایش، توسعه و تولید، یک Container جداگانه در یک Linode داشته باشید و به راحتی هریک را توسعه دهید.
در چه برنامه هایی از داکر استفاده کنیم؟
اگر نرمافزار شما در یک یا چند دسته زیر جای میگیرد، استفاده از داکر ممکن است برای شما مناسب باشد:
موارد استفاده پایه
اگر برنامه شما به قدری استاندارد یا پایه باشد که با یک ایمیج (Image) پیشفرض داکر کار کند، دریافت ایمیج از Docker Hub نیز راهحل خوبی است. مواردی مانند میزبانی وبسایت با استفاده از یک استک LAMP ، استفاده از Reverse Proxy یا تنظیم یک سرور Minecraft اغلب دارای یک ایمیج رسمی و پشتیبانی در Docker Hub هستند. اگر تنظیمات پیشفرض این ایمیجها برای نیازهای شما قابل قبول باشد، دریافت آنها میتواند موجب صرفهجویی در زمان شود. درحالیکه اگر از داکر استفاده نکنید، تنظیمات محیط و نصب ابزارهای ضروری زمان زیادی میبرد.
یادگیری فناوریهای جدید
همانطور که قبلا هم اشاره شد، اگر میخواهید برنامههای متعددی را روی یک سرور اجرا کنید، نگهداری هر برنامه در Container های جداگانه، از مشکلات مربوط به مدیریت متعلقات جلوگیری میکند. بنابراین، توسعهی بیش از یک برنامه بصورت همزمان با استفاده از داکر میتواند ایده خوبی باشد.
توسعه نرمافزار بصورت تیمی
اگر تیم شما توسعهدهندگانی دارد که با تنظیمات مختلف کار میکنند، داکر راهی مناسب برای ایجاد محیط توسعه فراهم میکند، که نیازی به SSH به یک سرور خارجی ندارد.
توسعهی بیش از یک برنامه بصورت همزمان
همانطور که قبلا هم اشاره شد، اگر میخواهید برنامههای متعددی را روی یک سرور اجرا کنید، نگهداری هر برنامه در Container های جداگانه، از مشکلات مربوط به مدیریت متعلقات جلوگیری میکند. بنابراین، توسعهی بیش از یک برنامه بصورت همزمان با استفاده از داکر میتواند ایده خوبی باشد.
در چه برنامه ای نباید از Docker استفاده کنیم؟
گاهیاوقات استفاده از داکر بهترین راه حل نیست. در اینجا به چند نمونه اشاره میکنیم:
برنامه شما پیچیده است و یک sysadmin ندارید. برای برنامههای بزرگ و پیچیده، استفاده از یک Dockerfile از پیش ساخته شده یا دریافت یک ایمیج موجود، گزینهی مناسبی نخواهد بود. ساخت، ویرایش و مدیریت ارتباط بین چند Container در چندین سرور، کار بسیار زمانبری است.
بازدهی برنامه برای شما بسیار مهم است. زمانی که بحث بازدهی به میان میآید، داکر در مقایسه با ماشینهای مجازی، عملکرد بهتری دارد. داکر، Kernel (کرنل) میزبان را به اشتراک میگذارد و سیستمعامل کامل را شبیهسازی نمیکند. با این حال، داکر هزینههایی در زمینهی بازدهی دارد. فرایندهایی که درون یک Container اجرا میشوند، به اندازهی فرایندهایی که در سیستمعامل اصلی اجرا میشوند، سریع نیستند. بنابراین، اگر نیاز دارید که بهترین بازدهی ممکن را از سرور خود داشته باشید، بهتر است از داکر استفاده نکنید.
شما نمیخواهید بهروزرسانیهای عجیب و غریب انجام دهید! داکر یک تکنولوژی جدید و در حال توسعه است. برای به دستآوردن ویژگیهای جدید، احتمالا باید به طور مرتب بهروزرسانی کنید و نکتهی حائز اهمیت در این روند، این است که پشتیبانی از نسخههای قبلی تضمینشده نیست.
امنیت برنامه برای شما حائز اهمیت است. همانطور که پیشتر ذکر شد، نگه داشتن اجزای مختلف یک برنامه در Container های جداگانه، مزایای امنیتی را فراهم میآورد، زیرا اختلال در یک Container نمیتواند به راحتی بر سایر سیستمهای شما تاثیر بگذارد. با این حال، رویکرد مبتنی بر Container در برنامههای پیچیدهتر، چالشهای زیادی را به همراه دارد. پس، اگر برنامه پیچیدهای دارید و نگران مسئله حفظ امنیت آن هستید، از داکر استفاده نکنید.
شما میخواهید Cluster سازی کنید. Container های داکر میتوانند در سرورهای جداگانه ترکیب شوند تا با Docker Swarm کلاستر بسازد. با این حال، داکر نمیتواند جایگزین ابزارهای تولید و یا اتوماتیکسازی مانند Ansible ، SaltStack و Chef باشد. علاوه بر این، داکر اخیرا پشتیبانی از Kubernetes را اعلام کرده است، که یعنی Docker Swarm به عنوان یک مدیر کلاستر مستقل کافی نیست.
برنامهای با سیستمعامل چندگانه. از آنجایی که Docker Container سیستمعامل میزبان را به اشتراک میگذارد، اگر میخواهید برنامه کاربردی مشابهی را در سیستمعاملهای مختلف اجرا یا آزمایش کنید، به جای این روش، باید از ماشینهای مجازی استفاده کنید. در ادامه به تفاوت میان داکر و ماشینمجازی نیز میپردازیم.
معماری داکر
داکر از یک معماری کلاینت-سروری استفاده میکند. کلاینت داکر با Docker Daemon مکاتبه میکند. Docker Daemon وظیفه ساخت، اجرا و توزیع کانتینرهای داکر را بر عهده دارد. کلاینت و Daemon داکر میتوانند مشترکاً روی یک سیستم اجرا شوند یا اینکه میتوان یک کلاینت داکر را به یک Docker Daemon راه دور متصل کرد. کلاینت و Daemon داکر به وسیله REST API از طریق سوکتهای یونیکس یا یک واسط شبکه با هم ارتباط برقرار میکنند.
یکی دیگر از کلاینتهای داکر، Docker Compose نام دارد که امکان کار با اپلیکیشنهایی شامل چند کانتینر را فراهم میسازد.
Docker daemon چیست؟
دیمون داکر به درخواستهای API داکر گوش میدهد و اشیای داکر مثل Image ها، کانتینرها، شبکهها و Volume ها را مدیریت میکند. همچنین، یک Daemon میتواند با سایر Daemon ها برای مدیریت سرویسهای داکر ارتباط برقرار کند.
Client Docker چیست؟
کلاینت داکر راه اصلی برای بسیاری از کاربران داکر جهت تعامل با Docker است. وقتی که از دستوراتی مثل «docker run» استفاده میشود، کلاینت این دستورات را به dockered میفرستد و dockered یا همان Docker Daemon نیز این دستورات را اجرا میکند. دستور Docker از Docker API استفاده میکند. کلاینت داکر می تواند با بیش از یک Daemon ارتباط برقرار کند.
Docker Hub چیست؟
Docker Hub یک بستر خدماتی در زمینه یافتن و به اشتراکگذاری Image های کانتینر با اعضای تیم و اجتماع داکر به حساب میآید. میلیونها Image آماده در Docker Hub به صورت متنباز برای توسعهدهندگان در دسترس است. Docker Hub بزرگترین مخزن برای Container Image در جهان به شمار میرود.
Docker Registry چیست؟
یک بایگانی یا رجیستری داکر (Docker Registry) ، انعکاسهای ( Image های) داکر را ذخیره میکند. Docker Hub یک رجیستری است که هر کسی میتواند از آن استفاده کند و Docker به طور پیشفرض برای جستجوی Image های داکر در Docker Hub تنظیم شده است. حتی میتوان رجیستری خصوصی خود را اجرا کرد. وقتی از دستورات «docker pull» یا «docker run» استفاده میشود، Image های مورد نیاز از بایگانی پیکربندی شده بیرون کشیده میشوند. وقتی از دستور docker push استفاده شود، Image مربوطه به رجیستری پیکربندی شده Push میشود.
Docker Compose چیست؟
Docker Compose امکان ایجاد و راهاندازی چندین Container را فراهم میکند. یک فایل YAML ایجاد میشود که پیکربندی Container های اپلیکیشن را انجام میدهد. سپس میتوان از یک دستور واحد برای راهاندازی تمام کانتینرهای و پیوند آنها به یکدیگر استفاده کرد. Compose به کاربر کمک میکند تا اجزای پشته خود را در سرویسهای کانتینربندی شده جداسازی کند. Compose مستقل از Docker توزیع داده شده است. باید پیش از افزودن Compose ، داکر را نصب کرد. در غیر اینصورت Compose کار نخواهد کرد.
کانتینر (Container) چیست؟
تووی این بخش هم بهترین توضیح متعلق به IBM هست! 😎
’’ Containers simplify development and delivery of distributed applications. They have become increasingly popular as organizations shift to cloud-native development and hybrid multicloud environments. It’s possible for developers to create containers without Docker, by working directly with capabilities built into Linux and other operating systems. But Docker makes containerization faster, easier and safer. ‘‘
نگهداری برنامهها در محیطی ایزوله و به صورت مستقل، از اهداف سیستمهای جدید توسعه نرم افزار است. به این ترتیب فعالیت آنها بر روی یکدیگر تاثیری نداشته و کاملا مستقل از هم کار میکنند.
یکی از راههای پیاده کردن این تکنولوژی استفاده از ماشین مجازی (Virtual Machine) است که برنامهها را روی یک سخت افزار اما جدا از هم نگهداری میکند. در این حالت component ها با هم تداخل نداشته و رقابت برای استفاده از منابع سخت افزاری به حداقل میرسد.
کانتینرها (نگهدارندهها) قابلیتهای هسته سیستم عامل را برای فراهم کردن محیطهایی به کار میبندند که تا اندازهای مجازیسازی شدهاند. میتوان کانتینرها را به وسیله دستوراتی نظیر «chroot» از صفر ایجاد کرد. این دستور، پردازهای (process) را با یک شاخه (دایرکتوری) ریشه (Root) به جای ریشه سیستم راهاندازی میکند. اما، استفاده از امکانات کرنل به طور مستقیم کاری دشوار، نا ایمن و خطا برانگیز (مستعد ایجاد خطا) محسوب میشود.
کانتینرها نسبت به ماشینهای مجازی از منابع کمتری استفاده میکنند و همچنین خیلی سریع قابلیت اجرا پیدا میکنند.
میتوان کانتینرها را به 3 بخش تقسیم کرد که عبارتند از:
- سازنده (Builder): فناوری مورد استفاده برای ساخت کانتینر
- موتور (Engine): فناوری مورد استفاده برای راهاندازی کانتینر
- تنظیم (Orchestration): فناوری مورد استفاده برای تنظیمات و مدیریت کانتینر
برای ساخت یک برنامه داکر و همچنین کار با داکر باید از کامپوننتهای مختلف استفاده کنیم. در ادامه این کامپوننتها را معرفی و بررسی میکنیم.
Dockerfile
هر Container داکر با یک فایل داکر شروع به کار میکند. Dockerfile یک فایل متنی بوده که داخل آن با یک سینتکس ساده و قابل فهم دستورالعملهای ساخت Docker Image قرار داده شده است (کمی جلوتر این مفهوم را بررسی خواهیم کرد) این فایل اطلاعات بسیار مهمی را در برمی گیرد که برای راه اندازی داکر استفاده از آنها ضروری است. در واقع Dockerfile مشخص میکند که پشت Container ما چه سیستم عاملی قرار بگیرد، همینطور از چه زبان ها، متغیرهای محلی، پورتهای شبکه یا غیره استفاده شود. و مهمتر از همه اینکه مشخص کند Container ما بعد از اینکه واقعا اجرا شد قرار است چه کاری انجام دهد.
Docker image
در واقع زمانی که کار نوشتن Dockerfile را تمام کردید، یک قابلیت به اسم Docker Build را فراخوانی میکنید که وظیفه دارد یک Image بر اساس محتویات Dockerfile شما بسازد. Dockerfile شامل یک سری دستورالعمل برای ساختن یک Image است، در حالی که Docker Image یک فایل قابل حمل است که شامل یک سری دستورالعمل بوده که مشخص میکند Container کدام کامپوننتهای نرم افزاری را اجرا کند و اینکه چطور آنها اجرا شوند. به احتمال زیاد Dockerfile بخواهد تعدادی فایل را از مخزنهای مختلف (Repository) دانلود کند و اینجا باید به طور واضح مشخص کنید که کدام نسخهها دریافت شوند. همینطور Image ساخته شده استاتیک میباشد، یعنی یک بار ساختن آن کافی بوده و نیازی به تغییر آن ندارید. همانطور که از اسم آنها میتوانید حدس بزنید، Image یک تصویر از سیستم عامل اصلی میباشد.
Docker run
قابلیت Docker run در واقع یک دستور است که Container را راه اندازی میکند. میدانیم که هر Container یک instance یا نمونه از Image است و ماهیت Container به صورت موقتی میباشد. اما با این حال میتوان آنها را متوقف (Stop) یا راه اندازی مجدد (Restart) کرد. هر Image میتواند تعداد زیادی Container داشته باشد (تا زمانی که هر کدام نام منحصر به فردی داشته باشند)
Docker Hub
هر چند ساخت Container ها کار راحتی است، اما لزومی ندارد برای هر Image از اول Container بسازید. Docker Hub یک مخزن Saas برای به اشتراک گذاری و مدیریت Container ها است. در آنجا میتوانید Image های رسمی داکر که معمولا به صورت متن باز هستند را پیدا کنید. همینطور عموم مردم هم پروژههای خود را به این Repository اضافه میکنند.
Docker Engine
مغز متفکر و هسته اصلی داکر به حساب میآید. یک تکنولوژی کلاینت/سرور که Container ها را ساخته و آنها را اجرا میکند. در واقع اگر کسی درباره داکر صحبت کرده و منظورش شرکت داکر یا پروژه داکر نباشد، یعنی دارد درباره Docker Engine حرف میزند. این موتور در دو نسخه Enterprise یا Community عرضه میشود. نسخه Community به طور متن باز و کاملا رایگان قابل استفاده است در حالی که نسخه Enterprise یک سری قابلیتهای اضافه داشته و سالانه برای هر Node نزدیک به 1500$ هزینه دارد. (در یک مقاله جدا درمورد مفهوم کلاینت و مدل کلاینت/سرور صحبت میکنیم.)
پایانِ نامه
تمام این نکات را گفتیم تا به این بخش رسیده و بفهمیم داکر چیست و چطور کار میکند. داکر را میتوانیم یک مجازی ساز در نظر بگیریم، اما نه به شکلی که ماشینهای مجازی کار میکنند. این سرویس به شما کمک میکند یک محیط را به چند بخش تقسیم کرده و و در هر بخش یک برنامه مجزا اجرا کنید. برای درک بهتر موضوع یک لحظه داکر را شبیه به ماشین مجازی در نظر بگیرید، میدانیم که ماشینهای مجازی با Hypervisor عملیات شبیه سازی را انجام میدهند اما در داکر این لایه حذف شده و ما مستقیم با هسته سیستم عامل کار میکنیم. این کار بازدهی سیستم را بسیار بالا میبرد. ما به جای اینکه چند سیستم عامل را داخل یک شبیه ساز نصب کنیم یک بار داکر را نصب میکنیم. این فرآیند را شبیه به نصب یک نرم افزار عادی در نظر بگیرید. بعد داکر محیطهای مستقلی به نام Container ایجاد میکند که هر Container میتواند شامل بستههای نرم افزاری مختلفی باشد. حالا میتوانید داخل داکر Container های مختلفی ایجاد کنید و پروژههای خود را به طور مستقل روی هر کدام اجرا نمایید.