ایمیج و کانتینر دو مفهوم مهم در داکر هستند که ارتباط نزدیکی با هم دارند و با یکدیگر در تعاملاند. از آنجاییکه این دو ابزار برای استقرار نرمافزار استفاده میشوند، برخی از افراد ممکن است که تفاوتهایشان را متوجه نشوند و تصور کنند که فرقی با یکدیگر ندارند. در این آموزش میخواهیم تفاوت Docker image و container را بررسی کرده و آنها را از جنبههای مختلفی مانند تغییرپذیری، چرخه حیات، کاربردها در استقرار نرمافزار و غیره مقایسه کنیم.
کانتینر داکر چیست؟
کانتینر داکر، یک محیط مجازی ایزوله است که بهطور مستقل و جدا از سایر اجزای سیستم اجرا میشود. اگر میخواهید بهخوبی با داکر و قابلیتها و روشهای کار با آن آشنا شوید، به شما پیشنهاد میکنیم مقاله داکر چیست را مطالعه کنید. این محیط، تمام اجزای موردنیاز برای اجرای یک اپلیکیشن مانند وابستگیها، کتابخانهها، کدها و غیره را بستهبندی میکند.
برای اینکه بهتر با کانتینر داکر آشنا شوید، آن را مثل یک واحد از آپارتمان در یک ساختمان چندطبقه تصور کنید. هر واحد از این آپارتمان تمام امکانات لازم برای زندگی مستقل هر یک از مستاجرین را دارد. این امکانات در اینجا همان کتابخانهها، کدها و غیره هستند. اپلیکیشنهایی که در هر کانتینر اجرا میشوند، تداخلی با سایر کانتینرها ایجاد نمیکنند و شما میتوانید خروجی و عملکرد هر اپلیکیشن را بهصورت جداگانه مشاهده و بررسی کنید.
بهعنوان مثال، یک اپلیکیشن فروشگاه آنلاین معمولا از چندین سرویس مانند فرانتاند، بکاند و پایگاه داده تشکیل میشود. هر یک از این مولفهها از ابزارها، برنامهها و کدهای جداگانهای استفاده میکنند. شما میتوانید هر یک از این مولفهها را در یک کانتینر جداگانه با اجزای موردنیازش بستهبندی کرده و بهطور مستقل اجرا کنید. بدینصورت، مدیریت و ایجاد تغییر در هر کدام بسیار سادهتر میشود.
باتوجه به اینکه مخازن داکر برای کاربران با ip ایران مسدود است، اگر میخواهید این ابزار را بر روی سیستمتان نصب کنید، پیشنهاد میکنیم مقاله نصب داکر را مطالعه کرده و دستورالعملهای آن را بهدقت انجام دهید.
ایمیج داکر چیست؟
هر ایمیج داکر حاوی دستورالعملهایی مانند کد منبع، اجزای موردنیاز و غیره درمورد نحوه ساخت یک کانتینر است. با کمک ایمیج داکر، شما بهراحتی میتوانید یک محیط سازگار را راهاندازی کرده و سازگاری را در چندین سیستم حفظ کنید.
در مثال قبلی که هر کانتینر داکر را یک واحد آپارتمان درنظر گرفتیم، ایمیج داکر همان نقشه طبقه است و اجزای موردنیاز برای ساخت اتاقها و چیدمانی نظیر مبلمان و غیره را برای داشتن یک زندگی راحت مشخص میکند.
شما میتوانید چندین کانتینر از یک ایمیج بسازید که هر کدام دارای اجزا و پیکربندی یکسانی هستند. Visual Studio Code یکی از بهترین ابزارها برای انجام عملیاتی مانند ایجاد، نصب و اجرای ایمیجهای داکر است. برای انجام چنین عملیاتی، باید پلاگینهای داکر را در vscode نصب کنید.
تفاوتهای کلیدی بین ایمیج داکر و کانتینرها
حال که با ایمیج و کانتینر داکر آشنا شدیم، وقت آن رسیده که تفاوتهایشان را بررسی کنیم:
تغییرپذیری
مهمترین تفاوت Docker image و container در تغییرپذیری این دو ابزار است. یک ایمیج داکر، از قبل ساخته شدهاست و دراختیار کاربران قرار میگیرد تا نقشه راه را بدانند. ایمیجها فقط خواندنی (read-only) هستند. این به این معنی است که کاربران نمیتوانند پیکربندی را برای ساخت یک کانتینر تغییر دهند. بهعنوان مثال، شما نمیتوانید یک پکیج نرمافزاری جدید را به آن اضافه کنید و یا وابستگیهای از قبل مشخصشده را تغییر دهید.
در چنین شرایطی، برای اعمال تغییرات موردنظرتان، باید یک ایمیج داکر جدید از یک Dockerfile بسازید. این ایمیج، یک متن با فرمت قابلخواندن برای انسان (human-readable) است که باید اجزا و دستورالعملهای لازم برای ایجاد کانتینرها را در آن بنویسید. برای ساخت و اجرای ایمیج داکر، باید بدانید که VS Code چیست و چه پلاگینهایی برای کار با ایمیج داکر دارد.
نکته: توسعهدهندگان از Dockerfile برای توسعه ایمیجهای موجود استفاده میکنند. آنها این کار را با اضافه کردن یک لایه دستورالعمل یا برنامه جدید انجام میدهند. به عبارتی دیگر، به جای اینکه برای ایجاد یک ایمیج جدید یک Dockerfile را از ابتدا بنویسند، فایل موجود را از رجیستری (مانند Docker Hub) دانلود کرده و یک یا چند لایه دستور را به متن آن اضافه میکنند.
کانتینر داکر در زمان اجرا قابلویرایش است و شما میتوانید کد برنامه را تغییر دهید و یک برنامه جدید را اضافه کنید و یا فایلهای پیکربندی را ویرایش کنید؛ بدون اینکه تغییرات ایجادشده تاثیری بر روی کانتینرهای دیگر داشته باشد.
اگر بهدنبال بهبود و سرعت بخشیدن فرایندهای مختلف تیمتان هستید، توصیه میکنیم خرید یک سرور مجازی را فراموش نکنید؛ زیرا با کمک این سرورها تقریبا تمام محدودیتها از سر راهتان برداشته میشوند. بهعنوان مثال، سرور مجازی ایران امکان نصب انواع مختلف سیستمعامل ویندوز و لینوکس را به شما میدهد و با استفاده از آن میتوانید بهراحتی به منابع و سرعت کافی برای توسعه اپلیکیشنتان دسترسی داشته باشید.
چرخه حیات
ایمیج داکرها و کانتینرها مراحل مختلفی را در طول فرایند استقرار اپلیکیشن طی میکنند. با این حال، مراحل چرخه حیاتشان بسته به خطمشی مدیریت پروژه میتواند متفاوت باشد. در این قسمت، نمونهای از چرخه حیات یک ایمیج داکر را با یکدیگر بررسی میکنیم:
- ایجاد (Creation): در این مرحله، یک نمونه ایمیج داکر از یک Dockerfile ساخته میشود.
- برچسبگذاری و نسخهسازی (Tagging and versioning): هر ایمیج داکر توسط توسعهدهندگان برچسبگذاری میشود تا معلوم شود که چه کانتینری میسازد و تکرارش میکند.
- هرس (Pruning): در این مرحله، ایمیج قدیمی توسط توسعهدهندگان حذف و با ایمیج جدید از یک Dockerfile جدید جایگزین میشود.
حال نمونهای از چرخه حیات یک کانتینر داکر را بررسی میکنیم:
- ایجاد (Creation): کانتینر از ایمیج داکر ساخته میشود.
- در حال اجرا (Running): کانتینر شروع به کار کرده و فرایند خود را بهطور فعال اجرا میکند.
- وقفه/قطع وقفه (Paused/unpaused): عملیات کانتینر توسط مدیران متوقف یا از سر گرفته میشود.
- توقف (Stopped): کانتینر پس از تکمیل فرایند متوقف میشود. میتوانید بعدا آن راهاندازی مجدد (restart) کنید.
- حذف (Deleted): در این وضعیت، کانتینر دیگر وجود ندارد و باید آن را مجددا از روی ایمیج ایجاد کنید.
توسعهدهندگان معمولا پس از ایجاد ایمیجها، آن ها را برای کنترل نسخه و استفاده مجدد در یک فضای ذخیرهسازی نگه میدارند و درصورتی که قصد خالی کردن فضای ذخیرهسازیشان را داشته باشند، برای حذف آنها اقدام میکنند.
کانتینرها نیز چرخه حیات کوتاهتری نسبت به ایمیجها دارند؛ زیرا معمولا در طول فرایند توسعه اپلیکیشن، عملیاتی مانند بازآفرینی، توقف و حذف بر روی آنها انجام میشود.
یکی از سادهترین راهها برای این که بتوانید بدون هیچ محدودیتی از قابلیتهای ایمیج و کانتینر داکر استفاده کنید، خرید vps است.
ذخیرهسازی
ایمیجها علاوه بر سیستم محلی و سرور میزبان، در یک رجیستری داکر خصوصی یا عمومی ذخیره میشوند. با کمک این ذخیرهسازی متمرکز، کاربران میتوانند ایمیجها را ذخیره کرده و بهراحتی با تیم خود به اشتراک بگذارند.
برای ذخیرهسازی ایمیجها میتوانید از رجیستری رسمی Docker Hub، ارائهدهندگان خدمات ابری یا خود-میزبان (self-host) یک فروشگاه روی یک پلتفرم سرور خصوصی مجازی مانند Hostinger استفاده کنید.
کانیتنرهای داکر نیز فقط در سیستم میزبان ذخیره میشوند. برای اینکه بتوانید کانتینرهای داکر را در مکانهای مختلف اشتراکگذاری و بایگانی کنید، باید از ایمیج آنها استفاده کنید.
قابلحمل بودن (Portability)
ایمیج داکر قابلحمل است. قابلحمل بودن به این معناست که میتوانید آنها را بهراحتی در سیستمهای مختلف ذخیره کرده، به اشتراک بگذارید و مجددا استفاده کنید. در عین حال، کانتینرها بهطور پیشفرض قابلیت جابجایی ندارند و باید آنها را بهعنوان ایمیج منتقل کنید.
به عبارتی دیگر، شما میتوانید ایمیجها را جابجا کرده و روی هر سیستمی که از داکر پشتیبانی میکند، کانتینر خود را بسازید. البته به دلیل وجود تفاوت در پیکربندی سیستمهای مختلف، ممکن است کانتینری که در یک ماشین اجرا میکنید، رفتار متفاوتی در یک ماشین دیگر داشته باشد.
دستورات (Commands)
یکی دیگر از تفاوتهای Docker image و container در شکل دستورات آن هاست. بهعنوان مثال، برخی از دستورات مربوط به ایمیج داکر بهصورت زیر هستند:
- docker build: ایجاد یک ایمیج داکر از یک Dockerfile
- docker pull: دانلود یک ایمیج از رجیستری داکر
- docker push: آپلود یک ایمیج محلی در یک رجیستری
- docker images: لیست کردن تمام ایمیجهای محلی موجود
- docker rmi: حذف یک ایمیج از سیستم محلی
- docker tag: اضافه کردن یک برچسب جدید به یک ایمیج برای نسخهسازی
در ادامه، برخی از دستورات مربوط به مدیریت کانتینرها را با یکدیگر بررسی میکنیم:
- docker run: ایجاد و راهاندازی یک کانتینر از یک ایمیج
- docker ps: لیست کردن تمام کانتینرهای در حال اجرا
- docker exec: اجرای یک دستور در داخل یک کانتینر در حال اجرا
- docker stop: توقف یک کانتینر در حال اجرا
- docker start: راهاندازی یک کانتینر متوقفشده
- docker rm: حذف یک کانتینر متوقفشده
- docker logs: چاپ کردن لاگهای (log) مربوط از یک کانتینر در حال اجرا یا متوقفشده
کاربرد در توسعه و تولید
از ایمیج داکر در فرایند توسعه برای راهاندازی و تکرار یک محیط آزمایشی در ماشینهای مختلف استفاده میشود. این ایمیجها با خودکارسازی فرایندها، شما را از نصب دستی هر جزء راحت میکنند.
همچنین، قابلحمل بودن و ثبات ایمیجها به سادهسازی فرایند استقرار کمک میکند؛ زیرا میتوانید اپلیکیشن و اجزای آن را در یک ایمیج قرار داده و پروژهتان را بدون نیاز به آمادهسازی وابستگیها، وارد محیطهای تولید کنید.
کانتینرهای داکر نیز در فرایند توسعه به ایجاد یک محیط ایزوله کمک کرده و توسعهدهندگان با استفاده از این کانتینرها میتوانند تغییرات مدنظرشان را بهراحتی و بدون ایجاد مشکل آزمایش کرده و نتیجه این تغییرات را مشاهده کنند. کانتینرها از ایجاد تاثیر این تغییرات بر روی سایر سرویسها جلوگیری میکنند و خطر تداخل بین اجزای پروژه را به حداقل میرسانند.
در فرایند تولید نیز کانتینرهای داکر به شما کمک میکنند تا اپلیکیشنتان را با استفاده از چندین گره اضافی میزبانی کرده و استفاده از منابع و دسترسپذیری خدمات را بهینه کنید. همچنین، شما میتوانید پروژهتان را بهعنوان یک میکروسرویس مستقر کرده و با توزیع کانتینرهای داکر در سیستمهای مختلف، از وابستگی به فروشنده (vendor lock-in) که یکی از دلایل اختلال در فرایند تامین نیازهای نرمافزاری است، جلوگیری کنید.
چه زمانی از ایمیجها و کانتینرهای داکر استفاده کنیم؟
در دنیای واقعی، زمانی که با یک پروژه سروکار دارید، همیشه باید از ایمیجها و کانتینرها استفاده کنید؛ زیرا این دو ابزار دستدردست یکدیگر کار میکنند. با این حال، باید بدانید که در کدام مرحله از فرایند توسعه از کدام یک استفاده میشود.
در ابتدای توسعه، از ایمیج داکر برای بستهبندی اپلیکیشن و اجزای آن استفاده میشود. همچنین، ایمیجها برای تنظیم محیط در ماشینهای مختلف و پیگیری تکرار توسعه بکار گرفته میشوند.
کانتینرهای داکر نیز در فرایند تولید که در آن، اپلیکیشن در حال اجراست، مورداستفاده قرار میگیرند. در این فرایند، توسعهدهندگان از کانتینرها برای مدیریت هر محیط و بررسی تغییرات مختلف استفاده میکنند تا برای افزایش یا کاهش مقیاس پروژهشان تصمیمات بهتری بگیرند.
نتیجهگیری
کانتینر داکر یک محیط ایزوله است که اپلیکیشن و اجزای آن را در خود جای میدهد. ایمیج داکر نیز یک دستورالعمل برای ساخت کانتینر و نصب نرمافزارهای موردنیاز است. ایمیج داکر تغییرناپذیر است. این به این معناست که نمیتوانید بهراحتی آن را تغییر دهید و اگر میخواهید در ایمیج خود تغییراتی داشته باشید، باید یک ایمیج جدید از Dockerfile ایجاد کرده و پیکربندی آن را تغییر دهید. برعکس آن، کانتینر داکر قابلتغییر است و میتوانید با افزودن یک برنامه یا ویرایش کد، آن را بهراحتی سفارشیسازی کنید.
ایمیج داکر بهراحتی بین سیستمها جابجا شده، در یک رجیستری تمرکز ذخیره میشود و چرخه حیات طولانیتری دارد. در آن طرف، کانتینرها فقط بهعنوان ایمیج منتقل شده، در سرور میزبان قرار میگیرند و اغلب در طول فرایند توسعه دوباره ایجاد میشوند.
شما میتوانید از ایمیج داکر برای راهاندازی آسان محیطهای سازگار بر روی چندین سیستم، چه برای آزمایش و چه برای همکاری با سایر اعضای تیمتان استفاده کنید. کانتینرها نیز برای اجرای اپلیکیشن در سرور میزبان در حین استقرار بکار میروند.
سوالهای متداول
تفاوت اصلی بین ایمیج داکر و کانتینر در چیست؟
کانتینر داکر یک محیط ایزوله برای اپلیکیشنهای کاربردی و همچنین وابستگیها، کتابخانهها و سایر منابع موردنیاز آنهاست. یک ایمیج داکر نیز دستورالعملی برای ساخت یک کانتینر است که شامل اجزای نصب است. با این که این دو اساسا یکسان هستند، اما اهداف متفاوتی را در فرایند استقرار دنبال میکنند.
آیا Dockerfile یک ایمیج است؟
Dockerfile یک فایل متنی حاوی دستورالعملها و پیکربندی برای ساخت یک ایمیج است. برای ایجاد یک ایمیج، باید یک Dockerfile جدید بسازید و اجزای لازم مانند کتابخانهها و پکیجها را اضافه کنید. سپس، برای ساخت ایمیج باید انجین داکر (Docker engine) را اجرا کنید.
آیا کانتینرهای داکر میتوانند بدون ایمیج وجود داشته باشند؟
خیر، فرایند ساخت کانتینرهای داکر به ایمیج نیاز دارد؛ زیرا ایمیجها دستورالعملهای پیکربندی و اجزای موردنیاز را تعریف میکنند. با این حال، ایمیجها میتوانند بدون Dockerfile وجود داشته باشند؛ زیرا میتوانید آنها را از یک رجیستری مانند Docker Hub دانلود کنید.