
اگر با Docker کار کرده باشید، احتمالاً بارها با اصطلاح Docker Image مواجه شدهاید. تقریباً تمام عملیاتهای Docker از یک Image آغاز میشود؛ اما بسیاری از افراد در ابتدای مسیر، تفاوت بین Image و Container را بهخوبی درک نمیکنند.
در نگاه اول، ممکن است Docker Image فقط یک فایل یا نسخه آماده از برنامه به نظر برسد، اما در عمل نقش بسیار مهمتری در فرآیند ساخت، توزیع و اجرای نرمافزار دارد. هر برنامهای که با Docker اجرا میشود، ابتدا از روی یک Image ساخته میشود و سپس در قالب یک Container اجرا خواهد شد.
در این مقاله با مفهومDocker Image، نحوه عملکرد آن، تفاوتش با Container و نقش آن در اکوسیستم Docker آشنا میشویم.
Docker Image چیست؟
به زبان ساده، Docker Image یک الگوی آماده (Template) است که تمام فایلها، کتابخانهها، وابستگیها و تنظیمات موردنیاز برای اجرای یک برنامه را در خود نگه میدارد. هر زمان که Docker یک Image را اجرا کند، از روی آن یک Container ایجاد میشود.
اگر بخواهیم یک مثال ساده بزنیم، Docker Image را میتوان شبیه نقشه ساخت یک ساختمان در نظر گرفت. تا زمانی که این نقشه وجود دارد، میتوان هر تعداد ساختمان مشابه ساخت. در Docker نیز یک Image میتواند بارها اجرا شود و هر بار یک Container جدید ایجاد کند، بدون اینکه خود Image تغییری کند.
یکی از مهمترین ویژگیهای Docker Image این است که تغییرناپذیر (Immutable) است. به این معنا که پس از ساخته شدن، محتوای آن تغییر نمیکند و اگر لازم باشد نسخه جدیدی از برنامه ایجاد شود، یک Image جدید ساخته خواهد شد. این ویژگی باعث میشود همه اعضای تیم، برنامه را دقیقاً با یک نسخه و در یک محیط یکسان اجرا کنند و احتمال بروز خطاهای ناشی از تفاوت محیطها کاهش پیدا کند.
Image چگونه کار میکند؟
بعد از اینکه با مفهوم Docker Image آشنا شدیم، بهتر است بررسی کنیم که این Image در پشت صحنه چگونه کار میکند و Docker چگونه از یک Image یک برنامه قابل اجرا ایجاد میکند.
Docker Image در واقع مجموعهای از فایلها و دستورالعملهایی است که Docker برای ساخت محیط اجرای برنامه به آنها نیاز دارد. این فایلها شامل کد برنامه، کتابخانهها، فایلهای تنظیمات، وابستگیها و حتی سیستمعامل پایه موردنیاز برای اجرای نرمافزار هستند.
زمانی که یک Docker Image ساخته میشود، Docker آن را به صورت مجموعهای از لایهها (Layers) ذخیره میکند. هر تغییر در Image باعث ایجاد یک لایه جدید میشود و Docker فقط همان بخش تغییرکرده را ذخیره میکند. این موضوع باعث میشود ساخت، انتقال و بهروزرسانیImageها سریعتر و کمحجمتر انجام شود.
برای مثال، فرض کنید یک برنامه با Node.js دارید. برای اجرای این برنامه، به یک سیستمعامل پایه، محیط Node.js، کتابخانههای موردنیاز و کد اصلی برنامه نیاز دارید. Docker این موارد را به صورت لایههای مختلف کنار هم قرار میدهد و در نهایت یک Image ایجاد میکند.
زمانی که دستور اجرای یک Image را صادر میکنید، Docker از این Image استفاده کرده و یک Container ایجاد میکند. Containerدر واقع یک نمونه در حال اجرا از Image است که یک محیط ایزوله برای اجرای برنامه فراهم میکند.
تفاوت Docker Image و Docker Container
یکی از رایجترین سؤالات در ابتدای یادگیری Docker، تفاوت بین Image و Container است. این دو مفهوم ارتباط بسیار نزدیکی با یکدیگر دارند، اما وظایف متفاوتی دارند.
Docker Image یک فایل یا الگوی فقطخواندنی است که شامل تمام اطلاعات موردنیاز برای اجرای یک برنامه است، در حالی که Docker Container یک محیط اجرایی است که از روی Image ساخته میشود.
برای درک بهتر، میتوان Image را مانند فایل نصب یک نرمافزار و Container را مانند همان نرمافزار نصبشده و در حال اجرا در نظر گرفت.
به عنوان مثال، وقتی یک Image مربوط به یک برنامه وب دارید، این Image به خودی خود کاری انجام نمیدهد. زمانی که Docker آن را اجرا میکند، یک Container ایجاد میشود و برنامه داخل آن شروع به کار میکند.
جدول زیر تفاوت این دو مفهوم را بهتر نشان میدهد:
- Image شامل دستورالعملها و فایلهای موردنیاز برای اجرای برنامه است.
- Container محیطی است که این Image در آن اجرا میشود.
بنابراین Image همیشه نقش یک الگو را دارد و Container نمونه اجرایی ساختهشده از آن است.
Docker Image | Docker Container |
یک Template یا الگو برای ساخت محیط اجرا است. | یک نمونه در حال اجرای Image است. |
معمولاً تغییرناپذیر (Immutable) است | میتواند در زمان اجرا تغییر کند |
شامل فایلها، کتابخانهها و تنظیمات برنامه است | شامل پردازشهای در حال اجرا و وضعیت برنامه است. |
برای ساخت Container استفاده میشود | برای اجرای برنامه استفاده میشود. |
میتواند چندین Container ایجاد کند. | از یک Image ساخته میشود. |
به عبارت ساده، اگر Docker را مانند یک کارخانه در نظر بگیریم، Image همان قالب تولید محصول است و Container محصول ساختهشدهای است که در حال استفاده قرار دارد.
Image Layer چیست؟
یکی از مفاهیم مهم در Docker Image، مفهوم Layer یا لایه است. Docker Image برخلاف تصور بسیاری از افراد یک فایل یکپارچه نیست، بلکه از چندین لایه مختلف تشکیل شده است.
هر دستور در فایل Dockerfile معمولاً یک لایه جدید در Image ایجاد میکند. برای مثال، اگر در Dockerfile ابتدا یک Image پایه انتخاب کنید، سپس تعدادی پکیج نصب کنید و در مرحله بعد فایلهای برنامه را اضافه کنید، Docker برای هر مرحله یک Layer جداگانه ایجاد خواهد کرد.
یک Image معمولاً شامل بخشهای زیر است:
- Base Layer: لایه پایه که معمولاً شامل سیستمعامل یا محیط اولیه است.
- Dependency Layer: شامل کتابخانهها و ابزارهای موردنیاز برنامه.
- Application Layer: شامل کد و فایلهای اصلی برنامه.
مزیت استفاده از Layerها این است که Docker میتواند بخشهای مشترک بین Imageهای مختلف را دوباره استفاده کند. برای مثال، اگر چند برنامه مختلف از یک نسخه Ubuntu یا Node.js استفاده کنند، Docker مجبور نیست این بخشها را دوباره دانلود یا ذخیره کند.
این ویژگی چند مزیت مهم دارد:
- کاهش حجم Imageها
- افزایش سرعت ساخت Image
- سرعت بیشتر در دانلود و انتقال Image
- استفاده بهینهتر از فضای ذخیرهسازی
برای مثال، اگر یک Image موجود را تغییر دهید و فقط کد برنامه را تغییر دهید، Docker فقط Layer مربوط به کد برنامه را دوباره ایجاد میکند و سایر بخشها بدون تغییر باقی میمانند.
Base Image چیست؟
هر Docker Image معمولاً از یک Base Image شروع میشود. Base Image اولین لایهای است که سایر بخشهای برنامه روی آن ساخته میشوند.
Base Image میتواند شامل یک سیستمعامل ساده مانند Ubuntu یا Alpine باشد یا حتی شامل یک محیط آماده مانند Python، Node.js یا Java باشد.
برای مثال، اگر قصد ساخت یک برنامه Python را داشته باشید، میتوانید از یک Base Image آماده Python استفاده کنید. در این حالت دیگر نیازی نیست Python را به صورت دستی نصب کنید و فقط کافی است کد برنامه و وابستگیهای خود را اضافه کنید.
Docker Hub چیست؟
بعد از ساخت یک Docker Image، معمولاً نیاز دارید آن را ذخیره یا با دیگران به اشتراک بگذارید. Docker Hub یکی از محبوبترین سرویسها برای ذخیره و توزیع Docker Image ها است.
Docker Hub یک Registry عمومی برای نگهداری Imageهای Docker است. توسعهدهندگان و شرکتها میتوانند Imageهای خود را در آن قرار دهند تا دیگران بتوانند آنها را دریافت و استفاده کنند.
برای مثال، بسیاری از Imageهای رسمی مانند:
- Ubuntu
- Nginx
- MySQL
- Redis
- Python
در Docker Hub منتشر شدهاند و کاربران میتوانند آنها را با دستور docker pull دریافت کنند. Docker Hub علاوه بر ذخیره Imageها، امکانات دیگری مانند مدیریت نسخهها (Tags)، اسکن امنیتی Imageها و همکاری تیمی را نیز فراهم میکند.
سؤالات متداول درباره Docker Image
- آیا Docker Image همان Container است؟
خیر Docker Image یک الگو برای ساخت Container است، اما Container محیطی است که این Image در آن اجرا میشود. یک Image میتواند چندین Container مختلف ایجاد کند.
- آیا Docker Image قابل تغییر است؟
خیر، Docker Image به صورت Immutable طراحی شده است. یعنی بعد از ساخته شدن، تغییر نمیکند. اگر نیاز به تغییر داشته باشید، باید یک نسخه جدید از Image ایجاد کنید.
- آیا چند Container میتوانند از یک Image استفاده کنند؟
بله. یک Docker Image میتواند همزمان برای ساخت چندین Container استفاده شود. هر Container محیط اجرای مستقل خود را خواهد داشت.
- Docker Imageها کجا ذخیره میشوند؟
Imageهایی که دانلود یا ساخته میشوند، به صورت محلی روی سیستم شما ذخیره میشوند. همچنین میتوان آنها را در Registryهایی مانند Docker Hub نگهداری و به اشتراک گذاشت.
- تفاوت Docker Image و Virtual Machine چیست؟
Docker Image فقط فایلها و وابستگیهای موردنیاز برنامه را شامل میشود و از Kernel سیستم میزبان استفاده میکند، اما Virtual Machine یک سیستمعامل کامل را اجرا میکند. به همین دلیل Containerها معمولاً سبکتر و سریعتر از ماشینهای مجازی هستند.
- چگونه یک Docker Image بسازیم؟
برای ساخت Image معمولاً از یک فایل به نام Dockerfile استفاده میشود. در این فایل مراحل ساخت Image تعریف شده و سپس با دستور docker build یک Image جدید ایجاد میشود.

Leave A Comment