شبکه در Docker و ارتباط کانتینرها
ارتباط کانتینرها در لینوکس چگونه کار میکند؟
در هفتهی سوم با مفاهیم شبکههای کامپیوتری، سوئیچها، پورتها و روتینگ آشنا شدید. داکر تمام این مفاهیم را بهصورت مجازی درون هستهی لینوکس پیادهسازی میکند:
هنگامی که داکر نصب میشود، یک کارت شبکهی مجازی از نوع پل به نام docker0 در لینوکس میسازد. هر کانتینری که روشن میشود، یک جفت رابط شبکهی مجازی (veth pair) دریافت میکند: یک سرِ کابل به سوئیچ مجازی داکر متصل میشود و سر دیگر به داخل فضای نام شبکهی کانتینر میرود.
درایورهای شبکهی پیشفرض داکر (Network Drivers)
داکر چند درایور شبکهی پیشفرض دارد:
bridge(پل ارتباطی): درایور پیشفرض. کانتینرها در یک شبکهی خصوصی و مجازی قرار میگیرند و برای دسترسی از بیرون باید پورتهای آنها expose شود (-p).host: ایزولاسیون شبکه حذف میشود و کانتینر مستقیماً از کارت شبکه و پورتهای سرور اصلی استفاده میکند (پورت ۸۰ کانتینر مستقیماً روی پورت ۸۰ هاست باز میشود). بسیار سریع است اما ایزولاسیون امنیتی را کاهش میدهد.none: کانتینر هیچ کارت شبکهای جز Loopback (127.0.0.1) ندارد؛ برای پردازشهای کاملاً آفلاین و ایزوله.overlay: برای شبکهسازی بین چندین سرور مجزا در کلاسترهای Docker Swarm یا ابزارهای توزیعشده.
تفاوت حیاتی: پل پیشفرض در برابر User-defined Bridge
یکی از اشتباهات رایج افراد تازهکار در داکر این است که کانتینرها را در شبکهی پیشفرض اجرا میکنند و انتظار دارند کانتینرها با اسم یکدیگر را پیدا کنند!
| ویژگی | Default Bridge (bridge) | User-defined Bridge (شبکهی دستی) |
|---|---|---|
| DNS خودکار و Service Discovery | ❌ ندارد (فقط بر اساس IP) | ✅ دارد (شناسایی با نام کانتینر) |
| ایزولاسیون امنیتی | ضعیف (همهی کانتینرها پیشفرض در آن هستند) | عالی (فقط سرویسهای مرتبط متصل میشوند) |
| اتصال زنده (Hot Connect) | نیاز به توقف کانتینر دارد | در حین اجرا قابل اتصال و قطع است |
در User-defined Bridge، داکر یک سرور DNS داخلی روی آدرس 127.0.0.11 فعال میکند. به همین دلیل کانتینرها میتوانند بدون دانستن آدرس IP متغیر یکدیگر، فقط با تایپ کردن نام کانتینر دیگر به آن متصل شوند.
دستورهای مدیریت شبکه
آزمایش عملی: کشف سرویس (Service Discovery) با DNS داکر
بیایید دو کانتینر بسازیم و ارتباط آنها را از طریق نامشان آزمایش کنیم:
گام ۱: ساخت یک شبکهی اختصاصی
گام ۲: اجرای وبسرور Nginx روی این شبکه با نام api-service
دقت کنید که ما هیچ پورتی را با -p روی هاست باز نکردیم! این کانتینر فقط درون شبکهی internal-net در دسترس است.
گام ۳: اجرای کانتینر دوم و فراخوانی وبسرور با استفاده از نام آن
خروجی صفحهی خوشآمدگویی Nginx را مشاهده خواهید کرد:
داکر نام http://api-service را به صورت خودکار و از طریق DNS داخلی به آدرس IP کانتینر ترجمه کرد. این دقیقاً همان روشی است که وبسایتها با دیتابیسها و میکروسرویسها با یکدیگر بدون هاردکد کردن IP صحبت میکنند.
انتشار پورتها (Port Publishing)
برای اینکه کاربران خارج از سرور بتوانند به سرویس داخل کانتینر متصل شوند، باید پورت را نگاشت (Publish) کنید:
این دستور به هستهی لینوکس (از طریق قوانین iptables NAT) دستور میدهد هر بستهای که به پورت 8080 سرور اصلی آمد را مستقیماً به پورت 80 درون کانتینر فوروارد کند.
اگر میخواهید پورت فقط برای درخواستهای درون خود هاست در دسترس باشد (و از اینترنت عمومی دیده نشود):
ابزارهای اشکالزدایی شبکهی کانتینرها
اگر دو کانتینر نتوانستند با هم ارتباط برقرار کنند:
- بررسی اتصال به یک شبکهی مشترک:
- تست ارتباط و پینگ از درون کانتینر:
- تست پورت با ابزار netcat یا curl:
منابع یادگیری
ویدیو
- آشنایی و کارهای مقدماتی با داکر قسمت سه از سه — جادی — آموزش فارسی شامل مباحث شبکه در داکر و نحوهی ساخت ایمیج با Dockerfile
- Learn Docker Networking: Bridge vs MACVLAN vs IPVLAN — Network Direction — بررسی دقیق و مقایسهای درایورهای شبکه در داکر و سازوکار Bridge (مباحث پیشرفتهتر مانند MACVLAN و IPVLAN در این ویدیو برای مطالعهی اختیاری است)
مستندات و مقالات
- Docker Networking Overview — Official Docs — آشنایی کامل با معماری شبکه در داکر