Docker، یک نرم افزار منبع باز است که به منظور تسهیل و ساده سازی توسعه برنامه طراحی شده است. این ابزار، مجموعه‌ای از محصولات با پلتفرم سرویس است که محیط‌های مجازی مجزا را برای ساخت، استقرار و آزمایش برنامه‌ها ایجاد می‌کند.

اگرچه تسلط به این نرم افزار کار نسبتاً ساده‌ای است؛ اما اصطلاحات خاصی در Docker وجود دارد که ممکن است برای کاربران جدید گیج کننده باشد. Dockerfileها، imageها، containerها، volumeها و اصطلاحات دیگر باید به درستی درک شوند تا به مرور زمان به Docker تسلط پیدا کنید.

بنابراین باید سعی نمایید، نقش‌های اساسی این عناصر را درک کنید. بدین صورت، یادگیری نحوه کار با آن‌ها آسان و سریع خواهد شد.

یکی از سوالات رایج برای بسیاری از کاربران این است که تفاوت بین image و container در Docker چیست؟

این مقاله، به شرح تفاوت این دو عنصر Docker و همچنین نحوه ارتباط آن‌ها پرداخته است.

 

 

این مطلب نیز ممکن است برای شما مفید باشد: کوچک نگه داشتن سایز Docker Image

 

Docker Image چیست؟

Docker Image، یک فایل تغییر ناپذیر (غیرقابل تغییر) است که شامل کد منبع، کتابخانه‌ها، وابستگی‌ها، ابزارها و سایر فایل‌های مورد نیاز برای اجرای برنامه است.

به دلیل ویژگی read-only آن‌ها، گاهی از این imageها به عنوان snapshot نیز یاد می‌شوند؛ چراکه آن‌ها یک برنامه و محیط مجازی آن را در یک زمان خاص نشان می‌دهند. این سازگاری، یکی از ویژگی‌های عالی Docker است که به توسعه دهندگان اجازه می‌دهد، نرم افزار را در شرایط ثابت و یکنواخت تست نمایند.

از آنجا که imageها در واقع تنها بصورت الگو هستند، شما نمی‌توانید آن‌ها را راه‌اندازی یا اجرا کنید؛ بلکه کاری که می‌توانید انجام دهید این است که از آن الگو به عنوان پایه‌ای برای ساخت یک container استفاده نمایید. یک container در نهایت تنها یک image در حال اجرا است. هنگامی‌که یک container ایجاد می‌کنید، یک لایه قابل نوشتن در بالای image تغییر ناپذیر اضافه می‌کند، به این معنی که اکنون می‌توانید آن را تغییر دهید.

imageای که بر اساس آن، یک container ایجاد می‌نمایید، به طور مستقل وجود دارد و قابل تغییر نیست. وقتی یک containerized environment را اجرا می‌کنید، در اصل یک کپی خواندن-نوشتن از آن سیستم فایل (docker image) در داخل container ایجاد می‌نمایید. این یک لایه container اضافه می‌کند که اجازه می‌دهد تا کل کپی image قابل ویرایش شود.

 

شما می‌توانید تعداد نامحدودی از docker imageها را از یک image پایه ایجاد کنید. هر بار که حالت اولیه یک image را تغییر داده و حالت موجود را ذخیره می‌نمایید، یک الگوی جدید با یک لایه اضافی در بالای آن ایجاد می‌کنید.

بنابراین، docker imageها می‌توانند شامل یک سری از لایه‌ها باشند که هر کدام متفاوت از دیگری هستند؛ اما از لایه قبلی نیز نشأت می‌گیرند. لایه‌های image نشان دهنده فایل‌های فقط-خواندنی هستند که پس از استفاده از آن‌ها برای راه‌اندازی یک محیط مجازی، یک لایه container به آن‌ها اضافه می‌شود.

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد و اجرای Docker Image با استفاده از Dockerfile

 

Docker Container چیست؟

docker container، یک محیط run-time مجازی است که در آن، کاربران می‌توانند برنامه‌ها را از سیستم اصلی جدا نمایند. container، واحدهای قابل حمل و جمع و جوری هستند که در آن‌ها می‌توانید به سرعت و به آسانی برنامه‌ای را راه‌اندازی کنید.

یک ویژگی ارزشمند، استانداردسازی محیط محاسباتی است که در داخل container اجرا می‌شود. این ویژگی، نه تنها تضمین می‌کند که برنامه شما در شرایط یکسان کار می‌نماید، بلکه اشتراک گذاری با سایر هم تیمی‌ها را نیز ساده می‌کند.

