مقدمه
کانتینرها در یک اپلیکیشن میکروسرویس باید با یکدیگر و اغلب با سیستمهای خارجی ارتباط برقرار کنند. قابلیتهای شبکهسازی داکر بر پایه سه جزء ساخته شدهاند: Container Network Model (CNM) که مشخصات طراحی است، libnetwork که آن را پیادهسازی میکند، و درایورها (drivers) که آن را با توپولوژیهای خاص شبکه گسترش میدهند.
مدل شبکه کانتینری
CNM سه بلوک ساختمانی بنیادین را تعریف میکند. یک sandbox پشته شبکه ایزولهای داخل کانتینر است که شامل رابطها، جداول مسیریابی و پیکربندی DNS میشود. Endpointها رابطهای شبکه مجازی هستند که یک sandbox را به یک شبکه متصل میکنند. شبکهها (Networks) سوییچهای مجازی هستند — معمولاً پیادهسازیهای نرمافزاری یک bridge از نوع 802.1d — که endpointهایی که نیاز به ارتباط دارند را گروهبندی میکنند.
هر کانتینر sandbox مخصوص به خود را با حداقل یک endpoint دارد. کانتینری با دو endpoint متصل به دو شبکه متفاوت میتواند به هر دو دسترسی داشته باشد، اما خود endpointها نمیتوانند مستقیماً با یکدیگر ارتباط برقرار کنند، زیرا هرکدام مانند یک آداپتور شبکه استاندارد وابسته به یک شبکه واحد رفتار میکنند.
Libnetwork
libnetwork پیادهسازی مرجع و متنباز CNM است که بهعنوان بخشی از پروژه Moby نگهداری میشود. داکر در ابتدا شبکهسازی را مستقیماً داخل daemon پیادهسازی میکرد، اما در نهایت آن را به این کتابخانه مستقل منتقل کرد که control plane شبکه، از جمله service discovery و load balancing ingress را نیز پیادهسازی میکند.
درایورها
در حالی که libnetwork control plane را مدیریت میکند، درایورها data plane را پیادهسازی میکنند — ساخت شبکهها و تضمین اتصال و ایزولهسازی. داکر با درایورهای داخلی مانند bridge، overlay و macvlan عرضه میشود، و شخصثالثها میتوانند درایورهای اضافی برای توپولوژیهای پیشرفتهتر پیادهسازی کنند. یک هاست واحد یا کلاستر Swarm میتواند چندین شبکه را اجرا کند که هرکدام توسط درایور متفاوتی مدیریت میشود.
شبکههای Bridge تکهاست
سادهترین نوع شبکه داکر، شبکه bridge تکهاست است که با درایور داخلی bridge ساخته میشود. هر هاست داکر بهطور خودکار یک شبکه پیشفرض به نام bridge دریافت میکند که به یک bridge لینوکسی به نام docker0 در kernel هاست نگاشت میشود. این نگاشت با دستور زیر قابل تأیید است:
docker network inspect bridge | grep bridge.nameیک شبکه bridge سفارشی را میتوان با دستور زیر ساخت:
docker network create -d bridge localnetاین کار همچنین یک bridge لینوکسی متناظر روی هاست ایجاد میکند که با دستور brctl show قابل مشاهده است. کانتینرهای متصل به یک شبکه bridge سفارشی مشترک میتوانند یکدیگر را با نام تشخیص دهند، به لطف resolver داخلی DNS داکر — قابلیتی که در شبکه پیشفرض bridge در دسترس نیست.
دسترسی خارجی از طریق نگاشت پورت
کانتینرهای روی یک شبکه bridge مشترک میتوانند مستقیماً با یکدیگر صحبت کنند، اما دسترسی از بیرون نیازمند نگاشت پورت کانتینر به پورتی روی هاست داکر است:
docker run -d --name web --network localnet --publish 5005:80 nginxپس از publish شدن، سرویس از طریق آدرس IP هاست روی پورت نگاشتشده، هم از کانتینرهای دیگر و هم از کلاینتهای خارجی قابلدسترسی میشود. این روش هرچند کاربردی است، مقیاسپذیری خوبی ندارد، زیرا فقط یک فرآیند میتواند در یک زمان به یک پورت مشخص روی هاست متصل شود — یکی از دلایلی که شبکههای bridge تکهاست بیشتر برای توسعه محلی و اپلیکیشنهای کوچک مناسباند.
نتیجهگیری
درک CNM، libnetwork و نقش درایورها، پایهای برای کار با هر توپولوژی شبکه داکر فراهم میکند. شبکههای bridge تکهاست، هرچند ساده هستند، مکانیزمهای اصلی — sandboxها، endpointها و service discovery مبتنی بر DNS — را نشان میدهند که به انواع پیشرفتهتر شبکه مانند overlay و macvlan نیز تعمیم مییابند.