داکر یک پلتفرم کانتینرسازی است که از مجازیسازی در سطح سیستم عامل برای بستهبندی برنامههای نرمافزاری و وابستگیهای آنها در واحدهای قابل استفاده مجدد به نام کانتینر استفاده میکند. کانتینرهای داکر را میتوان روی هر میزبانی که داکر یا یک کانتینر رانتایم معادل آن نصب شده است، چه به صورت محلی روی لپتاپ شما و چه در یک ابر از راه دور، اجرا کرد.
داکر شامل یک سیستم شبکه برای مدیریت ارتباطات بین کانتینرها، میزبان داکر شما و دنیای خارج است. انواع مختلف شبکه پشتیبانی میشوند که موارد استفاده رایج مختلفی را تسهیل میکنند.
در این مقاله، نحوه عملکرد شبکههای داکر را توضیح خواهیم داد، سپس اصول اولیه استفاده از آنها را با استقرار کانتینرهای شما پوشش خواهیم داد.
انواع شبکههای داکر
شبکههای داکر ارتباطات بین کانتینرهای همسایه و سرویسهای خارجی را پیکربندی میکنند. کانتینرها برای دریافت هرگونه اتصال شبکه باید به یک شبکه داکر متصل شوند. مسیرهای ارتباطی موجود برای کانتینر به اتصالات شبکهای که دارد بستگی دارد.
داکر با پنج درایور شبکه داخلی ارائه میشود که عملکرد اصلی شبکه را پیادهسازی میکنند:
- bridge
- host
- overlay
- IPvLAN
- macvlan
بیاید هر کدام را بررسی کنیم.
1. bridge
شبکههای bridge، یک پل نرمافزاری بین میزبان شما و کانتینر ایجاد میکنند. کانتینرهای متصل به شبکه میتوانند با یکدیگر ارتباط برقرار کنند، اما از کانتینرهای خارج از شبکه جدا هستند.
به هر کانتینر در شبکه آدرس IP مخصوص به خود اختصاص داده میشود. از آنجا که شبکه به میزبان شما متصل است، کانتینرها میتوانند در شبکه محلی (LAN) و اینترنت شما نیز ارتباط برقرار کنند. با این حال، آنها به عنوان دستگاههای فیزیکی در شبکه محلی شما ظاهر نمیشوند.
2. host
کانتینرهایی که از حالت شبکه host استفاده میکنند، استک شبکه host شما را بدون هیچ گونه جداسازی به اشتراک میگذارند. به آنها آدرس IP اختصاصی اختصاص داده نمیشود و پورتهای اتصال مستقیماً به رابط شبکه میزبان شما منتشر میشوند. این بدان معناست که یک فرآیند کانتینر که به پورت 80 گوش میدهد، به <your_host_ip>:80 متصل میشود.
3. overlay
شبکههای overlay، شبکههای توزیعشدهای هستند که چندین میزبان داکر را در بر میگیرند. این شبکه به تمام کانتینرهایی که روی هر یک از میزبانها اجرا میشوند، اجازه میدهد بدون نیاز به پشتیبانی مسیریابی در سطح سیستم عامل، با یکدیگر ارتباط برقرار کنند.
شبکههای overlay، شبکهسازی را برای خوشههای Docker Swarm پیادهسازی میکنند، اما میتوانید از آنها هنگام اجرای دو نمونه جداگانه از Docker Engine با کانتینرهایی که باید مستقیماً با یکدیگر در تماس باشند نیز استفاده کنید. این به شما امکان میدهد محیطهای Swarm مانند خود را بسازید.
4. ipvlan
IPvLAN یک درایور پیشرفته است که کنترل دقیقی بر آدرسهای IPv4 و IPv6 اختصاص داده شده به کانتینرهای شما، و همچنین برچسبگذاری و مسیریابی VLAN لایه 2 و 3 ارائه میدهد.
این درایور زمانی مفید است که سرویسهای کانتینری شده را با یک شبکه فیزیکی موجود ادغام میکنید. شبکههای IPvLAN رابطهای خود را اختصاص میدهند که مزایای عملکردی نسبت به شبکه مبتنی بر پل ارائه میدهد.
5. macvlan
macvlan یکی دیگر از گزینههای پیشرفته است که به کانتینرها اجازه میدهد به عنوان دستگاههای فیزیکی در شبکه شما ظاهر شوند. این کار با اختصاص یک آدرس MAC منحصر به فرد به هر کانتینر در شبکه انجام میشود.
این نوع شبکه مستلزم آن است که یکی از رابطهای فیزیکی میزبان خود را به شبکه مجازی اختصاص دهید. شبکه گستردهتر نیز باید به طور مناسب پیکربندی شود تا از تعداد بالقوه زیاد آدرسهای MAC که میتوانند توسط یک میزبان فعال Docker که کانتینرهای زیادی را اجرا میکند، ایجاد شوند، پشتیبانی کند.
از کدام نوع شبکه باید استفاده کنم؟
شبکههای bridge مناسبترین گزینه برای اکثر سناریوهایی هستند که با آنها مواجه خواهید شد. کانتینرهای موجود در شبکه میتوانند با استفاده از آدرسهای IP و DNS خود با یکدیگر ارتباط برقرار کنند. آنها همچنین به شبکه host شما دسترسی دارند، بنابراین میتوانند به اینترنت و شبکه محلی شما دسترسی پیدا کنند.
شبکههای host زمانی بهترین گزینه هستند که میخواهید پورتها را مستقیماً به رابطهای host خود متصل کنید و نگران ایزوله بودن شبکه نباشید. آنها به برنامههای کانتینری اجازه میدهند تا مشابه سرویسهای شبکهای که مستقیماً روی host شما اجرا میشوند، عمل کنند.
شبکههای overlay زمانی مورد نیاز هستند که کانتینرها روی میزبانهای مختلف داکر نیاز به ارتباط مستقیم با یکدیگر داشته باشند. این شبکهها به شما امکان میدهند محیطهای توزیعشده خود را برای دسترسی بالا تنظیم کنید.
شبکههای Macvlan در موقعیتهایی مفید هستند که کانتینرها باید به عنوان یک دستگاه فیزیکی در شبکه میزبان شما ظاهر شوند، مانند زمانی که برنامهای را اجرا میکنند که ترافیک شبکه را نظارت میکند.
شبکههای IPvLAN گزینهای پیشرفته برای زمانی هستند که نیازهای خاصی در مورد آدرسهای IP، تگ ها و روت های کانتینر دارید.
داکر همچنین از افزونههای شبکه شخص ثالث پشتیبانی میکند که سیستم شبکه را با حالتهای عملیاتی اضافی گسترش میدهند. این موارد شامل Kuryr میشود که شبکهسازی را با استفاده از OpenStack Neutron پیادهسازی میکند، و Weave، یک شبکه پوششی با تأکید بر کشف سرویس، امنیت و تحمل خطا.
در نهایت، شبکهسازی Docker همیشه در سطح کانتینر اختیاری است: تنظیم شبکه کانتینر روی none، استک شبکهسازی آن را به طور کامل غیرفعال میکند. کانتینر قادر به دسترسی به همسایگان خود، سرویسهای میزبان شما یا اینترنت نخواهد بود. این امر با sandboxing برنامههایی که انتظار نمیرود نیاز به اتصال داشته باشند، به بهبود امنیت کمک میکند.
نحوه کار شبکه داکر
داکر از استک شبکه میزبان شما برای پیادهسازی سیستم شبکه خود استفاده میکند. این سیستم با دستکاری قوانین iptables برای هدایت ترافیک به کانتینرهای شما کار میکند. این امر همچنین باعث جداسازی بین شبکههای داکر و میزبان شما میشود.
iptables ابزار استاندارد فیلترینگ پاکت های لینوکس است. قوانین اضافه شده به iptables نحوه هدایت ترافیک را هنگام عبور از استک شبکه میزبان شما تعریف میکنند. شبکههای داکر قوانین فیلترینگی را اضافه میکنند که ترافیک منطبق را به برنامه کانتینر شما هدایت میکنند. این قوانین به طور خودکار پیکربندی میشوند، بنابراین نیازی به تعامل دستی با iptables ندارید.
کانتینرهای داکر به فضای نام شبکه خود اختصاص داده شدهاند، یک ویژگی هسته لینوکس که محیطهای شبکه مجازی ایزوله را فراهم میکند. کانتینرها همچنین رابطهای شبکه مجازی را روی میزبان شما ایجاد میکنند که به آنها امکان میدهد با استفاده از شبکه میزبان شما، خارج از فضای نام خود ارتباط برقرار کنند.
جزئیات نحوه پیادهسازی شبکه داکر نسبتاً پیچیده و سطح پایین است. داکر آنها را از کاربران نهایی جدا میکند و یک تجربه شبکه کانتینر یکپارچه را ارائه میدهد که قابل پیشبینی و مؤثر است. با این حال، اطلاعات بیشتر در مستندات داکر موجود است.
همچنین بررسی کنید، Kubernetes چیست؟
شبکه Docker در مقابل شبکه VM
مدل شبکه Docker محیطهای مجازی ایزولهای را برای کانتینرها فراهم میکند. این شبکهها موارد استفاده رایج را برآورده میکنند، اما در مقایسه با شبکههای مجازی ایجاد شده توسط VMهای سنتی، تفاوتهای کلیدی دارند.
در حالی که Docker با استفاده از namespaceها و قوانین iptables به جداسازی شبکه دست مییابد، VMها معمولاً برای هر ماشین مجازی یک استک شبکه جداگانه اجرا میکنند. همچنین تفاوتهایی در اصطلاحات وجود دارد که میتواند باعث سردرگمی شود: آنچه Docker شبکه "bridge" مینامد، در اکثر راهحلهای VM مشابه یک شبکه مبتنی بر NAT است.
به طور کلی، VMها میتوانند طیف وسیعتری از توپولوژیهای شبکه را نسبت به آنچه Docker به طور بومی اجازه میدهد، پشتیبانی کنند. با این حال، Docker تمام ابزارهای لازم برای ایجاد راهحل شبکه مورد نیاز شما را شامل میشود، چه با استفاده از macvlan برای اختصاص آدرس کانتینرها در شبکه فیزیکی شما یا با استفاده از یک افزونه شخص ثالث برای پیادهسازی مدلهای شبکه از دست رفته.
استفاده از شبکههای داکر
آمادهاید تا شبکه داکر را بررسی کنید؟ در اینجا نحوه استفاده از شبکهها برای مدیریت ارتباطات کانتینر آمده است. برای دنبال کردن این آموزش، باید سه پنجره ترمینال باز کنید.
ایجاد شبکهها
برای ایجاد یک شبکه جدید، از دستور docker network create استفاده کنید. میتوانید با تنظیم فلگ d-، درایور مورد استفاده، مانند bridge یا host، را مشخص کنید. اگر فلگ را حذف کنید، یک شبکه bridge ایجاد میشود.
دستور زیر را در اولین پنجره ترمینال خود اجرا کنید:
1$ docker network create demo-network -d bridge 250ed05634f6a3312e56700ef683ca39df44bfc826e2e4da9179c2593c79910f9
شناسه شبکه ایجاد شده به ترمینال شما ارسال میشود. شبکه جدید در حال حاضر بیفایده است زیرا هیچ کانتینری متصل نشده است.
اتصال کانتینرها به شبکهها
میتوانید کانتینرهای جدید را با تنظیم فلگ network-- با دستور docker run خود به یک شبکه متصل کنید. این دستور را در پنجره ترمینال دوم خود اجرا کنید:
1$ docker run -it --rm --name container1 --network demo-network busybox:latest
سپس، پنجره ترمینال سوم خود را باز کنید و یک کانتینر اوبونتو دیگر را اجرا کنید، این بار بدون فلگ network--:
1$ docker run -it --rm --name container2 busybox:latest
حالا سعی کنید با استفاده از نام دو کانتینر، بین آنها ارتباط برقرار کنید:
1# in container1 2/ # ping container2 3ping: bad address 'container2'
کانتینرها هنوز در یک شبکه نیستند، بنابراین نمیتوانند مستقیماً با یکدیگر ارتباط برقرار کنند.
از اولین پنجره ترمینال خود برای اتصال کانتینر ۲ به شبکه استفاده کنید:
1$ docker network connect demo-network container2
کانتینرها اکنون یک شبکه را به اشتراک میگذارند که به آنها امکان میدهد یکدیگر را کشف کنند:
1# in container1 2/ # ping container2 3PING container2 (172.22.0.3): 56 data bytes 464 bytes from 172.22.0.3: seq=0 ttl=64 time=4.205 ms
استفاده از شبکه Host
شبکههای بریج (Bridge Networks) رایجترین روشهایی هستند که برای اتصال کانتینرهای خود استفاده خواهید کرد. بیایید قابلیتهای شبکههای host را نیز بررسی کنیم، جایی که کانتینرها مستقیماً به رابطهای میزبان شما متصل میشوند. میتوانید با اتصال یک کانتینر به شبکه host داخلی، شبکه host را برای آن فعال کنید:
1$ docker run -d --name nginx --network host nginx:latest
NGINX به طور پیشفرض به پورت 80 گوش میدهد. از آنجا که کانتینر از یک شبکه host استفاده میکند، میتوانید به سرور NGINX خود در localhost:80 میزبان خود در خارج از کانتینر دسترسی داشته باشید، حتی اگر هیچ پورتی به صراحت محدود نشده باشد:
1$ curl localhost:80 2<!DOCTYPE html> 3<html> 4<head> 5<title>Welcome to nginx!</title>
غیرفعال کردن شبکه
وقتی شبکه یک کانتینر غیرفعال شود، هیچ ارتباطی چه با سایر کانتینرها و چه با شبکه گستردهتر شما نخواهد داشت. با اتصال کانتینر خود به شبکه بدون اتصال، شبکه را غیرفعال کنید:
1$ docker run -it --rm --network none busybox:latest 2/ # ping google.com 3ping: bad address 'google.com'
این به شما امکان میدهد به راحتی سرویسهای ناشناخته را در سندباکس قرار دهید.
حذف کانتینرها از شبکهها
داکر به شما امکان میدهد بدون راهاندازی مجدد کانتینرها، اتصالات شبکه را آزادانه مدیریت کنید. در بخش قبلی، نحوه اتصال یک کانتینر پس از ایجاد آن را مشاهده کردید. همچنین میتوانید کانتینرها را از شبکههایی که دیگر نیازی به مشارکت در آنها ندارند، حذف کنید:
1$ docker network disconnect demo-network container2
هر تغییری که ایجاد کنید بلافاصله اعمال خواهد شد.
بهترین جایگزین Postman کدام است؟
مدیریت شبکهها
شما میتوانید تمام شبکههای داکر خود را با دستور network ls لیست کنید:
1$ docker network ls 2NETWORK ID NAME DRIVER SCOPE 344edcc537a6f bridge bridge local 42cf9f8f370ad demo-network bridge local 54d60b27f787a host host local 6288376a0a4f8 none null local
خروجی شامل شبکههای داخلی، bridge، هاست و none و همچنین شبکههایی است که شما ایجاد کردهاید.
برای حذف یک شبکه، تمام کانتینرهای داکر که از آن استفاده میکنند را جدا یا متوقف کنید، سپس شناسه یا نام شبکه را به network rm ارسال کنید:
1$ docker network rm demo-network
شما میتوانید با استفاده از دستور network prune تمام شبکههای بلااستفاده را به طور خودکار حذف کنید:
1$ docker network prune
استفاده از شبکهها با Docker Compose
شما میتوانید از شبکهها با سرویسهای Docker Compose نیز استفاده کنید. اغلب میتوان هنگام استفاده از Compose از پیکربندی دستی شبکه اجتناب کرد، زیرا سرویسهای موجود در استک شما به طور خودکار به یک شبکه bridge مشترک اضافه میشوند:
1version: "3" 2services: 3 app: 4 image: php:7.2-apache 5 mysql: 6 image: mysql:8.0 7 environment: 8 MYSQL_ROOT_PASSWORD=changeme
برای استقرار استک از Compose استفاده کنید:
1$ docker compose up -d 2[+] Running 3/3 3 ✔ Network introduction-to-docker-networking_default Created 0.1s 4 ✔ Container introduction-to-docker-networking-mysql-1 Started 3.7s 5 ✔ Container introduction-to-docker-networking-app-1 Started 3.7s
همانطور که در خروجی زیر نشان داده شده است، Compose شبکهای برای استک شما ایجاد کرده است که شامل هر دو کانتینر میشود:
1$ docker network ls 2NETWORK ID NAME DRIVER SCOPE 344edcc537a6f bridge bridge local 44d60b27f787a host host local 5358610a7ea97 introduction-to-docker-networking_default bridge local 6288376a0a4f8 none
این یعنی کانتینر برنامه شما میتواند مستقیماً با کانتینر دیتابیس mysql همسایه ارتباط برقرار کند:
1$ docker compose exec -it app bash 2root@d7c97936ad48:/var/www/html# apt update && apt install iputils-ping -y 3root@d7c97936ad48:/var/www/html# ping mysql 4PING mysql (172.23.0.3) 56(84) bytes of data. 564 bytes from introduction-to-docker-networking-mysql-1 6.introduction-to-docker-networking_default 7 (172.23.0.3): icmp_seq=1 ttl=64 time=0.493 ms
اصول داکر: آشنایی با داکر فایل
افزودن شبکههای اضافی
شما میتوانید شبکههای اضافی را در فایل Compose خود تعریف کنید. نام شبکه را در فیلد شبکههای سطح بالا وارد کنید، سپس سرویسهای خود را با ارجاع به شبکه در فیلد شبکههای سطح سرویس متصل کنید:
1version: "3" 2services: 3 app: 4 image: php:7.2-apache 5 networks: 6 - db 7 helper: 8 image: custom-image:latest 9 mysql: 10 image: mysql:8.0 11 environment: 12 MYSQL_ROOT_PASSWORD=changeme 13 networks: 14 - db 15networks: 16 db:
این مثال، رفتار شبکه پیشفرض سطح استک را نادیده میگیرد. اکنون، فقط سرویس app میتواند با mysql ارتباط برقرار کند. helper قادر به دسترسی به پایگاه داده نیست زیرا این دو سرویس شبکه مشترکی ندارند.
زبان برنامه نویسی گو یا گولنگ چیست؟ بررسی تخصصی
نتیجه
سیستم شبکه Docker گزینههای انعطافپذیری برای مدیریت ارتباط بین کانتینرها، همسایگان آنها و میزبان Docker شما ارائه میدهد. کانتینرهای درون یک شبکه میتوانند با نام یا آدرس IP به یکدیگر دسترسی پیدا کنند.
شبکهسازی توسط مجموعهای از درایورهای قابل اتصال پیادهسازی میشود که رایجترین موارد استفاده را در خود جای میدهند. شبکهها به استک شبکه میزبان شما متکی هستند، اما با استفاده از فضاهای نام (namespaces) ایزوله شدهاند. این جداسازی ضعیفتر از مدل شبکهسازی مجازی مورد استفاده توسط ماشینهای مجازی است، اگرچه کانتینرها همچنان میتوانند هنگام اتصال آنها به یک شبکه macvlan به عنوان دستگاههای شبکه فیزیکی ظاهر شوند.
