عیب یابی مشکلات شبکه در Docker با استفاده از کانتینر کمکی.

یکی از مشکلاتی که معمولا sysadmin ها با Docker دارند مسائل مربوط به شبکه است که برای عیب یابی آنها نیاز به ابزارهایی مانند telnet، ping،nmap،netstat،wireshark و... میشود و معمولا ایمیج های داکر به صورت پیش فرض دارای چنین ابزارهایی نیستند و ما فقط درهنگام عیب یابی به این ابزارهای نیاز داریم. اولین راه حلی که به ذهن میرسه این هست که بریم داخل container و سریع دستور نصب را بزنیم و ابزار را نصب کنیم.این یک روش اشتباهه! به عنوان مثال در کانتینر nginx، جای پکیج های عیب یابی شبکه نیست. دلیل آن هم کاملا روشنه. کانتینر nginx چه نیازی به wireshark یا nmap داره ؟ مگه بدون این ابزارها نمیتونه کار کنه ؟خب چطور عیب یابی انجام بدیم ؟ راه حل اون ساده هست. ما با یک کانتینر کمکی این کار را انجام میدیم. کانتینر های کمکی فقط برای عیب یابی شبکه نیستند و میشه کارهای زیادی را با اون انجام داد.کار کانتینر کمکی کارش چیه ؟ فرض کنید ما یک کانتینر اصلی داریم که وظیفه ش مشخصه و کارشو انجام میده. میایم در کنارش کانتیرنر کمکی میاریم بالا تا یک سری ابزارهای کمکی در اختیار ما قرار بده. مثلا ما یک کانتینر اصلی db داریم و این نیاز داره در ابتدای شروع به کارش یک سری دیتا به داخل کپی بشه. ابتدا کانتینر اصلی میاد بالا و ما یک کانتینر کمکی که وظیفه ی کپی کردن فایل را برعهده داره میاریم بالا.در مثال کانتینر nginx فرض میکنیم که ما نیاز به ابزارهای کمکی برای عیب یابی شبکه داریم برای این کار ما یک کانتینر کمکی که دارای ابزارهای مختلف برای عیب یابی شبکه هست را میاریم بالا میچسبونیمش به کانتینر اصلی nginx و وقتی ما در داخل کانتینر کمکی دستوری برای عیب یابی اجرای میکنیم دقیقا مثل این هست که داریم داخل کانتینر اصلی اون دستور را اجرا میکنیم بدون این که نیاز باشه یک سری پکیج اضافه روی کانتینر اصلی نصب بشه.یکی از کانتینر های معروف برای عیب یابی های شبکه که ابزارهای زیادی هم داره nicolaka/netshoot هست. برای استفاده از اون هم میتونیم این کانتینر را درشبکه ی کانتینر اصلی بیاریم بالا و دستورات را در اون اجرا کنیم.بریم سراغ مثال های عملی.ابزار tcpdumptcpdump یک ابزاری هست که میتونیم با استفاده از اون پکت های ورودی/ خروجی را بخونیم، انالیز کنیم و از این دسته کارها.در این مثال ما یک کانتینر nginx اجرا میکنیم و یک کانتینر nicolaka/netshoot هم برای عیب یابی اون میاریم بالا و به شبکه کانتینر اصلی وصل میکنیم# docker run -d –name mynginx -p 80:80 nginx # docker run -it –net container:mynginx nicolaka/netshootخب همانطور که مشاهده میکنید در اجرای کانتینر کمکی از دستور -d یا -itd استفاده نشد. دلیل اون هم مشخصه. این کانتینر کمکی هست و پس از پایان ماموریتش دیگه باهاش کاری نداریم. پس از اجرای دستور بالا وارد کانتینر netshoot شدیم و دستور زیر را اجرا میکنیم# tcpdump -i eth0 port 80 -c 1 -Xvvسوییچ -i eth0 اشاره به کارت شبکه داخل کانتینر mynginx داره.اجرای دستور tcpdumpپس از اجرای این دستور میتونیم آی پی docker host را در داخل یک مرورگر باز کنیم تا به nginx اصلی وصل بشیم و tcpdump پکت ورودی را کپچر کرده و نتیجه را به ما نشون میده tcpdumpنتیجه دستورابزار iperfمثال دوم، iperf ابزاری برای تست performance شبکه هست. گاهی اوقات پیش میاد که میگن مشکل کندی داریم و این مشکل میتونه دلایل مختلفی داشته باشه که یکی از اونها ممکنه کندی شبکه باشه و ما میخوایم متوجه این بشیم که آیا ارتباط بین دو کانتینر دارای کندی هست یا خیر.برای این کارابتدا یک شبکه از نوع bridge در داخل داکر میسازیم# docker network create perf-testخب حالا دو کانتینر کلاینت و سرور برای تست مورد نظرمون میاریم بالا و نتایج را میبینیم# docker run -itd –name perf-test-a –network perf-test nicolaka/netshoot iperf -s -p 9999 # docker run -itd –name perf-test-b –network perf-test nicolaka/netshoot iperf -c perf-test-a -p 9999خب میتونیم با اجرا دستور زیر لاگ کانتینر perf-test-a را مشاهده کنیمنتیجه ی تست عملکرد شبکه با دستور iperfمثال سوم استفاده از ابزار netstatبرای این مثال ما مجدد یک کانتینر به نام mynginx و یک کانتینر کمی میاریم بالا# docker run -d –name mynginx -p 80:80 nginx # docker run -it –net container:mynginx nicolaka/netshootحالا میتونیم دستور netstat را اجرا کنیم تا پورت های باز را مشاهده کنیمنتیجه اجرای دستور netstatمیبینیم که پورت 80 در حال listen شدن هست و انگار دستور را داخل کانتینر nginx اجرا کردیممثال چهارم. استفاده از netcatگاهی اوقات شما از یک پورتی استفاده میکنید که دیده نمیشه و میخواید چک کنید که آیا فایروال اون را بلاک کرده یا نه.در این مثال ابتدا ما یک شبکه در داکر میسازیم به نام mynet و بعد از اون هم دوتا کانتینر # docker network create mynet # docker run -d –name mynginx –net mynet -p 80:80 nginx # docker run -itd –name mynetcat –net mynet nicolaka/netshoot nc -vz mynginx 80 # docker logs mynetcatو نتیجه :نتیجه دستور ncوقتی این پیام را میبینیم متوجه میشیم که حداقل فایروال این پورت را بلاک نکرده و با موفقیت به پورت وصل شدیممثال پنجم، ابزار iftop برای مانیتور کردن پهنای باند شبکه به صورت realtime# docker run -d –name mynginx –net mynet -p 80:80 nginx # docker run -it -net container:mynginx nicolaka/netshoot iftop -i eth0نتیجه دستور iftopخب به انتهای این مقاله رسیدیم. امیدوارم مقاله مفیدی باشه و گره ای از مشکلات شما باز کنه. در صورتی که مشکلی در روند کار مشاهده کردید میتونید در کامنت ها درج کنید تا پاسخ بدم.