راهنمای جامع شبکه و پیکربندی پورت‌ ها در Docker


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

مقدمه‌ای بر شبکه و پورت ها در Docker

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

مطلب مفید: کانتینر چیست؟

انواع شبکه‌ها در Docker

Docker به صورت پیش‌فرض چندین نوع شبکه ارائه می‌دهد که هرکدام برای سناریوهای مختلف مناسب هستند. شبکه‌های پیش‌فرض شامل Bridge ،Host، و None هستند. علاوه بر این، امکان ایجاد شبکه‌های سفارشی نیز وجود دارد تا بتوانید پیکربندی‌های پیچیده‌تر و منعطف‌تری را متناسب با نیازهای خود پیاده‌سازی کنید. در ادامه، به بررسی این انواع شبکه‌ها و کاربرد آن‌ها نیز خواهیم پرداخت.

شبکه‌های پیش‌فرض در Docker

در این بخش، به بررسی انواع شبکه‌های پیش‌فرض Docker شامل Bridge ،Host و None می‌پردازیم و نحوه عملکرد هرکدام را توضیح می‌دهیم.

۱. Bridge Network چیست؟

Bridge network رایج‌ترین و پیش‌فرض‌ترین نوع شبکه در Docker است. زمانی که یک کانتینر جدید ایجاد می‌کنید، اگر شبکه‌ای مشخص نکنید، Docker به‌طور خودکار آن را به یک شبکه Bridge متصل می‌کند. این نوع شبکه مانند یک سوییچ مجازی عمل کرده و ارتباط بین کانتینرهای موجود در همان شبکه را فراهم می‌کند. همچنین از طریق تکنیک Port Mapping می‌توانید پورت‌های مشخصی از سیستم میزبان را به کانتینرها متصل کنید تا کانتینرها از خارج از میزبان نیز در دسترس باشند.

ویژگی‌های کلیدی Bridge Network:

  • کانتینرها می‌توانند با یکدیگر ارتباط برقرار کنند.
  • سیستم میزبان نمی‌تواند به کانتینرها دسترسی مستقیم داشته‌باشد، مگر این‌که پورت‌ها به‌صورت دستی مپ شده‌باشند.
  • مناسب برای محیط‌های تست و توسعه که نیاز به ایزوله‌سازی شبکه‌ای دارند.
شبکه‌های پیش‌فرض در داکر Docker

۲. Host Network چیست و چه کاربردی دارد؟

Host network به کانتینرها اجازه می‌دهد تا مستقیماً از شبکه سیستم میزبان استفاده کنند. در این حالت، کانتینر به‌جای داشتن یک آدرس IP مجزا، از IP و پورت‌های سیستم میزبان استفاده می‌کند. این نوع شبکه مناسب سناریوهایی است که نیاز به عملکرد بسیار بالا و بدون سربار شبکه‌ای دارند، چراکه هیچ نیاز به ترجمه آدرس (NAT) بین کانتینر و میزبان وجود ندارد.

ویژگی‌های کلیدی Host Network:

  • کانتینر به‌طور مستقیم از شبکه میزبان استفاده می‌کند.
  • هیچ ایزوله‌سازی شبکه‌ای بین میزبان و کانتینر وجود ندارد.
  • مناسب برای برنامه‌هایی که نیاز به دسترسی مستقیم به منابع شبکه میزبان دارند.

۳. None Network چیست و چه کاربردی دارد؟

None network به معنای نداشتن شبکه برای کانتینر است. وقتی یک کانتینر به این شبکه متصل باشد، هیچ‌گونه دسترسی شبکه‌ای ندارد و کاملاً ایزوله است. این حالت بیشتر برای کانتینرهایی مناسب است که نیازی به برقراری ارتباط شبکه‌ای ندارند و به‌طور کامل مستقل عمل می‌کنند.

ویژگی‌های کلیدی None Network:

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

پیکربندی و مدیریت شبکه در Docker

