ایمیج Docker به عنوان یک قالب (template) فقط خواندنی برای ایجاد کانتینرها استفاده میشود. این ایمیج شامل تمامی اجزایی است که برای اجرای یک نرمافزار لازم است، مانند:
- برنامه اصلی: خود نرمافزار یا اپلیکیشن مورد نظر.
- محیط اجرایی: مانند پایتون، جاوا یا هر زبان دیگری.
- کتابخانهها و وابستگیها: تمامی پکیجها و ابزارهای مورد نیاز.
- متغیرهای محیطی: تنظیماتی که بر رفتار برنامه تأثیر دارند.
- فایلهای پیکربندی: تنظیمات مورد نیاز برای اجرای نرمافزار.
ایمیج Docker از روی یک Dockerfile ساخته میشود که دستورات لازم برای راهاندازی محیط و نصب اجزای مورد نیاز را مشخص میکند.
نکات مهم درباره ایمیجهای Docker:
- فقط خواندنی: پس از ایجاد، ایمیجهای Docker قابل تغییر نیستند. تغییراتی که در یک کانتینر در حال اجرا (مثل نصب پکیج جدید) اعمال میشود، در ایمیج اصلی ثبت نخواهد شد.
- ساختار لایهای: هر ایمیج از چندین لایه تشکیل شدهاست که هر کدام نمایانگر یک دستور در Dockerfile (مانند
RUN
،COPY
،ADD
و ...) هستند. این لایهها بهمنظور بهینهسازی فرایند ساخت (build) در حافظه کش نگهداری میشوند. - قابل حمل: ایمیجهای Docker مستقل از سیستم عامل میزبان بوده و میتوانند روی هر سیستمی که Docker نصب شده باشد اجرا شوند.
مثال یک Dockerfile:
# استفاده از یک ایمیج پایه
FROM ubuntu:20.04
# نصب پکیجهای مورد نیاز
RUN apt-get update && apt-get install -y python3 python3-pip
# کپی کردن فایلهای برنامه به داخل کانتینر
COPY . /app
# تنظیم دایرکتوری کاری
WORKDIR /app
# نصب وابستگیهای پایتون
RUN pip3 install -r requirements.txt
# باز کردن پورت مورد نیاز
EXPOSE 5000
# دستور اجرای برنامه
CMD ["python3", "app.py"]
کانتینر Docker نمونه اجرایی (runtime instance) یک ایمیج Docker است. وقتی یک ایمیج اجرا شود، به یک کانتینر تبدیل میشود. کانتینرها محیطهای ایزولهای هستند که برنامهها را به شیوهای یکپارچه بدون توجه به تفاوتهای میزبان اجرا میکنند.
نکات کلیدی درباره کانتینرهای Docker:
- لایه قابل نوشتن: در حالی که ایمیجها فقط خواندنی هستند، کانتینرها یک لایه قابل نوشتن بر روی ایمیج به آنها اضافه میکنند. تغییراتی که در حین اجرای کانتینر (مانند تغییر فایلها یا نصب نرمافزار) انجام میشود، در همین لایه ذخیره میگردد.
- محیط ایزوله: کانتینرها در محیطهای جداگانه از یکدیگر و از میزبان اجرا میشوند، به طوری که از تداخل میان برنامهها جلوگیری میشود.
- موقتی بودن: کانتینرها معمولاً زودگذر هستند؛ پس از توقف یا حذف کانتینر، تغییرات ایجاد شده در آن از بین میرود مگر اینکه به روشهای دیگری مانند استفاده از volumes یا commit ذخیره شوند.
اجرای یک کانتینر:
برای اجرای یک کانتینر از یک ایمیج، از دستور docker run
استفاده میشود. در این فرآیند، Docker ایمیج را گرفته و کانتینر جدیدی از آن ایجاد میکند که فرمان یا پردازه تعیینشده (مثلاً راهاندازی سرور یا اجرای اپلیکیشن) را اجرا میکند.
مثال:
docker run -d -p 5000:5000 my-image
این دستور کانتینر را در حالت detached (-d
) اجرا کرده و پورت 5000 میزبان را به پورت 5000 داخل کانتینر متصل میکند.
- ایمیجها به عنوان نقشهی راه (blueprint): ایمیجها مشخصات دقیق نحوه ایجاد یک کانتینر را تعیین میکنند.
- کانتینرها به عنوان نمونههای اجرایی: یک کانتینر یک نمونه (instance) از یک ایمیج است که میتواند در طول زمان تغییراتی داشته باشد.
- تعداد کانتینرهای متعدد از یک ایمیج: میتوان چندین کانتینر را از یک ایمیج ایجاد کرد.
- پایداری ایمیجها: حذف یا توقف یک کانتینر تاثیری بر ایمیج اصلی ندارد؛ کانتینر میتواند مجدداً از همان ایمیج ساخته شود.
- ایجاد یک ایمیج: ابتدا یک ایمیج از طریق Dockerfile ساخته میشود.
- اجرای یک کانتینر: سپس از دستور
docker run
برای ایجاد و اجرای کانتینر از ایمیج استفاده میشود. - اعمال تغییرات (اختیاری): تغییراتی که در داخل کانتینر انجام میشود (مانند نصب پکیج یا تغییر فایلها)، تنها به همان کانتینر مربوط میشود مگر اینکه به ایمیج جدید commit شود.
- توقف کانتینر: پس از پایان کار، کانتینر متوقف میشود. البته در صورت نیاز میتوان آن را دوباره اجرا کرد اما تغییرات اعمالشده در حین اجرا به صورت خودکار ذخیره نخواهد شد.
- حذف کانتینر: در صورت عدم نیاز به کانتینر، میتوان آن را حذف کرد؛ در این صورت ایمیج اصلی بدون تغییر باقی میماند.
ویژگی | ایمیج Docker | کانتینر Docker |
---|---|---|
ماهیت | قالب تنها خواندنی | نمونه اجرایی قابل نوشتن |
حالت | تغییرناپذیر | قابل تغییر در زمان اجرا |
کاربرد | تعریف نحوه ایجاد کانتینر | محیط اجرای برنامه |
چرخه حیات | امکان به اشتراکگذاری، نسخهبندی، و استفاده مجدد | ایجاد، اجرا، توقف و حذف |
- ساخت ایمیج:
docker build -t my-image .
- اجرای کانتینر از ایمیج:
docker run my-image
- لیست تمامی کانتینرها:
docker ps -a
- توقف کانتینر:
docker stop <container_id>
- حذف کانتینر:
docker rm <container_id>
- حذف ایمیج:
docker rmi <image_id>
با توجه به اینکه کانتینرها به صورت موقتی هستند و تغییرات در لایه قابل نوشتن ذخیره میشوند، استفاده از Volumes در Docker امکان ذخیرهسازی دادهها به صورت دائمی را فراهم میکند. این Volume ها در یک دایرکتوری مشخص در میزبان ذخیره میشوند و میتوانند میان کانتینرهای مختلف به اشتراک گذاشته شوند. این ویژگی تضمین میکند که دادهها حتی پس از حذف کانتینر باقی بمانند.
ابتدا باید شناسه یا نام کانتینر مدنظر را بدانید. برای مشاهده لیست کانتینرهای در حال اجرا، از دستور زیر استفاده کنید:
docker ps
این دستور اطلاعاتی همچون CONTAINER ID
و NAMES
کانتینرهای در حال اجرا را نمایش میدهد.
با استفاده از دستور docker exec
میتوانید وارد کانتینر شده و تغییرات لازم را اعمال کنید. برای شروع یک شِل (مثلاً bash
یا sh
)، دستور زیر را اجرا کنید:
docker exec -it <container_id_or_name> bash
اگر کانتینر از شِل bash
پشتیبانی نمیکند، میتوانید از sh
استفاده کنید:
docker exec -it <container_id_or_name> sh
پس از اجرای این دستور، به خط فرمان داخل کانتینر دسترسی پیدا کرده و میتوانید تغییرات مد نظر را اعمال کنید.
-
نصب پکیج:
در صورتی که کانتینر مبتنی بر اوبونتو یا دبیان باشد، میتوانید پکیج مورد نیاز را با دستور زیر نصب کنید:apt-get update && apt-get install -y <package_name>
اگر کانتینر بر پایه Alpine باشد، از مدیریت پکیج
apk
استفاده کنید:apk add --no-cache <package_name>
-
ویرایش فایل:
برای ویرایش فایلها میتوانید از ویرایشگرهایی مانندnano
یاvi
استفاده کنید. در صورتی که این ویرایشگرها نصب نباشند، میتوانید با استفاده از دستورecho
محتویات جدید را به فایل اضافه یا جایگزین کنید:echo "متن جدید" > /path/to/file.txt
پس از اعمال تغییرات، با استفاده از دستور:
exit
از کانتینر خارج شوید.
- ورود به کانتینر:
docker exec -it my-container bash
- نصب پکیج:
apt-get update && apt-get install -y curl
- خروج از کانتینر:
exit
- ورود به کانتینر:
docker exec -it my-container bash
- افزودن محتوا به فایل (مثلاً
/app/log.txt
):echo "این یک ورودی لاگ است" >> /app/log.txt
- خروج از کانتینر:
exit
-
استفاده از
docker commit
:
اگر بخواهید تغییرات موقت داخل کانتینر (مثلاً نصب یک پکیج) را به صورت دائمی ذخیره کنید، میتوانید از دستورdocker commit
برای ایجاد یک ایمیج جدید از کانتینر تغییر یافته استفاده کنید:docker commit <container_id> <new_image_name>
-
توضیح بیشتر درباره تغییرات موقتی:
تغییراتی که با دستورdocker exec
اعمال میشوند تنها در لایه قابل نوشتن کانتینر ذخیره میشوند و در صورت حذف کانتینر از بین میروند. برای حفظ تغییرات باید آنها را به یک ایمیج جدید commit کنید یا دادهها را در یک volume ذخیره کنید. -
ابزارهای تکمیلی:
در پروژههای پیچیده میتوان از ابزارهایی مانند Docker Compose برای مدیریت چندین کانتینر با هم استفاده کرد. Docker Compose امکان تعریف سرویسها، شبکهبندی و volumeها در یک فایل YAML را فراهم میکند و مدیریت پروژههای چند کانتینری را سادهتر میکند.
- ایمیج Docker: قالب فقط خواندنی شامل تمامی اجزای لازم جهت اجرای برنامه (شامل کد، محیط اجرایی، کتابخانهها، متغیرهای محیطی و پیکربندیها) است.
- کانتینر Docker: نمونه اجرایی ایمیج که یک محیط ایزوله و قابل تغییر در زمان اجرا فراهم میکند.
- رویه کار معمول: ساخت ایمیج از Dockerfile → اجرای کانتینر از ایمیج → اعمال تغییرات (اختیاری) → توقف یا حذف کانتینر.
- نگهداشت دادهها: استفاده از Docker Volumes برای حفظ دادهها حتی پس از حذف کانتینر توصیه میشود.
- ابزارهای مدیریتی: دستورات اصلی Docker و همچنین ابزارهایی مانند Docker Compose برای مدیریت پروژههای پیچیده در دسترس هستند.
این ترجمه جامع و روان به شما کمک میکند تا مفاهیم کلیدی و عملیاتهای اساسی مربوط به Docker Image و Container را بهخوبی درک کنید.