فرض کن یه پروژه بزرگ داری و همه چیز رو با Docker مدیریت میکنی. همه سرویسها و اپلیکیشنهات رو ریختی توی کانتینرها و فکر میکنی که دیگه خیالت راحته. اما یه روز صبح از خواب پا میشی و میبینی که یکی از کانتینرها کار نمیکنه و مشکلش هم معلوم نیست! اینجا میخوام بررسی کنم مرحله به مرحله و قدم به قدم چطور باید پیش بریم که بتونیم دیباگ کنیم و مشکل و برطرف کنیم.
دیباگ کردن با استفاده از ابزارهای سادهی Docker
اولین قدم برای دیباگ کردن اینه که وضعیت کانتینرها رو چک کنی. برای این کار میتونی از دستور docker ps
استفاده کنی تا ببینی کدوم یکی از کانتینرها به مشکل خوردن. اگه کانتینری متوقف شده یا در حال ریاستارت ، اولین چیزی که باید چک کنی لاگهاست. خوندن لاگ ها باعث میشه سریع تر متوجه مشکل کانتینر بشی.
docker logs [container_id]
docker ps
مثلاً فرض کن که توی لاگها یه خطایی مثل "Could not connect to database" میبینی. این یعنی کانتینرت نمیتونه به دیتابیس وصل بشه. حالا باید وارد کانتینرت بشی تا از داخل کانتینر بررسی کنی که آیا سرویس دیتابیس درست کار میکنه یا نه.
حل مشکلات شبکهای بین کانتینرها
یه مشکل رایج دیگه، مشکل تو ارتباط بین کانتینر هاست. مثلاً کانتینرت نتونه با سرویسهای دیگه ارتباط برقرار کنه. برای این کار باید شبکههای Docker رو چک کنی.
با این دستورها میتونی لیست شبکهها رو ببینی و با ببینی که آیا کانتینرت به درستی به شبکه متصل شده یا نه.
docker network ls
docker inspect [network_name]
استفاده از Snapshot برای دیباگ
یه قابلیت خیلی خوب Docker اینه که میتونی از وضعیت فعلی کانتینرت Snapshot بگیری. این Snapshot بعداً میتونه بهت کمک کنه که اگه یه تغییر مشکلزا توی کانتینرت انجام دادی، به حالت قبل برگردی.
بیایین یکم روی snapshot گرفتن عمیق تر بشیم ببینیم دقیقا چیکار میشه باهاش کرد و چه کمکی میکنه بهمون.
فرض کنید یک کانتینر دارید که به دلایلی به درستی کار نمیکنه. شما میتونید با استفاده از Docker Commit یک Snapshot از اون بگیرید:
docker commit <container_id> <snapshot_name>
با این دستور، یک docker image جدید از کانتینر فعلی شما ساخته میشه. حالا میتونید تغییرات مختلف رو روی کانتینر اعمال کنید، مثل نصب پکیجهای جدید، تغییرات در فایلهای کانفیگ، یا هرچیز دیگه ای که برای تست نیاز دارید. اگر تغییرات باعث شد مشکلات کانتینر برطرف شد میتونید همین و ادامه بدین. اما اگر تغییرات باعث شد مشکل جدیدی بوجود بیاد میتونید به راحتی به Snapshot قبلی برگردید.
فرض کنید یک کانتینر Nginx دارید که برای اجرای وبسرور به کار میره و شما به مشکل برخوردید. با دستور زیر از وضعیت فعلی کانتینر یک Snapshot میگیرید:
docker commit nginx_container my_nginx_snapshot
حالا میتونید تغییرات مختلفی روی کانتینر انجام بدین. اگر مشکلی به وجود اومد، کافیه کانتینر جدیدی از Snapshot قبلی بسازید و با اون کار رو ادامه بدید:
docker run -d my_nginx_snapshot
این روش این امکان رو میده که بدون نگرانی از دست دادن وضعیت فعلی کانتینر، تغییرات لازم رو انجام بدین و در صورت نیاز، به وضعیت قبلی برگردید. این قابلیت به خصوص در فرآیندهای دیباگ و تست بسیار مفیده و میتونه زمان زیادی رو صرفهجویی کنه.
نکاتی برای جلوگیری از بروز مجدد مشکلات
بعد از اینکه مشکل رو پیدا کردی و حلش کردی، باید به فکر این باشی که چطور میتونی جلوی بروز مجدد این مشکل رو بگیری. یه راه اینه که Dockerfile رو بهینهسازی کنی یا تنظیمات Docker Compose رو بهتر کنی. مثلاً میتونی کانفیگ شبکه رو چک کنی، وابستگیها رو به دقت مدیریت کنی، و از ابزارهای مانیتورینگ برای بررسی وضعیت کانتینرها استفاده کنی.
استفاده از ابزارهای پیشرفتهتر برای دیباگ
بجز ابزارهای پیشفرضی که خود Docker ارائه میده، میتونی از ابزارهای پیشرفتهتری مثل strace
یا gdb
برای دیباگ مشکلات عمیقتر استفاده کنی. مثلاً اگه مشکلت با یه پردازش خاص داخل کانتینر باشه، میتونی با استفاده از این ابزارها ردیابی کنی که دقیقاً چه اتفاقی داره میافته.
بزارین یکم عمیق تر بشیم روی trace , gdb و ببینیم چی هستن و چه کاربردی میتونن برامون داشته باشن؟
ابزار strace
یکی از ابزارهای قدرتمند توی لینوکس که به شما اجازه میده سیستمکالها (سیستمکالها درخواستهایی هستن که برنامهها برای انجام کارهای سطح پایین به کرنل لینوکس ارسال میکنن) و سیگنالهای دریافتشده توسط برنامه رو ردیابی کنید. استفاده از ابزار strace
برای دیباگ کانتینرها کمک میکنه تا بدونیم دقیقاً چه اتفاقی داخل کانتینر می افته.
فرض کن میخوایم برنامهای که توی کانتینر اجرا شده رو track کنیم. با استفاده از این دستور میتونیم سیستمکالها و سیگنالهای این برنامه رو ببینم:
docker exec -it [container_id] strace -p [process_id]
این دستور تمام سیستمکالهایی که توسط کانتینر داکر به کرنل لینوکس ارسال میشه رو به ما نشون میده. اگر مشکل در دسترسی به فایلها، شبکه یا سیستمهای دیگه باشه، strace
کمک میکنه تا مشکل را شناسایی کنیم.
اما دستور gdb
یا GNU Debugger یه دیباگره، که اجازه میده برنامههای در حال اجرا رو بررسی و کنترل کنیم. این ابزار برای پیدا کردن باگها در source code خیلی میتونه کاربردی باشه.
تکنیکهای بهبود عملکرد کانتینر
گاهی اوقات مشکل کانتینر میتونه به دلیل پایین بودن عملکردش باشه. برای بهبود عملکرد کانتینرها، باید تنظیمات منابع رو بهینه کنی. مثلاً اگه کانتینرت داره بیش از حد از CPU یا RAM استفاده میکنه، میتونی با تنظیم منابع مثل --cpu-shares
یا --memory
مقدار مصرف منابع رو محدود کنی. همچنین، استفاده از Multistage Builds توی Dockerfile میتونه حجم نهایی image رو کاهش بده و باعث بهبود سرعت اجرای کانتینر بشه.
امیدوارم این مطلب مفید بوده باشه براتون و مرسی که حمایت میکنید.