Docker ابزارها و دستورهای متعددی برای پیکربندی و مدیریت شبکه‌های کانتینرها فراهم کرده است. این قابلیت‌ها به شما اجازه می‌دهند که شبکه‌های پیش‌فرض یا سفارشی را ایجاد و مدیریت کنید، کانتینرها را به شبکه‌های مختلف متصل و شبکه‌های مناسب برای هر پروژه را به‌سادگی پیاده‌سازی کنید. در این بخش، به بررسی دستورهای کلیدی Docker برای مدیریت شبکه، ایجاد شبکه‌های سفارشی و نحوه استفاده از این ابزارها در Docker Compose می‌پردازیم.

۱. دستور docker network و کاربرد آن

یکی از ابزارهای اصلی برای مدیریت شبکه در Docker، دستور docker network است. این دستور به شما اجازه می‌دهد تا شبکه‌های موجود را مشاهده کنید، شبکه‌های جدید بسازید، کانتینرها را به شبکه‌ها متصل یا از آن‌ها جدا کنید و وضعیت شبکه‌ها را مانیتور کنید.

برخی از دستورات مهم مرتبط با docker network:

  • لیست کردن شبکه‌ها:  

  دستور docker network ls تمامی شبکه‌های موجود را نمایش می‌دهد.

docker network ls
  • ایجاد یک شبکه جدید:  

  با دستور docker network create می‌توانید یک شبکه سفارشی بسازید. به‌عنوان مثال، ساخت یک شبکه از نوع Bridge:

docker network create –driver bridge my_bridge_network  
  • بررسی جزئیات یک شبکه:  

  برای مشاهده جزئیات یک شبکه خاص مانند آدرس IP کانتینرها و تنظیمات شبکه، از دستور زیر استفاده می‌شود:

docker network inspect my_bridge_network  
  • حذف یک شبکه:  

  برای حذف یک شبکه که دیگر نیازی به آن ندارید، می‌توانید از دستور docker network rm استفاده کنید:

docker network rm my_bridge_network  

۲. بررسی شبکه‌های موجود با docker network ls

دستور docker network ls لیستی از تمام شبکه‌های موجود را نشان می‌دهد، که می‌تواند شامل شبکه‌های پیش‌فرض مانند Bridge، Host، و None باشد و همچنین هر شبکه سفارشی که شما ایجاد کرده‌اید. این لیست به شما کمک می‌کند تا شبکه‌هایی که در حال استفاده هستند را به‌راحتی مدیریت کنید.

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

۳. ایجاد شبکه‌های سفارشی

گاهی اوقات نیاز دارید تا شبکه‌های خاص و سفارشی برای پروژه‌های خود ایجاد کنید. Docker امکان ایجاد شبکه‌های سفارشی با استفاده از درایورهای مختلف مانند bridge ،overlay و غیره را فراهم می‌کند. به‌عنوان مثال، برای ایجاد یک شبکه با درایور Bridge، از دستور زیر استفاده می‌شود:

docker network create –driver bridge custom_network

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

۴. مدیریت شبکه‌ها در Docker Compose

Docker Compose ابزاری است که برای تعریف و اجرای برنامه‌های چند کانتینری استفاده می‌شود. Compose به شما این امکان را می‌دهد که پیکربندی شبکه‌های مختلف را در یک فایل YAML مشخص کرده و به‌طور خودکار شبکه‌ها و کانتینرها را مدیریت کنید.

مثال زیر نشان می‌دهد که چگونه می‌توانید یک شبکه سفارشی در فایل docker-compose.yml تعریف کنید:

version: ‘3’
services:
  web:
    image: nginx
    networks:
      – frontend
  db:
    image: mysql
    networks:
      – backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

در این مثال، دو شبکه با نام‌های frontend و backend تعریف شده‌اند و هر سرویس در شبکه مربوط به خود قرار گرفته است. این ساختار به شما امکان می‌دهد تا به‌طور دقیق کنترل کنید که کدام کانتینرها بتوانند با یکدیگر ارتباط برقرار کنند.

Port Mapping در Docker

پیکربندی پورت‌ها در داکر Docker

