docker-networking

یکی از مواردی که معمولا کمتر بررسی می‌شود اما در سرویس‌های عملیاتی با داکر از مهمترین موارد است شبکه‌ی داکر می‌باشد که شامل ارتباطات بین کانتینرها در یک هاست، ارتباطات بین کانتیرها با هاست خود و ارتباطات بین کانتینرها با چندین هاست و کانتینرهای آن می‌باشد. البته که این مبحث به شدت پیچیده و گسترده است و زمانی که شما در حجم بالا بخواهید از آن استفاده کنید نیاز است تا چندین کتاب را در مورد آن بررسی کنید. به عنوان مثال این کتاب به خوبی و با حجم کم به این موضوع پرداخته است.

docker networking
docker networking

داکر به صورت پیش‌فرض بعد از نصب ۳ شبکه‌ برای خود ایجاد می‌کنه که همانند تصویری زیر می‌باشد.

docker network ls
docker network ls

شما هر زمان نیاز بود که کانتینر راه‌اندازی کنید با آپشن network– می‌توانید کانتینر خود را به هر کدام از این شبکه‌ها متصل نمایید.

شبکه‌ی bridge:

داکر به صورت پیش‌فرض شبکه‌ی مورد نیاز برای ارتباط کانتینر با هاست را بر روی درایور bridge پیکربندی می‌کند و در دسترس قرار می‌دهد. اگر برای کانتینر خود شبکه‌ای پیکربندی نکنید به صورت پیش‌فرض به شبکه‌ای به نام docker0 متصل می‌شود. این شبکه همواره بعد از نصب داکر بر روی سیستم‌عامل شما ایجاد می‌شود که مربوط به سرویس‌دهنده‌ی داکر می‌باشد و معمولا هم subnet آن 172.17.0.0 می‌باشد. البته این موارد به صورت کامل قابل پیکربندی است و شما می‌توانید سرویس داکر خود را به گونه‌ای راه‌اندازی کنید که شبکه‌ی bridge آن دارای تنظیمات دیگری باشد.

به صورت پیش‌فرض این bridge بر روی سیستم‌عامل شما دارای ip با شماره‌ی 172.17.0.1 می‌باشد که کانتینرهای شما در همین رنج ip خواهند گرفت. به تصویر زیر توجه کنید:

ip addr show on host
ip addr show on host

شبکه‌ی none:

این شبکه برای زمانی است که شما نیاز ندارید داخل کانتینر خود کارت شبکه‌ای داشته باشید. این موضوع بسیار کم کاربرد می‌باشد اما این امکان فراهم است که شما کانتینری راه‌اندازی کنید که هیچ‌گونه ارتباط شبکه‌ای حتی با هاست خودش هم نداشته باشد. در تصویر زیر داخل یک کانتینر را نشان می‌دهد که با شبکه‌ی none راه‌اندازی شده است.

docker network none
docker network none

شبکه‌ی host:

در این حالت کانتینر از شبکه‌ی هاست استفاده می‌کند و در این حالت هیچ ایزولیشنی بین هاست و کانتینر وجود نخواهد داشت. به عنوان مثال اگر پورت ۸۰ یا ۳۳۰۶ از کانتینر در دسترس باشد به صورت کامل همان پورت هاست خواهد بود و تفاوتی بین این دو نیست و به گونه‌ای به صورت کامل کانتینر تمام مواردش بر روی هاست قرار خواهد گرفت.

نکته‌ی مهم: به صورت پیش‌فرض شبکه‌ی bridge به کانتینرها متصل می‌گردد و اگر بخواهید از دو شبکه‌ی دیگر استفاده کنید حتما باید آنها را در راه‌اندازی کانتینر به صورت آپشن وارد کنید. این موضوع به صورت کامل قابل پیکربندی است و می‌توانید همانند تمام موارد دیگر پیش‌فرض شبکه‌ را نیز تغییر دهید.

docker info | grep Network  Network: bridge host macvlan null overlay

داکر و portهای کانتینرها:

برای portها در داکر دو مکانیزم وجود دارد یکی exposing و دیگری publishing می‌باشد.

