داکر پلتفرم کانتِینرسازی است که با استفاده از مجازیسازی در سطح سیستمعامل، نرمافزارها و وابستگیهای آنها را در واحدهای قابل استفاده مجدد به نام «کانتِینر» بستهبندی میکند. داکر شامل سیستم شبکه برای مدیریت ارتباطات بین کانتینرها، میزبان داکر و دنیای خارج است. این سیستم از چندین نوع شبکه مختلف پشتیبانی میکند که امکان استفاده در موارد متنوع را فراهم میآورد. در این نوشته، نحوهی عملکرد شبکههای داکر را توضیح خواهیم داد و سپس اصول اولیهی شبکه در داکر را در پیادهسازیهای کانتِینری بررسی خواهیم کرد.
انواع شبکه در داکر چیست؟
شبکههای داکر، ارتباطات بین کانتینرهای مجاور و سرویسهای خارجی را پیکربندی میکنند. برای برقراری هرگونه اتصال شبکه، کانتینرها باید به یک شبکه داکر متصل شوند. مسیرهای ارتباطی در دسترس هر کانتینر، به اتصالات شبکهای آن بستگی دارد. داکر بهطور پیشفرض دارای ۵ درایور (قالب) شبکه داخلی است که قابلیتهای اصلی شبکه را پیادهسازی میکنند:
- پُل (bridge)
- میزبان (host)
- همپوشان (overlay)
- آیپیویلن (IPvLAN)
- مکولن (macvlan)
حالا در ادامه در خصوص هر کدام از این قالبها یا همان درایورها توضیحات بیشتری را ارائه میدهیم.
شبکههای bridge در داکر
شبکههای پُل، ارتباط نرمافزاری بین سیستم میزبان و کانتینر را ایجاد میکنند. کانتینرهایی که به این شبکه متصل هستند، میتوانند با یکدیگر ارتباط برقرار کنند، اما از کانتینرهای خارج از این شبکه جدا و ایزوله هستند. به هر کانتینر در این شبکه، یک آدرس آیپی اختصاصی داده میشود. از آنجا که این شبکه بهصورت پل با سیستم میزبان شما مرتبط است، کانتینرها میتوانند با شبکه محلی (LAN) و اینترنت نیز ارتباط برقرار کنند.
با این حال، این کانتینرها بهعنوان دستگاههای فیزیکی در شبکه محلی شما ظاهر نمیشوند. این نوع شبکه، انتخاب پیشفرض و مناسبی برای اکثر کاربردهای معمول داکر است. شبکه پل در عین حال که لایه ایزولهسازی برای امنیت بیشتر ایجاد میکند، امکان ارتباط بین کانتینرها و دسترسی به اینترنت را فراهم میسازد.
شبکه میزبان در داکر
کانتینرهایی که از حالت شبکهی میزبان استفاده میکنند، بدون هیچگونه جداسازی، شبکهی سیستم میزبان را به اشتراک میگذارند. به این کانتینرها آدرس آیپی مجزا اختصاص داده نمیشود و پورتهای آنها مستقیماً روی رابط شبکهی سیستم میزبان منتشر میشوند. به عبارت دیگر، اگر فرآیندی در کانتینر به پورت ۸۰ گوش دهد، این پورت مستقیماً به آدرس <your_host_ip>:80
متصل میشود.
شبکه همپوشان در داکر
شبکههای همپوشان، شبکههای توزیعشدهای هستند که چندین میزبان داکر را پوشش میدهند. این نوع شبکه به تمام کانتینرهایی که روی هر یک از این میزبانها اجرا میشوند، اجازه میدهد بدون نیاز به پشتیبانی مسیریابی در سطح سیستمعامل، با یکدیگر ارتباط برقرار کنند.
شبکههای همپوشان، زیرساخت ارتباطی را برای خوشههای Docker Swarm فراهم میکنند. با این حال، میتوانید از آنها در مواردی که ۲ نمونهی جداگانه از موتور داکر را اجرا میکنید و کانتینرهای آنها نیاز به ارتباط مستقیم با یکدیگر دارند نیز استفاده کنید. این قابلیت به شما امکان میدهد محیطهایی شبیه به Swarm را برای خود ایجاد کنید.
این نوع شبکه برای سناریوهایی مناسب است که نیاز دارید کانتینرهای شما در چندین سرور مختلف با یکدیگر ارتباط داشته باشند، مانند اپلیکیشنهای توزیعشده یا میکروسرویسها. شبکه همپوشان، پیچیدگیهای مدیریت ارتباطات بین سرورها را از بین میبرد و یک لایهی ارتباطی یکپارچه برای تمام کانتینرها فراهم میکند.
شبکه ipvlan
آیپیویلن درایور پیشرفتهای است که کنترل دقیقی بر آدرسهای IPv4 و IPv6 اختصاص داده شده به کانتینرهای شما فراهم میکند. علاوه بر این، امکان برچسبگذاری و مسیریابی VLAN در لایههای ۲ و ۳ را نیز ارائه میدهد.
این درایور زمانی مفید است که میخواهید سرویسهای کانتینری را با یک شبکهی فیزیکی موجود یکپارچه کنید. شبکههای ipvlan دارای رابطهای شبکهی اختصاصی هستند که مزایای عملکردی بیشتری نسبت به شبکهسازی مبتنی بر پل (bridge) ارائه میدهند.
استفاده از این نوع شبکه برای سناریوهایی مناسب است که نیاز به کنترل دقیقتر بر آدرسدهی و مدیریت ترافیک شبکه دارید. به عنوان مثال، در محیطهای سازمانی که نیاز به یکپارچگی بیشتر با زیرساختهای شبکه موجود دارند یا در مواردی که نیاز به عملکرد بالاتر و تأخیر کمتر در ارتباطات شبکه وجود دارد، ipvlan میتواند گزینهی مناسبی باشد.
شبکه macvlan
macvlan گزینهی پیشرفتهی دیگری است که به کانتینرها اجازه میدهد به عنوان دستگاههای فیزیکی در شبکه شما ظاهر شوند. این کار با اختصاص یک مک آدرس منحصر به فرد به هر کانتینر در شبکه انجام میشود.
این نوع شبکه نیاز دارد که شما یکی از رابطهای فیزیکی سیستم میزبان خود را به شبکهی مجازی اختصاص دهید. همچنین، شبکه گستردهتر باید بهطور مناسب پیکربندی شود تا از تعداد زیاد آدرسهای MAC پشتیبانی کند که ممکن است توسط یک میزبان داکر فعال با کانتینرهای متعدد ایجاد شود.
استفاده از macvlan برای مواردی مناسب است که میخواهید کانتینرها دقیقاً مانند دستگاههای فیزیکی در شبکه شما رفتار کنند. این میتواند در محیطهایی که نیاز به یکپارچگی عمیق با زیرساختهای شبکه موجود دارند، مفید باشد. با این حال، باید توجه داشت که پیکربندی و مدیریت این نوع شبکه پیچیدهتر است و نیاز به دانش عمیقتری از مفاهیم شبکه وجود دارد.
کدام شبکه در داکر را انتخاب کنیم؟
شبکههای پل (Bridge) برای اکثر سناریوهایی که با آنها روبرو میشوید، مناسبترین گزینه هستند. کانتینرها در این شبکه میتوانند با استفاده از آدرسهای IP و نامهای DNS خود با یکدیگر ارتباط برقرار کنند. همچنین به شبکهی سیستم میزبان شما دسترسی دارند، بنابراین میتوانند به اینترنت و شبکهی محلی شما متصل شوند.
شبکههای میزبان (Host) زمانی بهترین گزینه هستند که میخواهید پورتها را مستقیماً به رابطهای سیستم میزبان خود متصل کنید و نگران جداسازی شبکه نیستید. آنها به برنامههای کانتِینری اجازه میدهند تا مشابه سرویسهای شبکهای که مستقیماً روی سیستم میزبان شما اجرا میشوند، عمل کنند.
شبکههای همپوشان (Overlay) زمانی مورد نیاز هستند که کانتینرها روی میزبانهای داکر مختلف نیاز به ارتباط مستقیم با یکدیگر دارند. این شبکهها به شما امکان میدهند محیطهای توزیعشدهی خود را برای دسترسیپذیری بالا راهاندازی کنید.
شبکههای Macvlan در مواردی مفید هستند که کانتینرها باید به عنوان یک دستگاه فیزیکی در شبکهی میزبان شما ظاهر شوند، مانند زمانی که برنامهای را اجرا میکنند که ترافیک شبکه را نظارت میکند. شبکههای IPvLAN گزینه پیشرفتهای برای زمانی هستند که نیازهای خاصی در مورد آدرسهای IP، برچسبها و مسیریابی کانتینرها دارید.
داکر همچنین از پلاگینهای شبکهی شخص ثالث پشتیبانی میکند که سیستم شبکه را با حالتهای عملیاتی اضافی گسترش میدهند. این موارد شامل Kuryr، که شبکهسازی را با استفاده از OpenStack Neutron پیادهسازی میکند، و Weave، یک شبکهی همپوشان با تأکید بر کشف سرویس، امنیت و تحمل خطا، میشوند.
در نهایت، «شبکهسازی داکر» (Docker networking) همیشه در سطح کانتینر اختیاری است: تنظیم شبکه یک کانتینر روی none
به طور کامل پشته شبکه آن را غیرفعال میکند. کانتینر قادر نخواهد بود به همسایگان خود، سرویسهای سیستم میزبان یا اینترنت دسترسی پیدا کند. این امر به بهبود امنیت از طریق محدودسازی برنامههایی که انتظار نمیرود به اتصال نیاز داشته باشند، کمک میکند.
شبکه در داکر چطور کار میکند؟
داکر از پشتهی شبکهی سیستم میزبان شما برای پیادهسازی سیستم شبکهی خود استفاده میکند. این کار با دستکاری قوانین iptables برای هدایت ترافیک به کانتینرهای شما انجام میشود. این روش همچنین جداسازی بین شبکههای داکر و سیستم میزبان را فراهم میکند.
iptables ابزار استاندارد فیلترینگ بستهها در لینوکس است. قوانین اضافه شده به iptables تعیین میکنند که چگونه ترافیک هنگام عبور از پشتهی شبکهی سیستم میزبان شما مسیریابی شود. شبکههای داکر قوانین فیلترینگ را اضافه میکنند که ترافیک مطابق را به برنامه کانتینر شما هدایت میکنند. این قوانین به طور خودکار پیکربندی میشوند، بنابراین نیازی نیست شما به طور دستی با iptables تعامل داشته باشید.
به کانتینرهای داکر یک فضای نام شبکهی اختصاصی تخصیص داده میشود که ویژگی هسته لینوکس به حساب میآید و محیطهای شبکه مجازی ایزوله شده را فراهم میکند. کانتینرها همچنین رابطهای شبکهی مجازی روی سیستم میزبان شما ایجاد میکنند که به آنها اجازه میدهد با استفاده از شبکه سیستم میزبان، خارج از فضای نام خود ارتباط برقرار کنند.
جزئیات نحوه پیادهسازی شبکهسازی داکر نسبتاً پیچیده و در سطح پایین است. داکر این پیچیدگیها را از کاربران نهایی پنهان میکند و تجربه شبکهسازی کانتینری یکپارچه، قابل پیشبینی و مؤثری ارائه میدهد. با این حال، اطلاعات بیشتر در مستندات داکر در دسترس است.
این سیستم شبکهسازی پیچیده به شما امکان میدهد تا کانتینرها را به راحتی و با کارایی بالا در محیطهای مختلف اجرا کنید، بدون اینکه نگران جزئیات فنی زیرساخت شبکه باشید.
مقایسه Docker Networking با VM Networking
مدل شبکهسازی داکر، محیطهای مجازی ایزوله شده را برای کانتینرها فراهم میکند. این شبکهها نیازهای رایج را برآورده میکنند، اما تفاوتهای کلیدی با شبکههای مجازی ایجاد شده توسط ماشینهای مجازی سُنتی دارند.
در حالی که داکر با استفاده از فضاهای نام و قوانین iptables به ایزولهسازی شبکه دست مییابد، ماشینهای مجازی معمولاً پشته شبکه جداگانهای را برای هر ماشین مجازی اجرا میکنند. همچنین تفاوتهایی در اصطلاحات وجود دارد که میتواند باعث سردرگمی شود: آنچه داکر یک شبکهی «پل» (bridge) مینامد، مشابه یک شبکهی مبتنی بر NAT در اکثر راهکارهای ماشین مجازی است.
به طور کلی، ماشینهای مجازی میتوانند طیف گستردهتری از توپولوژیهای شبکه را نسبت به آنچه داکر به طور پیشفرض اجازه میدهد، پشتیبانی کنند. با این حال، داکر تمام ابزارهای لازم برای ایجاد راهکار شبکهی مورد نیاز شما را شامل میشود، خواه با استفاده از macvlan برای اختصاص آدرسها به کانتینرها در شبکهی فیزیکی شما، یا با استفاده از یک پلاگین شخص ثالث برای پیادهسازی مدلهای شبکهی از دست رفته.
این تفاوتها به این معنا است که در حالی که داکر برای بسیاری از کاربردها سادهتر و کارآمدتر است، ماشینهای مجازی ممکن است برای برخی سناریوهای پیچیدهتر شبکه مناسبتر باشند. با این حال، انعطافپذیری داکر به شما امکان میدهد تا در صورت نیاز، تقریباً هر نوع پیکربندی شبکهای را پیادهسازی کنید.
استفاده از شبکههای داکر
در اینجا نحوهی استفاده از شبکهها برای مدیریت ارتباطات کانتینر را توضیح میدهیم. برای همراهی با این آموزش، شما به ۳ پنجرهی ترمینال نیاز خواهید داشت.
ایجاد شبکه در داکر
برای ایجاد شبکه جدید در داکر، از دستور docker network create
استفاده کنید. میتوانید با تنظیم پرچم -d
، درایور مورد نظر مانند bridge
یا host
را مشخص کنید. اگر این پرچم را حذف کنید، یک شبکه bridge
ایجاد خواهد شد. دستور زیر را در اولین پنجرهی ترمینال خود اجرا کنید:
$ docker network create demo-network -d bridge
50ed05634f6a3312e56700ef683ca39df44bfc826e2e4da9179c2593c79910f9
شناسه شبکه ایجاد شده در ترمینال شما نمایش داده میشود. در حال حاضر، شبکه جدید بیاستفاده خواهد بود، زیرا هیچ کانتینری به آن متصل نشده است.
اتصال کانتینرها به شبکهها در داکر
میتوانید کانتینرهای جدید را با تنظیم پرچم --network
در دستور docker run
به یک شبکه متصل کنید. این دستور را در پنجرهی دوم ترمینال خود اجرا کنید:
$ docker run -it --rm --name container1 --network demo-network busybox:latest
سپس، پنجرهی سوم ترمینال خود را باز کنید و یک کانتینر busybox دیگر را اجرا کنید، این بار بدون پرچم --network
:
$ docker run -it --rm --name container2 busybox:latest
حالا سعی کنید با استفاده از نامهایشان بین دو کانتینر ارتباط برقرار کنید:
# در container1
/ # ping container2
ping: bad address 'container2'
کانتینرها هنوز در یک شبکه مشترک نیستند، بنابراین نمیتوانند مستقیماً با یکدیگر ارتباط برقرار کنند. از پنجرهی اول ترمینال خود استفاده کنید تا container2
را به شبکه متصل کنید:
$ docker network connect demo-network container2
اکنون کانتینرها یک شبکه را به اشتراک میگذارند، که به آنها اجازه میدهد یکدیگر را پیدا کنند:
# در container1
/ # ping container2
PING container2 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=4.205 ms
استفاده از روش شبکه میزبان در داکر
شبکههای پل (bridge) رایجترین نوع شبکه برای اتصال کانتینرهای شما هستند. حال بیایید قابلیتهای شبکههای میزبان را نیز بررسی کنیم، جایی که کانتینرها مستقیماً به رابطهای سیستم میزبان شما متصل میشوند. میتوانید شبکهسازی میزبان را برای یک کانتینر با اتصال آن به شبکه داخلی host فعال کنید:
$ docker run -d --name nginx --network host nginx:latest
NGINX به طور پیشفرض روی پورت 80 گوش میدهد. از آنجا که کانتینر از یک شبکهی میزبان استفاده میکند، میتوانید به سرور NGINX خود روی localhost:80
سیستم میزبان خارج از کانتینر دسترسی پیدا کنید، حتی بدون اینکه هیچ پورتی به طور صریح متصل شده باشد:
$ curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
غیرفعال کردن نتورکینگ در داکر
زمانی که شبکه یک کانتینر غیرفعال شود، هیچ اتصالی در دسترس نخواهد بود، نه به کانتینرهای دیگر و نه به شبکهی گستردهتر شما. برای غیرفعال کردن شبکه، کانتینر خود را به شبکه none
متصل کنید:
$ docker run -it --rm --network none busybox:latest
/ # ping google.com
ping: bad address 'google.com'
این امکان به شما اجازه میدهد به راحتی سرویسهای ناشناخته را ایزوله کنید.
حذف کانتینرها از شبکه
داکر به شما اجازه میدهد بدون راهاندازی مجدد کانتینرها، اتصالات شبکه را آزادانه مدیریت کنید. در بخش قبلی، دیدید که چگونه میتوان یک کانتینر را پس از ایجاد آن به شبکه متصل کرد؛ همچنین امکان حذف کانتینرها از شبکههایی که دیگر نیازی به مشارکت در آنها ندارند نیز وجود دارد:
$ docker network disconnect demo-network container2
هر تغییری که ایجاد کنید، بلافاصله اعمال خواهد شد.
مدیریت شبکههای داکر
میتوانید با استفاده از دستور network ls تمام شبکههای داکر خود را فهرست کنید:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
44edcc537a6f bridge bridge local
2cf9f8f370ad demo-network bridge local
4d60b27f787a host host local
288376a0a4f8 none null local
خروجی این دستور شامل شبکههای پیشفرض «bridge»، «host» و «none»، و همچنین شبکههایی است که خودتان ایجاد کردهاید. برای حذف یک شبکه، ابتدا باید تمام کانتینرهای داکر که از آن استفاده میکنند را قطع یا متوقف کنید. سپس شناسه یا نام شبکه را به دستور network rm
بدهید:
$ docker network rm demo-network
برای حذف خودکار تمام شبکههای بلااستفاده، میتوانید از دستور network prune استفاده کنید:
$ docker network prune
جمعبندی
شبکه در داکر یکی از مهمترین جنبههای این پلتفرم است که امکان ارتباط موثر و ایمن بین کانتینرها را فراهم میکند. داکر پنج نوع اصلی شبکه شامل bridge ،host ،overlay ،IPvLAN و macvlan را ارائه میدهد که هر کدام برای سناریوهای خاصی مناسب هستند. شبکه bridge به عنوان گزینه پیشفرض، برای اکثر کاربردها کافی است.
سیستم شبکهسازی داکر با استفاده از قابلیتهای هسته لینوکس مانند فضاهای نام و iptables پیادهسازی شده و به کاربران امکان میدهد بدون درگیر شدن با جزئیات پیچیده، به راحتی کانتینرها را مدیریت کنند. درک صحیح و استفاده مناسب از قابلیتهای شبکهسازی داکر میتواند به بهبود امنیت، کارایی و مقیاسپذیری برنامههای کانتینری کمک شایانی کند.