پیکربندی پورت‌ها در Docker یکی از حیاتی‌ترین بخش‌ها برای ارتباط کانتینرها با دنیای خارج است. زمانی که یک کانتینر راه‌اندازی می‌شود، به‌طور پیش‌فرض در محیطی ایزوله قرار می‌گیرد و تنها در صورتی به شبکه میزبان متصل می‌شود که پورت‌های مورد نظر به‌درستی پیکربندی شده باشند. در این بخش، به مفاهیم Port Mapping، تفاوت پیکربندی پورت‌ها در حالت‌های Host و Bridge، و همچنین تنظیمات NAT و IP Tables می‌پردازیم.

۱. Port Mapping در Docker

Port Mapping فرایندی است که از طریق آن یک پورت مشخص از سیستم میزبان به پورت مربوطه در داخل کانتینر نگاشت می‌شود. این امکان به کانتینرها اجازه می‌دهد که از بیرون از محیط Docker دسترسی‌پذیر شوند. در حین اجرای یک کانتینر، می‌توانید با استفاده از پارامتر p- پورت‌های میزبان و کانتینر را تعریف کنید.

به‌عنوان مثال، دستور زیر پورت 80 از سیستم میزبان را به پورت 8080 کانتینر نگاشت می‌کند:

docker run -p 80:8080 my_app

در این مثال:

پورت 80 مربوط به سیستم میزبان است و پورت 8080 مربوط به کانتینر است.

بنابراین هرگاه کاربری به پورت 80 میزبان دسترسی پیدا کند، ترافیک به پورت 8080 داخل کانتینر هدایت می‌شود. این مکانیسم به شما امکان می‌دهد تا برنامه‌های داخل کانتینرها را بدون نگرانی از ایزوله بودن شبکه، به بیرون از میزبان متصل کنید.

۲. تنظیمات NAT و IP Tables در Docker

Docker برای مدیریت شبکه و پورت‌های کانتینرها از تکنیک NAT (Network Address Translation) استفاده می‌کند. NAT به Docker این امکان را می‌دهد که ترافیک از شبکه میزبان به کانتینرها منتقل شود، حتی اگر کانتینرها آدرس IP مجزایی داشته باشند. این فرایند توسط IP Tables سیستم عامل مدیریت می‌شود. هنگامی که پورت‌ها در Docker نگاشت می‌شوند (Port Mapping)، Docker با استفاده از IP Tables قوانین لازم را برای مسیریابی ترافیک بین میزبان و کانتینر تنظیم می‌کند. این به این معناست که هرگاه درخواست ترافیکی به پورت میزبان ارسال شود، IP Tables آن را به پورت داخلی کانتینر هدایت می‌کند.

شما می‌توانید از دستورات زیر برای مشاهده قوانین IP Tables در سیستم میزبان استفاده کنید:

iptables -t nat -L

این دستور قوانین NAT مربوط به شبکه Docker را نمایش می‌دهد و به شما کمک می‌کند که تنظیمات پورت‌ها و نحوه مدیریت ترافیک در Docker را به‌صورت دقیق مشاهده کنید.

۳. پورت فورواردینگ (Port Forwarding) و کاربرد آن

Port Forwarding یکی از قابلیت‌های مهم در Docker است که به شما امکان می‌دهد ترافیک را از یک پورت خاص به یک پورت دیگر هدایت کنید. این قابلیت بیشتر زمانی استفاده می‌شود که شما قصد دارید کانتینری را که در داخل یک شبکه ایزوله قرار دارد، از بیرون دسترسی‌پذیر کنید.

به‌عنوان مثال، در پروژه‌هایی که چندین کانتینر وب‌سرور در حال اجرا هستند، می‌توانید از Port Forwarding استفاده کنید تا ترافیک ورودی را به درستی بین این سرورها هدایت کنید. این فرایند معمولاً در تنظیمات چند کانتینری و پیچیده، مثل Docker Compose یا Kubernetes، اهمیت زیادی پیدا می‌کند.

بررسی و مدیریت پورت‌های باز در داکر

