بلاگ هوش‌گراف

استقرار پروژه، DevOps و زیرساخت ابری برای تیم‌های ایرانی

Docker 1 دقیقه مطالعه

عیب‌یابی کانتینر Docker: لاگ، Exit Code و Restart Loop

مسیر عملی تشخیص کانتینر خراب: ps، logs، exit code، exec، پورت و منابع.

هوش‌گراف 28 تیر 1405

کانتینر بالا نمی‌آید، مدام restart می‌شود یا ناگهان 502 می‌گیرید. این راهنما یک مسیر تشخیص لایه‌لایه برای عیب‌یابی Docker ارائه می‌دهد.

اول وضعیت را ببینید

docker ps -a
docker inspect  --format '{{.State.Status}} {{.State.ExitCode}}'

Exit code معنا دارد: 137 اغلب OOM kill، 1 خطای اپ، 127 فرمان پیدا نشد. وضعیت Restarting یعنی سیاست restart فعال است و ریشه خطا تکرار می‌شود.

لاگ؛ منبع حقیقت

docker logs --tail=200 
docker logs -f 

اگر لاگ خالی است، ممکن است اپ به فایل داخل volume بنویسد یا بافر شود. برای Compose: docker compose logs -f service

exec و محیط

docker exec -it  sh
env | sort
ss -tulpn

داخل کانتینر ببینید پروسس listen می‌کند یا نه، متغیر محیطی درست است یا نه، و DNS داخلی کار می‌کند یا نه (مثلاً ping/curl به نام سرویس دیگر).

پورت و شبکه میزبان

conflict پورت میزبان یکی از خطاهای رایج up است. با ss -tulpn روی host ببینید چه کسی پورت را گرفته. همچنین تفاوت 127.0.0.1:PORT:PORT با 0.0.0.0 باعث دسترسی بیرونی متفاوت می‌شود.

منابع و دیسک

دیسک پر، باعث خطاهای عجیب لایه‌های ایمیج می‌شود. docker system df و پاکسازی کنترل‌شده (نه کورکورانه prune در production بدون درک) کمک می‌کند.

اگر می‌خواهید بعد از یادگیری این مفاهیم، مسیر استقرار را سریع‌تر جلو ببرید، می‌توانید از پروژه ابری هوشمند هوش‌گراف هم استفاده کنید؛ اما مبانی این مقاله مستقل از هر پلتفرمی برای کار روزمره مفید است.

نکات عملی بیشتر درباره عیب‌یابی Docker

وقتی روی عیب‌یابی Docker کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی عیب‌یابی Docker، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نکات عملی بیشتر درباره عیب‌یابی Docker

وقتی روی عیب‌یابی Docker کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی عیب‌یابی Docker، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نکات عملی بیشتر درباره عیب‌یابی Docker

وقتی روی عیب‌یابی Docker کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی عیب‌یابی Docker، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نکات عملی بیشتر درباره عیب‌یابی Docker

وقتی روی عیب‌یابی Docker کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

نظرات

هنوز نظری ثبت نشده. دیدگاه‌تان را بنویسید.

ثبت نظر

ایمیل شما منتشر نمی‌شود. فیلدهای ضروری علامت * دارند.