ایمیج 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 را بهخوبی درک کنید.