آنچه در این مقاله میخوانید [پنهانسازی]
اگر Docker Container بالا نمیآید، معمولا مشکل از تنظیمات اشتباه Port، خطای Image، مشکل Volume، کمبود منابع یا اجرای ناقص Service هاست. خطای Docker Container یکی از رایجترین مشکلات توسعه دهندههای Backend و DevOps محسوب میشود و تقریبا هر کسی که با Docker کار کرده حداقل یک بار با آن روبرو شده است. بیشتر این خطاها با بررسی Log ها و تنظیمات Container خیلی سریع قابل حل هستند.
سرفصل های مقاله
- Docker Container چیست؟
- چرا Docker Container بالا نمیآید؟
- مشکل در Port Mapping
- روش حل مشکل Port
- Crash شدن برنامه داخل Container
- بررسی Log های Container
- مشکل در Dockerfile
- مشکل در Volume ها
- کمبود RAM یا CPU
- مشکل در Environment Variable
- مشکل در Docker Compose
- رایجترین خطاهای Docker Container
- خطای Exited (1)
- خطای Restart Loop
- خطای Permission Denied
- خطای Image Not Found
- روش اصولی حل خطای Docker Container
- مرحله اول: بررسی وضعیت Container
- مرحله دوم: بررسی Log ها
- مرحله سوم: اجرای Interactive
- مرحله چهارم: بررسی منابع سرور
- مرحله پنجم: بررسی Docker Compose
- اشتباهات رایج برنامه نویسان Docker
- استفاده از latest
- ذخیره Secret داخل Dockerfile
- اجرای همه سرویسها داخل یک Container
- نداشتن Health Check
- روش جلوگیری از خطای Docker Container
- همیشه Log مناسب داشته باشید
- Dockerfile را ساده نگه دارید
- از Multi Stage Build استفاده کنید
- مانیتورینگ سرور را جدی بگیرید
- جمع بندی
Docker Container چیست؟
Docker Container محیطی ایزوله برای اجرای برنامه هاست. هر کانتینر تمام وابستگیهای مورد نیاز برنامه را داخل خودش نگه میدارد و مستقل از سیستم اصلی اجرا میشود.
مثلا وقتی این دستور اجرا میشود:
docker run nginx
یک Container جدید از Nginx ساخته و اجرا میشود.
مزیت اصلی Docker این است که:
- اجرای پروژه روی همه سیستمها یکسان میشود
- وابستگیها جدا نگه داشته میشوند
- Deploy پروژه سادهتر میشود
اما اگر تنظیمات اشتباه باشند، Container بالا نمیآید یا بلافاصله Crash میکند.
چرا Docker Container بالا نمیآید؟
دلایل مختلفی وجود دارد اما بعضی مشکلات بیشتر از بقیه دیده میشوند.
مشکل در Port Mapping
یکی از رایجترین مشکلات مربوط به Port هاست.
مثلا:
docker run -p 80:80 nginx
اگر Port 80 قبلا توسط سرویس دیگری استفاده شده باشد، Docker نمیتواند Container را اجرا کند.
نمونه خطا:
Bind for 0.0.0.0:80 failed
یعنی Port قبلا اشغال شده است.
روش حل مشکل Port
برای بررسی Port های فعال:
sudo lsof -i :80
یا:
sudo netstat -tulpn
بعد:
- سرویس قبلی را متوقف کنید
- یا از Port دیگری استفاده کنید
مثلا:
docker run -p 8080:80 nginx
Crash شدن برنامه داخل Container
گاهی Docker سالم است اما خود برنامه مشکل دارد.
مثلا:
- Syntax Error
- Dependency ناقص
- فایل پیدا نشده
- اتصال ناموفق به دیتابیس
در این شرایط Container اجرا میشود اما چند ثانیه بعد متوقف میشود.
بررسی Log های Container
اولین کاری که باید انجام دهید این است:
docker logs container_name
خیلی وقتها دلیل اصلی خطا دقیقا داخل Log مشخص است.
مثلا:
ModuleNotFoundError
یا:
Connection refused
مشکل در Dockerfile
بعضی وقتها Dockerfile اشتباه نوشته شده است.
مثلا:
CMD python app.py
در حالی که فایل app.py وجود ندارد.
یا مسیر اشتباه تعریف شده است.
نمونه خطا:
No such file or directory
مشکل در Volume ها
گاهی Volume ها اشتباه Mount میشوند.
مثلا:
-v /data:/app/data
اما مسیر اصلی وجود ندارد یا دسترسی لازم را ندارد.
نتیجه:
- فایل ها پیدا نمیشوند
- برنامه اجرا نمیشود
- Container متوقف میشود
کمبود RAM یا CPU
اگر سرور منابع کافی نداشته باشد:
- Container کند میشود
- Kill میشود
- Restart Loop اتفاق میافتد
برای بررسی مصرف منابع:
docker stats
اگر RAM یا CPU بیش از حد مصرف شده باشد، باید منابع سرور بررسی شوند.
مشکل در Environment Variable
خیلی از پروژهها بدون ENV اجرا نمیشوند.
مثلا:
DATABASE_URL
SECRET_KEY
REDIS_HOST
اگر این متغیرها تعریف نشده باشند، برنامه موقع Start دچار خطا میشود.
مشکل در Docker Compose
بعضی وقتها مشکل از تنظیمات Compose است.
مثلا:
depends_on:
- db
بعضی افراد فکر می کنند این بخش یعنی دیتابیس کامل آماده اجراست.
در حالی که فقط ترتیب Start شدن سرویسها را مشخص میکند.
نتیجه:
- API زودتر اجرا میشود
- اتصال به Database شکست میخورد
- Container Crash میکند
رایجترین خطاهای Docker Container
خطای Exited (1)
اگر این وضعیت را ببینید:
Exited (1)
یعنی برنامه داخل Container با خطا متوقف شده است.
معمولا مشکل از:
- برنامه
- Dependency
- تنظیمات
است.
خطای Restart Loop
گاهی Container مدام Restart میشود.
مثلا:
- اجرا میشود
- Crash میکند
- دوباره اجرا میشود
این مشکل معمولا به خاطر:
- Health Check اشتباه
- اتصال ناموفق به سرویس دیگر
- Error داخل برنامه
اتفاق میافتد.
خطای Permission Denied
نمونه:
Permission denied
علت معمولا:
- دسترسی اشتباه فایلها
- User نامناسب
- Volume Permission
است.
خطای Image Not Found
مثلا:
pull access denied
یعنی Docker نمیتواند Image را پیدا کند یا دسترسی لازم وجود ندارد.
روش اصولی حل خطای Docker Container
مرحله اول: بررسی وضعیت Container
اول این دستور را اجرا کنید:
docker ps -a
ببینید وضعیت Container چیست:
- Running
- Exited
- Restarting
این مرحله خیلی مهم است.
مرحله دوم: بررسی Log ها
مهمترین مرحله Debug همین است:
docker logs container_name
در بیشتر مواقع، دلیل اصلی مشکل همینجا مشخص میشود.
مرحله سوم: اجرای Interactive
برای بررسی داخل کانتینر:
docker run -it image_name bash
این روش کمک میکند فایلها و مسیرها را مستقیم بررسی کنید.
مرحله چهارم: بررسی منابع سرور
اگر سرور ضعیف باشد، حتی پروژه سالم هم ناپایدار میشود.
بررسی منابع:
docker stats
مرحله پنجم: بررسی Docker Compose
بخشهای زیر را دقیق چک کنید:
- Port
- ENV
- Volume
- Network
- depends_on
بیشتر مشکلات از همین قسمتها شروع میشوند.
اشتباهات رایج برنامه نویسان Docker
استفاده از latest
این اشتباه خیلی رایج است:
image: redis:latest
نسخه latest ممکن است تغییر کند و پروژه ناگهان خراب شود.
بهتر است Version ثابت استفاده شود.
ذخیره Secret داخل Dockerfile
مثلا:
ENV SECRET_KEY=123456
این کار امنیت پروژه را پایین میآورد.
بهتر است از فایل ENV استفاده شود.
اجرای همه سرویسها داخل یک Container
بعضی افراد:
- Nginx
- Redis
- API
- Worker
را داخل یک Container اجرا میکنند.
این روش مدیریت و Debug پروژه را سخت میکند.
نداشتن Health Check
اگر Health Check نداشته باشید، Docker متوجه خراب بودن سرویس نمیشود.
روش جلوگیری از خطای Docker Container
همیشه Log مناسب داشته باشید
بدون Log عملا پیدا کردن مشکل سخت میشود.
Dockerfile را ساده نگه دارید
Dockerfile پیچیده:
- احتمال خطا را بالا میبرد
- Build را کند میکند
- نگهداری پروژه را سخت میکند
از Multi Stage Build استفاده کنید
این روش:
- حجم Image را کمتر میکند
- امنیت را بهتر میکند
- Deploy را سریع تر میکند
مانیتورینگ سرور را جدی بگیرید
ابزارهایی مثل:
- Prometheus
- Grafana
- Portainer
برای مانیتورینگ Docker خیلی مفید هستند.
جمع بندی
خطای Docker Container معمولا به خاطر تنظیمات اشتباه Port، مشکل برنامه داخل Container، تنظیمات نادرست Docker Compose یا کمبود منابع سرور ایجاد میشود. مهمترین مرحله برای پیدا کردن مشکل بررسی Log هاست. اگر ساختار Dockerfile، Volume و ENV را اصولی مدیریت کنید، بیشتر این خطاها خیلی سریع قابل حل هستند.





