عیب یابی مشکلات شبکه در Docker با استفاده از کانتینر کمکی.
یکی از مشکلاتی که معمولا sysadmin ها با Docker دارند مسائل مربوط به شبکه است که برای عیب یابی آنها نیاز به ابزارهایی مانند telnet، ping،nmap،netstat،wireshark و... میشود و معمولا ایمیج های داکر به صورت پیش فرض دارای چنین ابزارهایی نیستند و ما فقط درهنگام عیب یابی به این ابزارهای نیاز داریم. اولین راه حلی که به ذهن میرسه این هست که بریم داخل container و سریع دستور نصب را بزنیم و ابزار را نصب کنیم.
این یک روش اشتباهه! به عنوان مثال در کانتینر nginx، جای پکیج های عیب یابی شبکه نیست. دلیل آن هم کاملا روشنه. کانتینر nginx چه نیازی به wireshark یا nmap داره ؟ مگه بدون این ابزارها نمیتونه کار کنه ؟
خب چطور عیب یابی انجام بدیم ؟ راه حل اون ساده هست. ما با یک کانتینر کمکی این کار را انجام میدیم. کانتینر های کمکی فقط برای عیب یابی شبکه نیستند و میشه کارهای زیادی را با اون انجام داد.
کار کانتینر کمکی کارش چیه ؟ فرض کنید ما یک کانتینر اصلی داریم که وظیفه ش مشخصه و کارشو انجام میده. میایم در کنارش کانتیرنر کمکی میاریم بالا تا یک سری ابزارهای کمکی در اختیار ما قرار بده. مثلا ما یک کانتینر اصلی db داریم و این نیاز داره در ابتدای شروع به کارش یک سری دیتا به داخل کپی بشه. ابتدا کانتینر اصلی میاد بالا و ما یک کانتینر کمکی که وظیفه ی کپی کردن فایل را برعهده داره میاریم بالا.
در مثال کانتینر nginx فرض میکنیم که ما نیاز به ابزارهای کمکی برای عیب یابی شبکه داریم برای این کار ما یک کانتینر کمکی که دارای ابزارهای مختلف برای عیب یابی شبکه هست را میاریم بالا میچسبونیمش به کانتینر اصلی nginx و وقتی ما در داخل کانتینر کمکی دستوری برای عیب یابی اجرای میکنیم دقیقا مثل این هست که داریم داخل کانتینر اصلی اون دستور را اجرا میکنیم بدون این که نیاز باشه یک سری پکیج اضافه روی کانتینر اصلی نصب بشه.
یکی از کانتینر های معروف برای عیب یابی های شبکه که ابزارهای زیادی هم داره nicolaka/netshoot هست. برای استفاده از اون هم میتونیم این کانتینر را درشبکه ی کانتینر اصلی بیاریم بالا و دستورات را در اون اجرا کنیم.
بریم سراغ مثال های عملی.
ابزار tcpdump
tcpdump یک ابزاری هست که میتونیم با استفاده از اون پکت های ورودی/ خروجی را بخونیم، انالیز کنیم و از این دسته کارها.
در این مثال ما یک کانتینر 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 داره.
پس از اجرای این دستور میتونیم آی پی docker host را در داخل یک مرورگر باز کنیم تا به nginx اصلی وصل بشیم و 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 را مشاهده کنیم
مثال سوم استفاده از ابزار netstat
برای این مثال ما مجدد یک کانتینر به نام mynginx و یک کانتینر کمی میاریم بالا
# docker run -d –name mynginx -p 80:80 nginx
# docker run -it –net container:mynginx nicolaka/netshoot
حالا میتونیم دستور 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
و نتیجه :
وقتی این پیام را میبینیم متوجه میشیم که حداقل فایروال این پورت را بلاک نکرده و با موفقیت به پورت وصل شدیم
مثال پنجم، ابزار iftop برای مانیتور کردن پهنای باند شبکه به صورت realtime
# docker run -d –name mynginx –net mynet -p 80:80 nginx
# docker run -it -net container:mynginx nicolaka/netshoot iftop -i eth0
خب به انتهای این مقاله رسیدیم. امیدوارم مقاله مفیدی باشه و گره ای از مشکلات شما باز کنه. در صورتی که مشکلی در روند کار مشاهده کردید میتونید در کامنت ها درج کنید تا پاسخ بدم.
مطلبی دیگر از این انتشارات
روشی برای کار با داده های آماری در دیتابیس - شبیه سازی Materialized view در Mariadb/Mysql
مطلبی دیگر از این انتشارات
معرفی ابزار Kompose - تبدیل فایل docker compose به ریسورس های kubernetes و openshift
مطلبی دیگر از این انتشارات
توسعه فرهنگ Google SRE در کسب و کار