یکی از جنبه‌های مهم در مدیریت کانتینرها و شبکه‌ها، بررسی و مدیریت پورت‌های باز در Docker است. پورت‌های باز، کانال‌هایی هستند که از طریق آن‌ها یک کانتینر می‌تواند با دنیای بیرونی (شبکه میزبان یا اینترنت) ارتباط برقرار کند. مدیریت مناسب این پورت‌ها به شما کمک می‌کند تا امنیت و عملکرد شبکه‌های Docker را بهبود دهید و از دسترسی‌های غیرمجاز جلوگیری کنید. در این بخش، روش‌های بررسی پورت‌های باز، دستورهای مهم برای مانیتورینگ آن‌ها و همچنین راه‌حل‌هایی برای حل مشکلات رایج پورت‌ها بررسی می‌شود.

چگونه پورت‌های باز در کانتینرها را بررسی کنیم؟

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

1. استفاده از دستور docker ps  

   دستور docker ps یک لیست از تمامی کانتینرهای در حال اجرا نمایش می‌دهد و پورت‌های باز و نگاشت‌شده را در ستون PORTS نشان می‌دهد:

docker ps   

   در خروجی این دستور، می‌توانید پورت‌های مربوط به هر کانتینر را مشاهده کنید. برای مثال:

CONTAINER ID   IMAGE     COMMAND     CREATED     STATUS     PORTS                      NAMES
d9b100f2f636   nginx     “nginx”     3 hours ago Up 2 hours 0.0.0.0:80->80/tcp         web_server
   

   در این مثال، پورت 80 سیستم میزبان به پورت 80 داخل کانتینر نگاشت شده‌است.

2. استفاده از دستور docker inspect  

   دستور docker inspect به شما اطلاعات کامل‌تری درباره یک کانتینر مشخص ارائه می‌دهد. برای مشاهده پورت‌های باز یک کانتینر، می‌توانید از دستور زیر استفاده کنید:

docker inspect <container_id>

   این دستور یک خروجی JSON تولید می‌کند که شامل جزئیات مختلف از جمله پورت‌های نگاشت‌شده‌است. بخش NetworkSettings در این خروجی اطلاعات دقیقی درباره آدرس‌های IP و پورت‌ها ارائه می‌دهد.

دستورهای لازم برای مانیتورینگ پورت‌ها

برای مانیتورینگ دقیق‌تر وضعیت شبکه و پورت‌های باز در Docker، ابزارها و دستورات شبکه‌ای مفیدی وجود دارند:

1. استفاده از netstat 

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

netstat -tuln 

این دستور تمامی پورت‌های باز TCP و UDP را نشان می‌دهد و شما می‌توانید پورت‌هایی که برای Docker نگاشت شده‌اند را شناسایی کنید.

2. استفاده از ss 

دستور ss نیز ابزار قدرتمندی برای مانیتورینگ اتصالات شبکه است. برای نمایش پورت‌های باز و اتصال‌های فعال، می‌توانید از این دستور استفاده کنید:

ss -tuln

این دستور همانند netstat پورت‌های باز را نمایش می‌دهد و به شما اجازه می‌دهد وضعیت اتصالات شبکه‌ای را مشاهده کنید.

حل مشکلات رایج پورت‌ها در داکر

گاهی اوقات ممکن است در پیکربندی و مدیریت پورت‌ها در Docker به مشکلاتی برخورد کنید. در اینجا چند راه‌حل برای مشکلات رایج ارائه شده‌است:

1. پورت در حال استفاده است 

اگر هنگام تلاش برای نگاشت یک پورت با خطایی مواجه شدید که می‌گوید، “پورت در حال استفاده است”، به این معناست که پورت مشخصی در سیستم میزبان توسط فرایند دیگری اشغال شده‌است. برای حل این مشکل، می‌توانید:

  •    از پورت دیگری برای نگاشت استفاده کنید.
  •   با استفاده از دستور netstat یا ss بررسی کنید که کدام فرایند از پورت مورد نظر استفاده می‌کند و در صورت امکان آن را متوقف کنید.

