Docker and Container
در دنیای فناوری اطلاعات، نیاز به راهحلهایی سریع، قابل اعتماد، و کارآمد برای مدیریت و اجرای برنامهها به صورت همگانی و در هر محیطی، هر روز بیشتر محسوس میشود. کانتینر ها یکی از ابزارهایی است که به ما کمک میکند این نیازها را برآورده سازیم.
Docker یک پلتفرم متنباز برای توسعه، ارسال، و اجرای برنامهها با استفاده از فناوری مستقل کانتینر است. این فناوری به ما امکان میدهد تا برنامهها و تمامی وابستگیهای آنها را به صورت کانتینرهای قابل حمل و مستقل از محیط اجرایی بستهبندی کنیم. به این ترتیب، برنامههایی که با کانتینر ها بستهبندی شدهاند، میتوانند بدون هیچگونه تغییر در هر محیطی، از سرورهای محلی تا محیطهای ابری، به راحتی اجرا شوند.
در این مقاله، به معرفی کانتینر ها، مزایا و کاربردهای آن، و نحوه استفاده از آن برای توسعه و اجرای برنامهها خواهیم پرداخت. همچنین، با مفاهیم اساسی Docker، نحوه ایجاد و مدیریت کانتینرها، و استفاده از Docker در محیطهای توسعه و تولیدی آشنا خواهید شد.
این مقاله به هدف ارتقاء درک خوانندگان درباره فناوری کانتینرها و تسهیل در استفاده از آن برای توسعه و اجرای برنامهها ارائه شده است.
ماشین مجازی چیست؟
ماشین مجازی یک تکنولوژی نرمافزاری است که به کاربران امکان میدهد تا یک یا چند سیستم عامل و برنامههای کاربردی را بر روی یک سختافزار اجرا کنند. این تکنولوژی با استفاده از لایه نرمافزاری به نام مدیر ماشین مجازی یا مدیر هاست، میتواند منابع سختافزاری را مجازیسازی کرده و به چندین ماشین مجازی دسترسی فراهم کند.
با استفاده از ماشینهای مجازی، میتوان یک محیط ایزوله و مستقل برای اجرای برنامهها و سرویسها فراهم کرد. هر ماشین مجازی دارای یک سیستم عامل کامل و مجازی شده است که به صورت مستقل از دیگر ماشینها اجرا میشود. این به ارائه یک محیط ایزوله از نظر منابع، فایلها، و شبکه برای برنامهها کمک میکند.
استفاده از ماشینهای مجازی میتواند به مدیریت و استفاده بهینه از منابع سختافزاری کمک کند، زیرا چندین ماشین مجازی را بر روی یک سختافزار فیزیکی میتوان اجرا کرد. همچنین، این تکنولوژی امکاناتی مانند سهولت در مهاجرت، پشتیبانی از برنامههای مختلف، و ایجاد محیطهای توسعه و تست را فراهم میکند.
کانتینر چیست؟
کانتینر، نرم افزار مجازی سازی در سطح سیستم عامل است. کانتینر، یک بسته نرم افزاری است و شامل هر آن چیزی است که نرم افزار برای اجرا به آن نیاز دارد، مثلا برنامههای قابل اجرا که تنظیمات، کتابخانهها و System Tools را شامل میشود. کانتینر ها مانند برنامههای نرم افزاری سنتی که به شما اجازه میدهند مستقل از نرم افزارهای دیگر و خود سیستم عامل کار کنید، نصب نمیشوند.
کرنل چیست؟
کرنل (Kernel) بخش اصلی و مهمترین قسمت سیستم عامل است. این قسمت از سیستم عامل مسئول مدیریت منابع سختافزاری مانند پردازنده، حافظه، و دستگاههای ورودی و خروجی است. علاوه بر این، کرنل مسئول ایجاد و مدیریت رابطهای میانبر بین نرمافزار و سختافزار میباشد.
کرنل به صورت یک لایه نرمافزاری مستقل از برنامهها در سیستم عامل قرار دارد. وظیفه اصلی کرنل اجرای درخواستهای نرمافزاری بر روی سختافزار است و نظارت بر فرآیندهای مختلف سیستم را بر عهده دارد. به عبارت دیگر، کرنل یک میانجی بین نرمافزار و سختافزار است که به برنامهها امکان ارتباط با منابع سختافزاری را میدهد.
کرنل سیستم عامل میتواند به صورت مونولیتیک (Monolithic) یا مبتنی بر ماژولها (Microkernel) پیادهسازی شود. در ساختار مونولیتیک، تمام وظایف کرنل در یک واحد بزرگ واحد قرار دارند، در حالی که در ساختار مبتنی بر ماژولها، بخشهای مختلف کرنل به صورت ماژولهای جداگانه پیادهسازی میشوند و به صورت پویا بارگذاری میشوند.
کانتینرها چه تفاوتی با ماشین مجازی دارند؟
کانتینر و ماشین مجازی دو فناوری متفاوت هستند که هر کدام ویژگیها و کاربردهای خود را دارند. در ادامه تفاوتهای اصلی بین آنها را بررسی میکنیم:
سطح ایزولهسازی
ماشین مجازی: در ماشینهای مجازی، یک سیستم عامل کامل و مجازی شده (مانند Linux یا Windows) به همراه برنامههای مورد نیاز درون یک لایه نرمافزاری مجازیزاسیون اجرا میشود.
کانتینرها : در کانتینرها، فقط برنامهها و وابستگیهای مورد نیاز برای اجرای برنامههای خاص را شامل میشوند. این به این معنی است که از منابع سیستم بهینهتری استفاده میکند و سریعتر است.
حجم و سرعت راهاندازی
ماشین مجازی: هر ماشین مجازی نیازمند ایجاد یک سیستم عامل کامل است که ممکن است چند دقیقه یا حتی بیشتر طول بکشد.
کانتینرها: بسیار سریعتر از ماشینهای مجازی راهاندازی میشوند. کانتینرها کرنل ندارند و تنها چند ثانیه برای بوت شدن زمان میبرد.
منابع مصرفی
ماشین مجازی: هر ماشین مجازی دارای یک سیستم عامل کامل است که نیازمند منابع مستقل از دیگر ماشینها است. این موجب مصرف بیشتر منابع سختافزاری میشود.
کانتینرها: کانتینرها کرنل سیستم عامل میزبان را به اشتراک میگذارند، بنابراین مصرف منابع کمتری دارند و اجازه استفاده بهینه از سختافزار را میدهند.
چرا کانتینر بوجود اومد؟
کانتینرها به وجود آمدهاند تا به مشکلاتی که در توسعه، ارسال، و اجرای نرمافزارها وجود داشته، راهحل بدهند.
برخی از دلایل اصلی بوجود آمدن کانتینرها عبارتند از:
- قابلیت حمل و نقل برنامهها: کانتینرها به توسعهدهندگان اجازه میدهند تا برنامههای خود را به شکل کامل به همراه تمام وابستگیها و تنظیمات لازم بستهبندی کنند. این بستهبندی کامل اجازه میدهد که برنامهها بدون هیچگونه تغییر در هر محیطی اجرا شوند.
- تسهیل در توسعه و تست: با استفاده از کانتینرها، توسعهدهندگان میتوانند محیطهای یکسانی را برای توسعه و تست برنامههای خود استفاده کنند. این امکان به ویژه در مواقعی مفید است که باید برنامه را بر روی محیطهای مختلف اجرا و تست کرد.
- بهرهوری بالا: کانتینرها به دلیل استفاده از منابع سیستم بهینهتر نسبت به ماشینهای مجازی، بهرهوری بالاتری را فراهم میکنند. زمان راهاندازی کانتینرها نسبت به ماشینهای مجازی کمتر است و همچنین از منابع سیستم به طرز بهینهتری استفاده میکنند.
- ایزولهسازی منابع: کانتینرها به دلیل ایزوله بودن منابع، اجازه میدهند تا برنامهها به صورت مستقل و ایزوله از یکدیگر اجرا شوند. این امکان اجازه میدهد تا اگر یک کانتینر مشکلی داشته باشد، تنها بر روی آن تاثیر بگذارد و برنامههای دیگر را تحت تاثیر قرار ندهد.
- مدیریت آسان: کانتینرها ابزارهای مدیریتی پیشرفتهای دارند که اجازه میدهند تا محیطهای بزرگی را به طور موثر مدیریت کرد. این ابزارها شامل ابزارهایی مانند Kubernetes و Docker Swarm میشوند که امکاناتی برای ایجاد، مدیریت، و مانیتورینگ کانتینرها را فراهم میکنند.
چرا هرجا کانتینر هست داکر نیز وجود دارد؟
وجود داکر در همه جایی که کانتینرها وجود دارند، به دلایلی از جمله موارد زیر است:
- سادگی استفاده: داکر ابزاری است که توسعهدهندگان و مدیران سیستم عامل به راحتی میتوانند از آن برای بستهبندی، اجرا، و مدیریت کانتینرها استفاده کنند. رابط کاربری آسان و امکانات متنوع داکر باعث شده تا به راحتی قابل استفاده و پذیرش شود.
- اکوسیستم گسترده: داکر از یک اکوسیستم گسترده از ابزارها و خدمات بهره میبرد که توسعه، مدیریت، و اجرای کانتینرها را تسهیل میکنند. این شامل ابزارهایی مانند Docker Compose، Docker Swarm، و Kubernetes میشود که امکانات قدرتمندی برای مدیریت کانتینرها فراهم میکنند.
- پذیرش وسیع: داکر به دلیل سادگی استفاده و امکانات برتری که ارائه میدهد، توسط جوامع توسعهدهنده و مدیران سیستم به طور گستردهای پذیرفته شده است. این باعث شده تا داکر به عنوان استاندارد فاکتوری در توسعه و اجرای برنامهها با کانتینرها شناخته شود.
- توانایی برنامهریزی: با استفاده از داکر و ابزارهای مرتبط، میتوان کانتینرها را به طور موثر در محیطهای توسعه، تست، و تولیدی مدیریت کرد. این امکان به توسعهدهندگان اجازه میدهد تا فرآیند توسعه و ارسال برنامهها را بهبود بخشند و به سرعت برنامهها را به محیطهای تولیدی ارسال کنند.
امکان ایجاد ماشین مجازی و کانتینر
اولاً، بیایید به توضیح هرکدام از این عناصر بپردازیم(hypervisor=KVM/Xen | CRI=containerd/Cri-o)
1. Hypervisor (ماشین مجازی) – مانند KVM و Xen:
– Hypervisor نوعی نرمافزار است که به ما امکان ایجاد ماشینهای مجازی را میدهد.
– ماشینهای مجازی کامل شامل یک سیستم عامل کامل به همراه برنامهها و پیکربندیهای لازم هستند.
– Hypervisor مسئولیت ایجاد و مدیریت ماشینهای مجازی را بر عهده دارد، اما برای هر ماشین مجازی یک سیستم عامل جداگانه فراهم میکند.
2. Container Runtime (کانتینر) – مانند Cri-o و containerd:
– Container Runtime نیز یک نوع ایزولهسازی نرمافزاری هستند که به ما امکان ایجاد کانتینر را میدهد.
– Container Runtime مسئولیت ایجاد و مدیریت کانتینر را بر عهده دارد.
حالا بیایید به تفاوت میان Hypervisor و Container Runtime به عنوان یک محیط اجرایی برای کانتینرها بپردازیم:
– Hypervisor (ماشین مجازی) مسئولیت اجرای ماشینهای مجازی را بر عهده دارد و هر ماشین مجازی به یک سیستم عامل کامل نیاز دارد.
– container runtime با استفاده از محیط اجرایی مانند Cri-o به صورت سبکتر و با استفاده از منابع سیستم بهینهتر اجرا میشوند.
بنابراین، در مقایسه بین Hypervisor و Container Runtime:
– Hypervisor ماشینهای مجازی کامل را فراهم میکند، در حالی که CRI محیط اجرایی برای کانتینرها است.
– استفاده از کانتینرها نسبت به ماشینهای مجازی، منابع سیستم کمتری را مصرف میکند و اجرای برنامهها را سریعتر میکند.
ابزارها و اصطلاحات Docker
بعضی از ابزارها، اصطلاحات و فناوریهایی که توسعهدهندگان در استفاده از Docker برخورد میکنند عبارتند از:
۱. Dockerfile
هر کانتینر Docker با یک فایل متنی ساده شروع میشود که دستورات مربوط به ساخت تصویر کانتینر Docker را شامل میشود. Dockerfile فرآیند ایجاد تصویر Docker را به صورت خودکار انجام میدهد. در واقع، این یک لیست از دستورات رابط خط فرمان (CLI) است که موتور Docker برای مونتاژ تصویر اجرا خواهد کرد. لیست دستورات Docker بسیار بزرگ است، اما استاندارد است: عملیات Docker بدون توجه به محتوا، زیرساخت یا متغیرهای محیطی دیگر، کار میکند.
۲. تصاویر Docker(image)
تصاویر Docker حاوی کد منبع برنامه اجرایی و همچنین تمام ابزارها، کتابخانهها و وابستگیهایی هستند که کد برنامه برای اجرا به عنوان یک کانتینر نیاز دارد. هنگامی که تصویر Docker را اجرا میکنید، به یک نمونه (یا چند نمونه) از کانتینر تبدیل میشود.
امکان ساخت یک تصویر Docker از ابتدا وجود دارد، اما اکثر توسعهدهندگان آنها را از مخازن مشترک دریافت میکنند. میتوان از یک تصویر پایه واحد چندین تصویر Docker ایجاد کرد و آنها اشتراکات اصلی از پشته خود را به اشتراک میگذارند.
تصاویر Docker از لایهها تشکیل شدهاند و هر لایه به یک نسخه از تصویر متناظر است. هرگاه یک توسعهدهنده تغییراتی روی تصویر انجام میدهد، یک لایه بالاتر جدید ایجاد میشود و این لایه بالاتر جدید به عنوان نسخه فعلی تصویر جایگزین لایه بالاتر قبلی میشود. لایههای قبلی برای بازگشت به وضعیت اولیه یا استفاده مجدد در پروژههای دیگر ذخیره میشوند.
هر بار که یک کانتینر از یک تصویر Docker ایجاد میشود، یک لایه جدید دیگر به نام لایه کانتینر ایجاد میشود. تغییرات اعمال شده به کانتینر – مانند اضافه یا حذف فایلها – در لایه کانتینر ذخیره میشوند و فقط در حالتی که کانتینر در حال اجرا است وجود دارد.
این فرآیند ایجاد تصویر به صورت تکراری، کلیت کلی را افزایش میدهد زیرا چندین نمونه زنده از کانتینر میتوانند از یک تصویر پایه فقط اجرا شوند و زمانی که این کار را انجام میدهند، از یک پشته مشترک استفاده میکنند.
۳. کانتینرهای داکر (Docker containers)
کانتینرهای Docker نمونههای زنده و اجرایی تصاویر Docker هستند. در حالی که تصاویر Docker فایلهای فقط خواندنی هستند، کانتینرها محتوای زنده، موقت و قابل اجرا هستند. کاربران میتوانند با آنها تعامل داشته باشند و مدیران میتوانند تنظیمات و شرایط آنها را با استفاده از دستورات Docker تنظیم کنند.
۴. Docker Hub
Docker Hub یک مخزن عمومی از تصاویر Docker است که خود را “بزرگترین کتابخانه و انجمن جهان برای تصاویر کانتینر” نامیده است. این مخزن بیش از 100،000 تصویر کانتینر را از تامینکنندگان نرمافزار تجاری، پروژههای منبع باز و توسعهدهندگان فردی جمعآوری میکند. این شامل تصاویر است که توسط Docker، Inc. تولید شدهاند، تصاویر تایید شده متعلق به Docker Trusted Registry و هزاران تصویر دیگر است.
تمام کاربران Docker Hub میتوانند تصاویر خود را به دلخواه به اشتراک بگذارند. آنها همچنین میتوانند تصاویر پایه پیشتعریف شده را از فایل سیستم Docker دریافت کرده و از آنها به عنوان نقطه شروع برای هر پروژه کانتینرسازی استفاده کنند.
سایر مخازن تصویر نیز وجود دارند، به ویژه GitHub. GitHub یک سرویس میزبانی مخزن است که برای ابزارهای توسعه برنامه و به عنوان یک پلتفرمی که همکاری و ارتباطات را تشویق میکند شناخته میشود. کاربران Docker Hub میتوانند یک مخزن (repo) ایجاد کنند که میتواند شامل بسیاری از تصاویر باشد. مخزن میتواند عمومی یا خصوصی باشد و میتواند به حسابهای GitHub یا BitBucket متصل شود.
۵. Docker Desktop
Docker Desktop یک برنامه برای مک یا ویندوز است که شامل Docker Engine، Docker CLI client، Docker Compose، Kubernetes و دیگران است. همچنین دسترسی به Docker Hub را نیز دارد.
۶. Docker daemon
Docker daemon یک سرویس است که تصاویر Docker را ایجاد و مدیریت میکند، با استفاده از دستورات از مشتری. اساساً Docker daemon به عنوان مرکز کنترل پیادهسازی Docker شما عمل میکند. سروری که بر روی آن Docker daemon اجرا میشود را Docker host مینامند.
۷. Docker registry
یک Docker registry یک سیستم مقیاسپذیر منبع باز برای تصاویر Docker است. این مخزن به شما امکان پیگیری نسخههای تصویر در مخازن را با استفاده از برچسبگذاری برای شناسایی فراهم میکند. این پیگیری و شناسایی با استفاده از Git، یک ابزار کنترل نسخه، انجام میشود.
راهاندازی و هماهنگی Docker
هنگام اجرای تنها چند کانتینر، مدیریت یک برنامه در Docker Engine، به عنوان یکی از اصطلاحات رایج صنعتی، به نسبت ساده است. اما برای ارائههایی که شامل هزاران کانتینر و صدها سرویس هستند، تقریباً غیرممکن است که جریان کار را بدون کمک برخی از ابزارهای مخصوص ساختار مدیریت کنیم.
افزونههای Docker
افزونههای Docker میتوانند به منظور افزایش کارایی Docker استفاده شوند. چندین افزونه Docker در سیستم افزونه Docker Engine گنجانده شدهاند و افزونههای شخص ثالث هم میتوانند بارگذاری شوند.
Docker Compose
توسعهدهندگان میتوانند از Docker Compose برای مدیریت برنامههای چند کانتینری استفاده کنند، جایی که تمام کانتینرها بر روی همان میزبان Docker اجرا میشوند. Docker Compose یک فایل YAML (.YML) ایجاد میکند که خدماتی که در برنامه وجود دارد را مشخص میکند و میتواند کانتینرها را با یک دستور ارسال و اجرا کند. با توجه به اینکه دستور زبان YAML بیطرف است، فایلهای YAML میتوانند در برنامههای نوشته شده به زبانهای Java، Python، Ruby و بسیاری از زبانهای دیگر استفاده شوند.
توسعهدهندگان همچنین میتوانند از Docker Compose برای تعریف حجمهای ماندگار برای ذخیره سازی، مشخص کردن رئوس اصلی، مستند و پیکربندی وابستگیهای خدمات استفاده کنند.
Kubernetes
نظارت و مدیریت چرخه حیات کانتینرها در محیطهای پیچیدهتر نیازمند ابزار هماهنگی کانتینرها است. در حالی که Docker شامل ابزار هماهنگی خود (که به Swarm Docker گفته میشود) است، بیشتر توسعهدهندگان به جای آن از Kubernetes استفاده میکنند.
Kubernetes یک پلتفرم هماهنگی کانتینر منبع باز است که از یک پروژه توسعه داده شده برای استفاده داخلی در گوگل نسبت به آن ناشی شده است. Kubernetes وظایفی را که برای مدیریت معماریهای مبتنی بر کانتینر اساسی هستند، از جمله ارسال کانتینر، به روزرسانی، کشف خدمات، تهیه ذخیرهسازی، توازن بار، نظارت بر سلامتی و غیره، زمانبندی و خودکارسازی میکند.
به علاوه، اکوسیستم منبع باز ابزارهای برای Kubernetes، از جمله Istio و Knative، به سازمانها امکان فراهمکردن یک پلتفرم پیشرفته بازده برای برنامههای کانتینری را میدهد. این اکوسیستم همچنین راهحلی سریعتر برای محاسبه بدون سرور فراهم میکند.
نتیجه گیری
Docker به عنوان یک پلتفرم بسیار قدرتمند برای مدیریت کانتینرها و ارتقاء فرآیندهای توسعه و ارائه برنامهها مورد استفاده قرار میگیرد. از آنجایی که این فناوری امکاناتی را برای اجرای و مدیریت برنامهها در محیطهای مختلف ارائه میدهد، به طور گستردهای در صنایع مختلف استفاده میشود.
امیدواریم که این مقاله به شما کمک کرده باشد تا با مفاهیم اساسی Docker آشنا شوید و بتوانید از این فناوری برای بهبود فرآیندهای توسعه و ارائه برنامهها در پروژههای خود استفاده کنید.
گردآورنده: زهرا عابدزاده
لینک ویدئو این آموزش در یوتیوب:
لینک چنل یوتوب:
https://www.youtube.com/@linuxacademyir
اینستاگرام:
https://www.instagram.com/linuxacademy.ir
لینکدین:
https://www.linkedin.com/in/taleghanipv
تلگرام: