Docker به‌طور پیش فرض دارای سه درایور شبکه است. آداپتورهای شبکه نیز با استفاده از این درایورها (دقیقاً با همان نام) راه‌اندازی می‌شوند. به عنوان مثال، اگر docker network ls را اجرا کنید، شبکه‌ای به نام Bridge را مشاهده خواهید کرد؛ این درایور از درایور شبکه Bridge  استفاده می‌کند. این، همان شبکه پیش فرضی است که هر containerای سعی می‌کند به آن متصل شود؛ مگر اینکه به گونه دیگری مشخص شده باشد.

با این حال، درایورهای دیگری نیز در دسترس هستند؛ مانند درایورهای macvlan و Overlay، که در ادامه به شرح آن‌ها پرداخته شده است. در این مقاله، کاربردهای درایور Overlay، نحوه ایجاد آن و نحوه اتصال با container بیان شده است.

 

 

درایور Overlay چیست؟

درایور Overlay به منظور تسهیل ارتباط بین کانتینرهای dockerای طراحی شده است که در شبکه‌های کاملاً متفاوت قرار دارند. این شبکه‌ها می‌توانند شبکه‌های خصوصی یا حتی زیرساخت‌های عمومی در Cloud باشند. نکته اساسی این است که اگر دو میزبان وجود داشته باشد که هر کدام Docker را اجرا می‌کنند، شبکه Overlay به ایجاد یک زیر شبکه‌ای کمک می‌کند که برروی این دو میزبان قرار گرفته است و هر کانتینر Docker متصل به این شبکه overlay می‌تواند با هر container دیگر با استفاده بلاک آدرس IP، زیرشبکه و gateway پیش فرض خودشان ارتباط برقرار کند. بطوریکه گویی آن‌ها بخشی از یک شبکه هستند.

همانطور که در زیر نشان داده شده است:

 

دو ماشین مجازی که برروی آن docker را اجرا کرده‌اند، کانتینرهای متصل به شبکه overlay را دارا هستند. شبکه overlay در بالای ماشین مجازی "پوشانده شده" است و کانتینرها صرف نظر از ماشین‌های مجازی میزبان یا پیکربندی شبکه‌های آن‌ها، آدرس‌های IP مشابه 10.0.0.2، 10.0.0.3 و غیره را در این شبکه دریافت می‌کنند.

به منظور دنبال کردن این آموزش باید دو میزبان لینوکس داشته باشید و برروی آن‌ها Docker را اجرا نمایید. شما می‌توانید دو ماشین مجازی مختلف بصورت محلی اجرا کنید، یا از دو VPS با IP‌های ثابت استفاده کنید. برای تهیه VPS کافی هست تا به این صفحه مراجعه بفرمایید: خرید سرور مجازی

 

راه‌اندازی Docker Swarm

نوع تنظیماتی که در بالا توضیح داده شد، برای سناریویی نیست که در آن، Docker بر روی یک میزبان اجرا می‌شود. برای چنین مواقعی، ما به Docker Swarm نیاز داریم که در آن شبکه‌های Overlay واقعاً کار می‌کنند. در اینجا به جزئیات Docker Swarm پرداخته نشده است، بلکه بیشتر جزئیات Overlay شرح داده شده است.

فرض کنید دو VPS برروی DigitalOcean یا جی سرور با آدرس IP عمومی داریم که یکی از آن‌ها Docker Swarm Manager است و node دیگر قرار است یک worker node باشد. این، مدل اصلی برای سیستم‌های توزیع شده مانند Docker Swarm است.

 

ابتدا در نود  Manager، باید Docker Swarm را به صورت زیر راه‌اندازی نمایید:

root@manager:~# docker swarm init

در صورت اختصاص چندین آدرس IP به یک رابط شبکه، ممکن است مجبور باشید که مشخص نمایید از کدام آدرس IP استفاده می‌کنید. اگر دستور قبلی خطایی را ارائه می‌کند که نشان می‌دهد، از IP‌های متعددی استفاده شده است، از دستور زیر استفاده کنید:

root@manager:~# docker swarm init --advertise-addr IP_ADDRESS

توجه به این نکته ضروری است که IP_ADDRESS بالا، IP میزبان Swarm Manager شما است. در اینجا، مقدار آن 165.227.170.190 خواهد بود.

 

این دستور، یک توکن احراز هویت ایجاد می‌کند و شما می‌توانید آن دستور را در ترمینال نود worker خود کپی و جایگذاری نمایید تا آن را به یکی از اعضای Docker Swarm شما تبدیل کند:

root@workernode:~#  docker swarm join --token SWMTKN-1-2nzu4e7hesie4xqhsuy1ip1dn8dg70b9iqs0v
tm5fovjh50cmk-2rmfrdqup4vaujxnrpj4mmtn9 165.227.170.190:2377

توکن شما قطعاً با آنچه در بالا آمده است، باید کاملاً متفاوت باشد. بنابراین دستور ایجاد شده پس از دستور docker swarm init را کپی کنید، نه آنچه در بالا نشان داده شده است.

به منظور تأیید اینکه worker به درستی اضافه شده است، دستور زیر را برروی Docker manager خود اجرا نمایید:

root@manager:~# docker node ls

خروجی چیزی شبیه به زیر خواهد بود:

 

ایجاد شبکه Overlay با افزودن container

اکنون می‌توانید از درایور overlay داخلی Docker برای ایجاد شبکه استفاده کنید. شما می‌توانید این شبکه را با هر نامی ایجاد نمایید، در اینجا، آن را my-overlay نامیده‌ایم.

root@manager:~# docker create network  --driver overlay my-overlay

اگرچه شما می‌توانید کانتینرها را مستقیماً به این شبکه وصل کنید، ولیکن این چیزی نیست که به طور پیش فرض مجاز باشد؛ زیرا سرویس‌ها (که موجودیت دیگری از Docker Swarm) هستند که معمولاً با این شبکه ارتباط برقرار می‌کنند و کانتینرها تنها سرویس‌ها را تشکیل می‌دهند.

با اجرای دستور docker network ls، لیست شبکه‌های docker را بررسی نمایید. در خروجی شما باید یک مقدار برای my-overlay مشاهده کنید (با محدوده تنظیم شده برای swarm).

به منظور اتصال contaunerها، به عنوان بخشی از یک سرویس، دستور زیر را اجرا کنید:

root@manager:~# docker service create --name my-service --network my-overlay
--replicas 2 alpine sleep 1d

 

با این کار، 2 نسخه از کانتینر Alpine Linux (که یک container لینوکس بسیار سبک است) ایجاد می‌شود. در ادامه، مشاهده خواهید کرد که چگونه این کانتینرها بین دو node ما توزیع می‌شوند.

root@manager:~# docker service ps my-service
root@workernode:~# docker service ps my-service

خروجی نشان می‌دهد که هر کدام از کانتینرهای این سرویس در کجا اجرا می‌شوند:

ID                NAME                IMAGE               NODE

mlnm3xbv1m3x      my-service.1        alpine:latest       manager

ms9utjyqmqa7      my-service.2        alpine:latest       workernode

همانطور که مشاهده می‌کنید، نیمی از containerها برروی manager و بقیه در worker node اجرا هستند. این ایده پشت سیستم توزیع شده است. بطوریکه حتی اگر یک node خراب شود، بار اضافی به دیگری منتقل می‌شود.

 

تأیید IPهای شبکه

شما می‌توانید دستور زیر را هم در manager node و هم در worker node اجرا کنید:

root@manager:~# docker inspect my-overlay
root@workernode:~# docker inspect my-overlay

در هر دو مورد یک پاسخ طولانی JSON دریافت خواهید کرد. در هر دو مورد به دنبال بخش container باشید. تصویر زیر، خروجی ما برروی نود manager است:

 

آدرس IP یک container در حال اجرا در نود Manager برابر با 10.0.0.11 است.

آدرس IP دومین نسخه در نود Worker برابر با  10.0.0.12است.

 

اکنون باید امتحان کنید که آیا می‌توانید اولین کانتینر (با آدرس 10.0.0.11) را از کانتینر دوم (با آدرس 10.0.0.12) ping نمایید.

شناسه کانتینر دوم را (که روی workernode اجرا می‌شود) با دستور زیر دریافت کنید:

root@workernode:~# docker ps

شناسه را کپی نمایید (فعلاً آن را CONTAINER2 در نظر می‌گیریم).

با اجرای دستور زیر، وارد پوسته (shell) این کانتینر دوم شوید:

root@workernode:~# docker exec -it CONTAINER2 sh

بخش "CONTAINER2" را با شناسه مناسب که در مرحله قبل به دست آمده جایگزین کنید. پس از اجرا، متوجه خواهید شد که ترمینال از "root@..." به "#" تغییر کرده است.

در این پوسته، container دیگری که روی میزبان متفاوت و در یک شبکه فیزیکی دیگر اجرا می‌شود، ping کنید.

# ping 10.0.0.11

 

 

 

منبع:

linuxhint