از آنجا که containerها مستقل هستند، یک محیط انزوای قوی یا isolation ایجاد کرده و تضمین می‌نماید که سایر containerهای در حال اجرا و همچنین سرور پشتیبان قطع نخواهد شد. docker ادعا می‌کند که این واحدها "قابلیت انزوای بسیار قدرت‌مندی را در صنعت ارائه می‌دهند". بنابراین، هنگام استقرار یک برنامه، نیازی نیست که نگران امنیت دستگاه خود باشید.

برخلاف ماشین‌های مجازی (VM) که مجازی سازی در سطح سخت افزار اتفاق می‌افتد، containerها در لایه app مجازی سازی را انجام می‌دهند. آن‌ها می‌توانند از یک ماشین استفاده کنند، هسته آن را به اشتراک بگذارند و سیستم عامل را برای اجرای فرایندهای مستقل مجازی سازی نمایند. این باعث می‌شود containerها بسیار سبک وزن باشند و به شما امکان می‌دهد منابع ارزشمندی را در اختیار داشته باشید.

 

تفاوت Image و container در Docker

هنگام بحث در مورد تفاوت بین image و containerها، منصفانه نیست که آن‌ها را با دید دو عنصر متضاد مقایسه کنیم. چراکه هر دو عنصر با یکدیگر مرتبط اند و بخشی از یک سیستم تعریف شده توسط پلتفرم Docker هستند.

چنانچه دو بخش قبلی را مطالعه کرده باشید، احتمالاً نحوه برقراری ارتباط بین این دو را متوجه شده باشید.

imageها می‌توانند بدون containerها وجود داشته باشند، در حالی که یک container برای اجرا به وجود یک image نیاز دارد. بنابراین، containerها به imageها وابسته هستند و از آن‌ها برای ایجاد یک محیط run-time و اجرای یک برنامه استفاده می‌نمایند.

این دو مفهوم به عنوان اجزای ضروری (یا بهتر است بگویم مراحل) در روند اجرای یک Docker container وجود دارند. داشتن یک container در حال اجرا مرحله نهایی این فرآیند است و نشان می‌دهد که به مراحل و اجزای قبلی بستگی دارد. به همین دلیل است که docker imageها اساساً containerها را اداره کرده و شکل می‌دهند.

 

این مطلب نیز ممکن است برای شما مفید باشد: حذف imageها، containerها و Volumeهای Docker

 

از Dockerfile تا Image تا Container

همه چیز با یک اسکریپت دستورالعمل شروع می‌شود که نحوه ایجاد یک image خاص Docker را مشخص می‌کند. این اسکریپت، Dockerfile نام دارد. فایل دستورات مشخص شده را به طور خودکار اجرا کرده و یک docker image ایجاد می‌نماید.
دستور ایجاد image از یک Dockerfile بصورت زیر است.

docker build

سپس از image به عنوان یک الگو (یا پایه) استفاده می‌شود که توسعه دهنده می‌تواند آن را کپی کرده و از آن برای اجرای یک برنامه استفاده نماید. برنامه، به یک محیط مستقل نیاز دارد تا در آن اجرا شود.

این محیط که همان container است، تنها یک "فضای" مجازی نیست؛ بلکه کاملاً به image ایجاد کننده متکی است. کد منبع، فایل‌ها، وابستگی‌ها و کتابخانه‌های باینری، که همه در docker image یافت می‌شوند، مواردی هستند که یک container را تشکیل می‌دهند.

به منظور ایجاد یک لایه container از یک image، دستور زیر  را اجرا کنید.

docker create

در نهایت، پس از راه اندازی یک container از روی یک image موجود، سرویس آن را راه‌اندازی کرده و برنامه را اجرا نمایید.

 

ایجاد یک docker image از یک container

اگر در image اولیه تغییراتی ایجاد کرده‌اید و می‌خواهید آن را برای کارهای بعدی نیز استفاده نمایید، شما می‌توانید با گرفتن یک snapshot از وضعیت فعلی container، آن image تغییر یافته را ذخیره کنید. با انجام این کار، یک لایه container را در بالای image متصل می‌کرده و در نهایت یک image تغییر ناپذیر جدید ایجاد می‌نمایید. در نتیجه، با دو docker image مشتق شده از یک سیستم فایل یکسان مواجه خواهید شد.

 

 

 

منبع:

phoenixnap