همواره با استفاده از آپشن‌‌ expose در داکرفایل می‌توان مشخص کرد چه پورت‌هایی از این ایمیج در حال سرویس‌دهی می‌باشند. این آپشن در دستور docker run نیز وجود دارد و قابل استفاده می‌باشد. اما دقت کنید که expose هیچ پورتی را در دسترس قرار نمی‌دهد.

آپشن publish برای در دسترس قرار دادن پورت‌های کانتینر در هاست و یا بیرون آن می‌باشد. با استفاده از این آپشن که با p- نیز در دسترس است می‌توان پورت‌های داخل کانتینر را بر روی پورت‌های داخل هاست map کرد و بر اساس نیازی که وجود دارد آنها را به ipهای مختلف bind نمود. به عنوان مثال پورت ۳۳۰۶ تنها بر روی شبکه لوکال هاست bind شود و در دسترس باشد اما پورت ۸۰ برای تمامی ipها و شبکه‌ها در دسترس باشد. به این مثال‌ها توجه کنید.

در مثال اول پورت 80 را به یک رندوم پورت که اینجا 32768 می‌باشد map کرده است که دسترسی آن برای تمامی شبکه‌ها می‌باشد و بر روی 0.0.0.0 bind شده است.

docker run -it -d -p 80 nginxdocker ps64879472feea        nginx               "nginx -g 'daemon ..."   43 hours ago        Up About a minute   443/tcp, 0.0.0.0:32768->80/tcp   nginx

در مثال دوم علاوه بر اینکه برای پورت 80 پورت 8080 را در نظر گرفته و دیگر رندوم پورت نیست تنها بر روی شبکه لوکال سرور هم در دسترس قرار داده شده است.

docker run -it -d -p 127.0.0.1:8080:80 nginx docker psb9788c7adca3        nginx               "nginx -g 'daemon ..."   43 hours ago        Up 3 seconds      443/tcp, 127.0.0.1:8080->80/tcp   nginx

در سناریوهای پیاده‌سازی داکر بیشتر در این خصوص باهم صحبت خواهیم کرد.

داکر و iptables:

docker and iptables
docker and iptables

یک نکته‌ی مهم دیگه که خیلی باید به آن توجه ویژه‌ای داشت تعامل داکر با iptables است که سرویس داکر برای سهولت کار با آن دسترسی‌های مورد نیاز را روی سرویس iptables که فایروال لینوکس می‌باشد ایجاد می‌کند و برای این کار یک chain مخصوص برای خود ایجاد کرده و دسترسی‌های لازم را در آن قرار می‌دهد که ممکن است این موضوع با سیاست‌های امنیتی شما بر روی سرور متفاوت باشد از این رو باید همواره به این موضوع توجه ویژه‌ای داشته باشید. داکر به صورت پویا همواره با اضافه و کم شدن کانتینرها و سرویس‌ها و … بر روی iptables این دسترسی‌ها را ایجاد می‌کند.

نکته: در این سایت آموزش کامل لینوکس به زبان فارسی و البته کاربردی داده می‌شود که پیشنهاد می‌‌کنم حتما قسمت iptables آن را بررسی کنید تا با شناخت بیشتر این سرویس مهم و حیاتی بتوانید به خوبی از‌ آن استفاده کنید.

مرور برخی از قابلیت‌های مهم:

  • می‌توانید هر تعدادی کارت شبکه که نیاز دارید ایجاد کنید.
  • می‌توان کانتینر در حال کار را از شبکه‌ای جدا و به شبکه‌ی دیگری متصل کرد.
  • می‌توان یک کانتینر‌ را به تعدادی از شبکه‌ها متصل کنید.
  • می‌توانید هر شبکه‌ای که ایجاد می‌کنید طبق نیاز خودتون به صورت کامل پیکربندی کنید.
  • می‌توانید به هر کانتینر static ip بدهید.
  • با استفاده از آپشن link– می‌توانید بین کانتیرها ارتباط برقرار کرده به صورتی که آنها با اسم با یکدیگر ارتباط داشته باشند.
  • شما می‌توانید برای سرویس داکر و کانتینرها پروکسی تنظیم کنید و در صورت نیاز از آنها استفاده کنید.

برای داکر درایورهای مختلفی برای شبکه وجود دارد که در پست دیگری به تفصیل توضیح داده می‌شود.

منبع