اگر مقاله قبلی را مطالعه کرده باشید، با مفهوم Docker Image آشنا شدهاید و میدانید که هر برنامه در Docker ابتدا به صورت یک Image ساخته میشود. اما Image بهتنهایی قابل اجرا نیست و برای اجرای واقعی برنامه به مفهومی به نام Docker Container نیاز داریم.در واقع، Docker Container همان محیطی است که برنامه در آن اجرا میشود. زمانی که یک Image را اجرا میکنید، Docker از روی آن یک Container میسازد و برنامه را در یک محیط ایزوله اجرا میکند.Docker Container یکی از مهمترین مفاهیم در Docker است و درک صحیح آن به شما کمک میکند نحوه اجرای برنامهها، مدیریت سرویسها و استقرار نرمافزارها را بهتر متوجه شوید.در این مقاله با مفهوم Docker Container، نحوه عملکرد آن، چرخه حیات کانتینرها، تفاوت آن با ماشین مجازی و مهمترین دستورات مربوط به مدیریت Container آشنا خواهید شد.
Docker Container چیست؟
به زبان ساده، Docker Container یک محیط ایزوله و قابل اجرا است که برنامه و تمام وابستگیهای موردنیاز آن را در خود جای میدهد. هر Container از روی یک Docker Image ساخته میشود و پس از اجرا، برنامه را در محیطی مستقل از سایر برنامهها اجرا میکند.برای درک بهتر، فرض کنید Docker Image مانند نقشه ساخت یک ساختمان باشد. این نقشه مشخص میکند ساختمان چگونه ساخته شود، اما تا زمانی که عملیات ساخت انجام نشود، ساختمانی وجود نخواهد داشت Docker Container همان ساختمان ساختهشدهای است که میتوان از آن استفاده کرد. به همین دلیل، از روی یک Docker Image میتوان چندین Container مستقل ایجاد کرد که هرکدام بهصورت جداگانه اجرا شوند.یکی از مهمترین ویژگیهای Docker Container، ایزوله بودن (Isolation) آن است. هر Container فضای اجرای مخصوص به خود را دارد و فایلها، پردازشها، شبکه و تنظیمات آن از سایر Containerها جدا هستند. این ویژگی باعث میشود برنامههای مختلف بدون ایجاد تداخل، روی یک سیستم اجرا شوند.همچنین Docker Container بسیار سبکتر از ماشینهای مجازی (Virtual Machine) است. دلیل این موضوع آن است که Containerها به جای اجرای یک سیستمعامل کامل، از هسته (Kernel) سیستمعامل میزبان استفاده میکنند. در نتیجه، سرعت راهاندازی آنها بیشتر است و منابع کمتری مانند پردازنده و حافظه مصرف میکنند.به طور خلاصه، هر زمان که یک Docker Image اجرا شود، Docker یک Container ایجاد میکند و برنامه را در آن اجرا خواهد کرد.
Docker Container چگونه کار میکند؟
اکنون که با مفهوم Docker Container آشنا شدیم، بهتر است ببینیم هنگام اجرای یک Container در پشت صحنه چه اتفاقی میافتد.زمانی که دستور اجرای یک Image مانند docker run را وارد میکنید، Docker ابتدا بررسی میکند که آیا Image موردنظر روی سیستم شما وجود دارد یا خیر. اگر Image در سیستم محلی موجود نباشد، Docker آن را از یک Registry مانند Docker Hub دانلود میکند. پس از آماده شدن Image،Docker یک Container جدید از روی آن ایجاد کرده و برنامه را اجرا میکند.در زمان ایجادContainer، Docker یک لایه قابل نوشتن (Writable Layer) روی Docker Image قرار میدهد. از آنجا که Docker Image تغییرناپذیر (Immutable) است، تمام تغییراتی که هنگام اجرای برنامه ایجاد میشوند، مانند تولید فایلهای جدید یا تغییر دادهها، در این لایه ذخیره خواهند شد و Image اصلی بدون تغییر باقی میماند.Docker همچنین برای هر Container منابعی مانند پردازنده، حافظه، شبکه و فضای فایل را بهصورت مستقل مدیریت میکند. این موضوع باعث میشود چندین Container بتوانند بهصورت همزمان روی یک سیستم اجرا شوند، بدون اینکه عملکرد یکدیگر را مختل کنند.برای مثال، اگر از یک Docker Image مربوط به Nginx سه بار استفاده کنید، Docker سه Container مستقل ایجاد خواهد کرد. هر یک از این Containerها پردازشها، تنظیمات و وضعیت اجرای مخصوص به خود را دارند، اما همگی از یک Image مشترک ساخته شدهاند.به همین دلیل، Docker Container راهکاری سریع، سبک و قابل اعتماد برای اجرای برنامهها در محیطهای توسعه، تست و تولید محسوب میشود.
تفاوت Docker Container و Docker Image
یکی از مهمترین مفاهیمی که هنگام یادگیری Docker باید به آن مسلط شوید، تفاوت بین Docker Image و Docker Container است. این دو مفهوم ارتباط بسیار نزدیکی با یکدیگر دارند، اما نقش آنها کاملاً متفاوت است.همانطور که در مقاله قبل توضیح دادیم، Docker Image یک الگوی آماده برای اجرای برنامه است که شامل کد، کتابخانهها، وابستگیها و تنظیمات موردنیاز میشود. در مقابل، Docker Container نمونهای در حال اجرا از همان Image است که برنامه را در یک محیط ایزوله اجرا میکند.برای درک بهتر، فرض کنید یک فایل نصب نرمافزار روی سیستم خود دارید. این فایل نصب همان Docker Image است، اما زمانی که نرمافزار را نصب و اجرا میکنید، در واقع معادل یک Docker Container ایجاد شده است.به عبارت دیگر، Image همیشه ثابت و تغییرناپذیر است، اما Container در طول اجرای برنامه میتواند تغییر کند. فایلهای جدید ایجاد کند، دادهها را پردازش کند یا وضعیت برنامه را در خود نگه دارد. جدول زیر تفاوت این دو مفهوم را نشان میدهد:
| Docker Image | Docker Container |
| الگوی آماده برای اجرای برنامه | نمونه در حال اجرای Image |
| تغییرناپذیر (Immutable) | دارای لایه قابل نوشتن (Writable Layer) |
| شامل فایلها، وابستگیها و تنظیمات | شامل پردازشهای در حال اجرا و وضعیت برنامه |
| برای ساخت Container استفاده میشود | برای اجرای برنامه استفاده میشود |
| میتواند چندین Container ایجاد کند | از یک Image ساخته میشود |
به طور خلاصه، هر Docker Container از یک Docker Image ایجاد میشود، اما یک Docker Image میتواند بارها مورد استفاده قرار گیرد و Containerهای متعددی را ایجاد کند.
چرخه حیات (Lifecycle) Docker Container
هر Docker Container از زمان ایجاد تا حذف شدن، مراحل مختلفی را طی میکند که به آن چرخه حیات (Lifecycle) گفته میشود. آشنایی با این مراحل به شما کمک میکند Containerها را بهتر مدیریت کرده و وضعیت آنها را بهدرستی تشخیص دهید.چرخه حیات یک Container معمولاً شامل مراحل زیر است:
Created: در این مرحله Container ایجاد شده است، اما هنوز برنامه داخل آن اجرا نشده است.
Running: پس از اجرای Container، برنامه اصلی شروع به کار میکند و Container در وضعیت Running قرار میگیرد.
Paused: در صورت نیاز میتوان اجرای Container را بهصورت موقت متوقف کرد، بدون اینکه پردازشهای آن از بین بروند.
Stopped: اگر برنامه متوقف شود یا دستور توقف صادر شود، Container وارد وضعیت Stopped میشود. در این حالت اطلاعات Container همچنان حفظ میشود و میتوان دوباره آن را اجرا کرد.
Removed: زمانی که دیگر به Container نیازی نباشد، میتوان آن را حذف کرد. پس از حذف، تمام اطلاعات مربوط به لایه قابل نوشتن Container نیز از بین خواهد رفت، مگر اینکه دادهها در Volume ذخیره شده باشند.در عمل، بیشتر مدیران سیستم و توسعهدهندگان با وضعیتهای Running و Stopped سروکار دارند، اما شناخت سایر وضعیتها نیز برای مدیریت بهتر Containerها ضروری است.
مزایای استفاده از Docker Container
استفاده از Docker Container مزایای زیادی دارد و یکی از مهمترین دلایل محبوبیت Docker نیز همین مزایا استContainerها باعث میشوند توسعه، تست و استقرار نرمافزارها سریعتر، سادهتر و قابل اعتمادتر انجام شود.یکی از مهمترین مزایای Docker Container، سرعت راهاندازی بالا است. برخلاف ماشینهای مجازی که برای اجرا نیاز به بوت شدن یک سیستمعامل کامل دارند، Containerها تنها در چند ثانیه یا حتی کسری از ثانیه اجرا میشوند.مزیت دیگر، مصرف پایین منابع سیستم است. از آنجا که Containerها از هسته سیستمعامل میزبان استفاده میکنند، به حافظه و پردازنده کمتری نسبت به Virtual Machine نیاز دارند. این موضوع باعث میشود بتوان تعداد بیشتری Container را روی یک سرور اجرا کرد.از دیگر مزایای Docker Container میتوان به قابلیت حمل (Portability) اشاره کرد. یک Container که روی سیستم توسعهدهنده اجرا میشود، بدون نیاز به تغییرات اساسی میتواند روی سرورهای آزمایشی یا محیط تولید نیز اجرا شود. این ویژگی بسیاری از مشکلات ناشی از تفاوت محیطهای اجرا را از بین میبرد.همچنین Docker Container محیطی ایزوله برای اجرای برنامهها فراهم میکند. هر Container منابع، فایلها و پردازشهای مخصوص به خود را دارد و اجرای یک برنامه تأثیری بر سایر برنامهها نخواهد گذاشت.در نهایت، Containerها فرآیند مقیاسپذیری (Scalability) را نیز سادهتر میکنند. در صورت افزایش بار کاری، میتوان بهراحتی چندین Container جدید از یک Image ایجاد کرد و ترافیک را میان آنها توزیع کرد. به همین دلیل Docker یکی از ابزارهای اصلی در معماری Microservices و زیرساختهای ابری محسوب میشود.
دستورات مهم Docker Container
پس از آشنایی با مفهوم Docker Container، نوبت به یادگیری مهمترین دستوراتی میرسد که برای مدیریت Containerها استفاده میشوند. Docker ابزارهای متنوعی برای ایجاد، اجرا، مشاهده، متوقف کردن و حذف Containerها در اختیار کاربران قرار میدهد. آشنایی با این دستورات، مدیریت برنامههای کانتینری را بسیار سادهتر میکند و از مهارتهای پایهای هر توسعهدهنده یا مدیر سیستم محسوب میشود.یکی از اولین دستوراتی که معمولاً با آن سروکار خواهید داشت، دستور docker ps است. این دستور فهرست تمام Containerهای در حال اجرا را نمایش میدهد و اطلاعاتی مانند شناسه (Container ID)، نام، وضعیت و پورتهای اختصاصیافته را در اختیار شما قرار میدهد.
docker ps
اگر بخواهید علاوه بر Containerهای فعال، Containerهای متوقفشده را نیز مشاهده کنید، کافی است از گزینه -a استفاده کنید.
docker ps -a
برای متوقف کردن یک Container در حال اجرا از دستور docker stop استفاده میشود. این دستور ابتدا به برنامه فرصت میدهد تا پردازشهای خود را بهصورت ایمن به پایان برساند و سپس Container را متوقف میکند
docker stop container_name
در صورتی که بخواهید یک Container متوقفشده را دوباره اجرا کنید، میتوانید از دستور docker start استفاده کنید.
docker start container_name
همچنین اگر هدف شما راهاندازی مجدد یک Container باشد، دستور docker restart ابتدا Container را متوقف کرده و سپس دوباره آن را اجرا میکند.
docker restart container_name
زمانی که دیگر به یک Container نیازی نداشته باشید، میتوانید آن را با استفاده از دستور docker rm حذف کنید. البته توجه داشته باشید که برای حذف یک Container، ابتدا باید اجرای آن متوقف شده باشد.
docker rm container_name
در بسیاری از مواقع، بهویژه هنگام عیبیابی یا بررسی وضعیت برنامه، لازم است وارد محیط داخلی یک Container شوید. برای این منظور از دستور docker exec استفاده میشود. گزینه -it امکان تعامل مستقیم با محیط Container را فراهم میکند و در بیشتر توزیعهای لینوکس میتوان از Bash برای ورود استفاده کرد.
docker exec -it container_name bash
اگر Image موردنظر از Bash پشتیبانی نکند، معمولاً میتوان به جای آن از sh استفاده کرد.در نهایت، برای مشاهده خروجی برنامه و بررسی خطاهای احتمالی، دستور docker logs کاربرد دارد. این دستور تمام لاگهای تولیدشده توسط برنامه در حال اجرا داخل Container را نمایش میدهد و یکی از مهمترین ابزارها برای عیبیابی و مانیتورینگ محسوب میشود.
docker logs container_name
با استفاده از این چند دستور، میتوانید بیشتر عملیات روزمره مربوط به مدیریت Docker Containerها را انجام دهید. با پیشرفتهتر شدن پروژهها نیز دستورات دیگری مانند docker inspect، docker cp و docker stats برای بررسی جزئیات و پایش Containerها مورد استفاده قرار میگیرند.
بهترین روشها (Best Practices) در استفاده از Docker Container
استفاده صحیح از Docker Container علاوه بر افزایش کارایی، امنیت و پایداری برنامهها را نیز بهبود میبخشد. رعایت چند نکته ساده میتواند مدیریت Containerها را بسیار آسانتر کند.یکی از مهمترین توصیهها این است که هر Container فقط یک سرویس یا برنامه اصلی را اجرا کند. برای مثال، بهتر است وبسرور، پایگاه داده و سرویس کش هرکدام در Container جداگانه اجرا شوند. این کار مدیریت، مقیاسپذیری و عیبیابی را سادهتر میکند.همچنین بهتر است از Containerهای موقت استفاده کنید. در Docker، Containerها باید در صورت نیاز بهراحتی حذف و دوباره ایجاد شوند و اطلاعات مهم برنامه در Volumeها یا پایگاه داده ذخیره شوند، نه داخل خود Container.نکته مهم دیگر، استفاده از نامهای مشخص برای Containerها است. انتخاب نامهای معنادار باعث میشود مدیریت تعداد زیادی Container سادهتر شود.در پروژههای واقعی، استفاده از Restart Policy نیز توصیه میشود تا در صورت بروز خطا یا راهاندازی مجدد سرور، Containerها بهصورت خودکار اجرا شوند.در نهایت، همواره سعی کنید Containerها را با کمترین سطح دسترسی ممکن اجرا کنید و از اجرای برنامهها با کاربر Root خودداری کنید. این کار امنیت محیط Docker را تا حد زیادی افزایش میدهد.
سؤالات متداول درباره Docker Container
- آیا یک Docker Image میتواند چندین Container ایجاد کند؟
بله. یک Docker Image میتواند بارها اجرا شود و هر بار یک Docker Container جدید و مستقل ایجاد کند.
- آیا حذف Container باعث حذف Docker Image میشود؟
خیر. Docker Image و Docker Container دو موجودیت مستقل هستند. با حذف یک Container، Image اصلی همچنان روی سیستم باقی میماند و میتوان دوباره از آن Container جدید ایجاد کرد.
- تفاوت دستور docker stop و docker kill چیست؟
دستور docker stop ابتدا به برنامه فرصت میدهد تا بهصورت ایمن متوقف شود و سپس Container را خاموش میکند. اما دستور docker kill بدون انتظار، اجرای برنامه را بهصورت فوری متوقف میکند.
- آیا میتوان وارد یک Docker Container شد؟
بله. با استفاده از دستور docker exec میتوان وارد محیط داخلی یک Container شد و دستورات موردنظر را اجرا کرد.
- آیا Docker Container همان ماشین مجازی است؟
خیر. Docker Container و Virtual Machine هر دو محیطی ایزوله برای اجرای برنامه فراهم میکنند، اما Containerها از هسته سیستمعامل میزبان استفاده میکنند و به همین دلیل سبکتر، سریعتر و کممصرفتر از ماشینهای مجازی هستند.
Leave A Comment