2. پورت‌های کانتینر از بیرون قابل دسترسی نیستند  

   اگر کانتینر شما پورت‌های خود را باز کرده اما نمی‌توانید از بیرون به آن دسترسی داشته‌باشید، دلایل مختلفی ممکن است باعث این مشکل شوند:

  •    اطمینان حاصل کنید که Port Mapping به‌درستی تنظیم شده‌است (با دستور docker ps بررسی کنید).
  •    بررسی کنید که فایروال سیستم میزبان، ترافیک ورودی به آن پورت‌ها را مسدود نکرده باشد. با استفاده از دستور iptables یا ufw می‌توانید تنظیمات فایروال را بررسی کنید.

3. عدم دسترسی به کانتینر در شبکه سفارشی  

   اگر کانتینر شما در یک شبکه سفارشی ایجاد شده و ارتباط شبکه‌ای با کانتینرهای دیگر ندارد، ممکن است مشکلاتی در پیکربندی شبکه وجود داشته‌باشد. برای حل این مشکل:

  •    اطمینان حاصل کنید که کانتینرها در یک شبکه مشترک قرار دارند.
  •    از دستور docker network inspect برای بررسی وضعیت شبکه‌ها و ارتباطات استفاده کنید.

جمع‌بندی

در این مقاله، به بررسی جامع شبکه و پیکربندی پورت‌ها در Docker پرداختیم. شبکه‌بندی در Docker یکی از مهم‌ترین بخش‌های مدیریت کانتینرها است که به شما اجازه می‌دهد تا ارتباطات بین کانتینرها و دنیای بیرونی را به دقت کنترل کنید. مفاهیم Bridge Network، Host Network، و None Network همراه با پیکربندی‌های NAT و IP Tables به شما کمک می‌کنند که کانتینرهای خود را در محیطی ایزوله یا کاملاً یکپارچه با شبکه میزبان اجرا کنید. همچنین، پیکربندی و مدیریت پورت‌ها از طریق Port Mapping یکی از قابلیت‌های کلیدی Docker است که امکان دسترسی به برنامه‌های در حال اجرا در کانتینرها را از طریق شبکه فراهم می‌کند. با استفاده از دستورات مختلفی مانند docker network و docker inspect می‌توانید وضعیت شبکه‌ها و پورت‌های باز را مانیتور کرده و هرگونه مشکل را به سرعت برطرف کنید.

سوالات متداول

1. چگونه می‌توانم یک پورت خاص را در Docker به یک کانتینر نگاشت کنم؟

برای نگاشت یک پورت از سیستم میزبان به یک کانتینر در Docker، از پارامتر p- هنگام اجرای کانتینر استفاده می‌شود. به عنوان مثال، اگر بخواهید پورت 80 سیستم میزبان را به پورت 8080 کانتینر نگاشت کنید، دستور زیر را اجرا کنید:

docker run -p 80:8080 my_container

این دستور ترافیک ورودی به پورت 80 میزبان را به پورت 8080 داخل کانتینر هدایت می‌کند.

2. تفاوت بین شبکه‌های Bridge و Host در Docker چیست؟

  • Bridge Network: Docker یک شبکه مجازی بین کانتینرها و میزبان ایجاد می‌کند. در این حالت، هر کانتینر آدرس IP مستقل دارد و برای دسترسی به پورت‌ها باید از Port Mapping استفاده شود. این روش ایزوله‌سازی شبکه بهتری ارائه می‌دهد.
  • Host Network: در این حالت، کانتینر به‌طور مستقیم از شبکه میزبان استفاده می‌کند و نیازی به Port Mapping نیست. عملکرد این روش سریع‌تر است، اما ایزوله‌سازی شبکه کمتری دارد.

3. چگونه می‌توانم پورت‌های باز یک کانتینر را بررسی کنم؟

برای مشاهده پورت‌های باز و نگاشت‌شده یک کانتینر، می‌توانید از دستور docker ps استفاده کنید. این دستور لیستی از کانتینرهای در حال اجرا و پورت‌های نگاشت‌شده آن‌ها را نمایش می‌دهد:

docker ps

همچنین می‌توانید از دستور docker inspect برای دریافت اطلاعات جزئی‌تر در مورد پورت‌های یک کانتینر استفاده کنید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *