احمد رفیعی
احمد رفیعی
خواندن ۱۱ دقیقه·۷ ماه پیش

در مسیر دواپس: والیوم و نتورک داکر (قسمت سوم)

بررسی والیوم و نتورک داکر:

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

Docker Volume and Network
Docker Volume and Network


خب یه مروری کنیم پست‌های قبلی رو:

توصیه می‌کنم که حتما این پست‌ها رو هم مطالعه کنید. بریم که ادامه بدیم.

انواع والیوم در داکر:

Docker Volume
Docker Volume


همونطور که میدونید اگر بخوایم دیتایی از کانتینر‌مون رو ذخیره کنیم که مثلا در صورت داون شدن کانتینر اون رو از دست ندیم، دیتامون از طریق والیوم از کانتینر خارج می‌کنیم. والیوم‌ها توی داکر میتونن از سه نوع bind mount یا volume یا tmpfs mount باشند.

Volume Types
Volume Types


Bind mounts:

Bind Mounts
Bind Mounts


توی این حالت یک فایل یا دایرکتوری از هاست مون مانت می‌کنیم توی کانتینر. این روش از ابتدای توسعه داکر وجود داشت و کامند لاین خاصی داکر برای منیج کردن اون نداره و صرفا انگار یه فایل یا دایرکتوری که کانتینر شما باهاش کار میکنه، همونیه که روی هاستتون هست و بهش مانت کردید. اینجا شاید بهتر بتونید کاری که نیم اسپیس و سی گروپ توی ایزوله کردن و محدود کردن منابع می‌کنند رو درک کنید چون داریم به کمک داکر دسترسی ایجاد می‌کنیم به قسمتی مشخص از فایل سیستم‌مون و دیسک‌مون که جزو منابع ما هست. معمولا مورد استفاده‌ی این روش، برای کانفیگ فایل‌های سرویس کانتینری‌مون هست. یوز کیس اصلی این روش الان برای فایل‌های Read-Only است که نیاز به دسترسی write نداره و دسترسی خواندن داشته باشه کفایت می‌کنه.

Volumes:

Docker Volume
Docker Volume


راه استاندارد داکر برای ذخیره دیتای کانتینر استفاده از Volume هست که توی این روش خود داکر با استفاده از درایوری که بهش داده میشه و قابل کانفیگ هست، میاد و قسمتی از دیسک رو برای ذخیره دیتا در اختیار کانتینر میذاره و علاوه بر دستورات کامند لاین، فیچرهایی مثل قابلیت کنترل دسترسی و کنترل محدودیت های خواندن و نوشتن هم در اختیارمون میذاره. معمولا یوزکیس این روش برای ذخیره دیتای کانتینره که برامون مهم هست که پاک نشه مثل اطلاعات دیتابیس. با استفاده از والیوم داکر می‌تونیم دیتای خودمون رو توی Local Storage و روی Remote Storage ذخیره کنیم. قابلیت درایور بهمون این امکان رو میده که بتونیم دیتای خودمون رو روی یه استوریج که از طریق شبکه بهش دسترسی داریم ذخیره کنیم.

Remote Storage & Docker Volume
Remote Storage & Docker Volume


Tmpfs mount:

Tmpfs Mount
Tmpfs Mount

این نوع از والیوم دیتا رو روی RAM نگه میداره و با از بین رفتن کانتینر دیتای این والیوم هم پاک میشه! و از بیرون کانتینر هم امکان تغییر اون رو نداریم. ممکنه بگید این که نشد والیوم 🙂 اصلا همچین چیزی به چه دردی میخوره؟

معمولا خیلی کم از این نوع والیوم استفاده میشه و استفاده‌های خاصی داره. مثلا حالتی رو فرض کنید که کانتینر شما توی یه مسیر خاصی زیاد می‌نویسه و سرعت دیسک اون مسیر براتون مهم هست، یا مثلا دیتایی توی کانتینر تون دارید که نمی‌خواید ذخیره اش کنید اما براتون مهم هست که توی دیسکتون هم به صورت موقت نره حالا به دلایلی مثل حساسیت دیتا یا امکان مخرب بودن دیتا یا حتی کم بودن فضای دیسک تون یا IOPS خیلی زیاد! توی موارد این چنینی tmpfs نوعی از والیوم هست که میتونه بهتون کمک کنه.


Volume Management Commands:

در ادامه کامند لاین Volume رو می‌بینید که بهتون کمک می‌کنه تا والیوم‌ها رو مدیریت کنیم.

docker volume Manage volumes:

• docker volume create: Create a volume
• docker volume inspect: Display detailed information
• docker volume ls: List volumes
• docker volume prune: Remove all unused local volumes
• docker volume rm: Remove one or more volumes

انواع شبکه در داکر:

Docker Network
Docker Network


انواع شبکه توی داکر به شش دسته تقسیم میشن که در ادامه هر کدوم رو به اختصار توضیح میدم. سه تای اول نتورک‌های دیفالت داکر هستن و سه تای بعدی نیاز به درایور دارن برای استفاده. به جز این موارد امکان استفاده از remote networkها هم برامون فراهمه و می‌تونیم بهش متصل بشیم.

None:

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

Bridge:

Docker Bridge Network
Docker Bridge Network


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

Host:

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

Overlay:

Docker Overlay Network
Docker Overlay Network


توی این نوع نتورک درایور overlay یک شبکه overlay که قابلیت پشتیبانی مالتی هاست رو هم داره ایجاد میکنه و با استفاده از ترکیب شبکه بریج داخلی لینوکس و VXLAN امکان ارتباط بین کانتینرها رو بر بستری روی شبکه فیزیکی ایجاد میکنه. تو این نتورک ما می‌تونیم Multi host networking داشته باشیم. امکانی که بهمون کمک می‌کنه تا کانتینرهای داخل هاست اول با کانتینرهای داخل هاست دوم داخل یک شبکه بوده و بتونن باهم صحبت کنند. تو این نتورک Routing و Switching انجام می‌شه.

Macvlan:

Docker Macvlan Network
Docker Macvlan Network


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

Ipvlan:

به کمک این نوع شبکه ها میتونیم کنترل کامل رو هر دو نوع Ipv4 و Ipv6 داشته باشیم. نسخه‌ی ساده‌تر و کاراتر macvlan هست با این تفاوت که به کانتینرها mac address یکتا نمی‌ده. برای جاهایی که تعداد مک‌آدرس‌ها رو می‌خواهیم کمتر داشته باشیم استفاده می‌شه. از این نتورک هم استفاده‌ی خیلی کمی داریم.

Docker Ipvlan Network
Docker Ipvlan Network

یک نکته‌ی مهم همان‌طور که در VM ما می‌تونیم چندین کارت شبکه داشته باشیم و تو چند تا نتورک باشیم اینجا هم این امکان برامون فراهمه و می‌تونیم که داخل کانتینر چند تا نتورک داشته باشیم. فقط اگر از درایور None و Host داریم استفاده می‌کنیم به دلیل ذات خود درایور امکان وجود چند کارت شبکه رو نداریم.

Docker Ipvlan Network
Docker Ipvlan Network


Network Management Commands:

در ادامه کامند لاین Network رو می‌بینید که بهتون کمک می‌کنه تا نتورک‌ها رو مدیریت کنیم.

docker network connect: Connect a container to a network
docker network create: Create a network
docker network disconnect: Disconnect a container from a network
docker network inspect: Display detailed information
docker network ls: List networks
docker network prune: Remove all unused networks
docker network rm: Remove one or more networks

Remote Network Plugin:

پلاگین‌های شبکه این امکان رو برای ما فراهم می‌کنند که بتونیم با استفاده از آنها به شبکه‌های دیگه یا اصطلاحا remote network متصل بشیم. اسم برخی از پلاگین های شبکه توی داکر رو اینجا براتون میذارم که اگه خواستید در موردشون بیشتر بخونید.

  • Weave
  • Kuryr
  • Contiv
  • Flannel

Iptables:

Docker and Iptables
Docker and Iptables


برای ارتباطات کانتینرها نیاز هست که NAT و Forwarding تو فایروال لینوکس کانفیگ بشه. خب ایجاد این Ruleها معمولا کار سختی هست و نیاز به دانش مناسب برای کانفیگش داره. خب داکر همه‌ی کارها رو راحت کرده و بعیده که اینجا کاری نکرده باشه. داکر به صورت خودکار خودش تمام دسترسی‌ها و Ruleهایی که لازم داره رو توی Iptables برامون می‌زنه و دسترسی کانتینر رو براش فراهم می‌کنه. این خیلی خوبه ولی یه سری نکته‌ی مهم هم داره. در ادامه به برخی از آنها اشاره می‌کنم:

  • این کار به صورت خودکار انجام می‌شه. البته می‌تونیم آن را غیر فعال کنیم که اصلا توصیه نمی‌کنم.
  • داکر chain مخصوصی رو با اسم داکر ایجاد میکنه و Rule های خودش رو توی اون میزنه که این مورد به بررسی Ruleهای داکر خیلی کمک میکنه.
  • برای تمام پورت‌هایی که ما Publish کنیم Rule می‌زنه و دسترسی براش ایجاد می‌کنه که باید حواسمون باشه، ممکنه چیزی که نمی‌خواهیم به بیرون Leak بشه. پس اگر پورتی رو می‌خواهیم روی IP خاصی باز کنیم حتما حواسمون باشه روی همون باز کنیم تا دسترسی‌های فایروال اونم درست انجام بشه.
Docker Network NAT
Docker Network NAT

Expose and Publish Ports:

به پورتی که کانتینر ما به اون گوش میده و سرویس رو از طریق اون ارائه میده و داخل کانتینر listen می‌شه exposed port میگیم حالا اگه این پورت رو به یکی از پورت های هاست‌مون هم فوروارد کنیم به این کار publish کردن پورت میگیم. به پورتی که exposed port رو به اون پابلیش می‌کنیم mapped port هم گفته میشه. که باز اینجا هم دارید می‌بینید که داکر به ما کمک میکنه دسترسی کانتینرها رو به اجزا مختلف منابعی که داریم کنترل کنیم و اون دیدی که توی قسمت تکنولوژی Underlay داکر بدست آوردید برای درک بقیه مفاهیم کمکتون میکنه. ما می‌تونیم چند تا کانتینر با پورت‌های یکسان که داخلشون Expose شده باشه داشته باشیم ولی نمی‌تونیم دو تا پورت رو روی یه پورت خاص از هاست مانت کنیم. در تصویر زیر کامل این موضوع قابل مشاهده است.

Expose and Publish Ports
Expose and Publish Ports


یه نکته‌ی مهم دیگه اینکه تو قسمت iptables هم بهش اشاره کردم اگر پورتی Publish بشه داکر براش rule فایروال می‌زنه و دسترسی براش ایجاد می‌کنه. به دلیل اهمیتی که داشت دو بار به این موضوع اشاره کردم.

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

DNS and Service Discovery:

DNS and Service Discovery
DNS and Service Discovery


این خیلی اتفاق خوبیه که تو داکر داریمش. از نسخه‌ی ۱.۱۰ به بعد ما امکان این رو داریم که بتونیم از DNS سرور داخلی داکر استفاده کنیم که امکانات زیادی رو در اختیار ما قرار می‌ده. شما وقتی تو دنیای کانتینرها ورود می‌کنید احتمالا با تعداد زیادی کانتینر مواجه هستید. موضوع بعدی اینکه برای ما انسان‌ها کار کردن با اسم‌ها راحت‌‌تر از کار کردن با IPها هست. به این دو علت نیاز به یک DNS سرور که برای تمامی کانتینرها بیاد رکورد DNS بزنه خیلی احساس می‌شد که داکر ارائه کرد. با استفاده از این قابلیت ما می‌تونیم دیگه مدیریت IPها رو رها کنیم و بگذاریم که داکر مدیریت کنه و ما روی اسم‌ها فوکس کنیم و ازشون استفاده کنیم. با استفاده از این امکان ما می‌تونیم برای تمام موارد زیر رکورد داشته باشیم و اصطلاحا با این اسم‌ها هر کانتینر رو صدا کنیم:

  • Container name
  • Hostname
  • Alias
Default DNS resolution
Default DNS resolution


این طوری ما امکانش رو داریم که با اسم با کانتینر هامون صحبت کنیم. مثلا شما یه دیتابیس دارید به اسم mydb و یه کانتینر دیگه دارید که نیاز داره با اون دیتابیس صحبت کنه اینجا می‌تونید بدون دونستن آی‌پی‌ دیتابیس فقط از اسمش استفاده کنید و اگر این دو تا کانتینر تو یک نتورک باشند همدیگه رو می‌بینن و می‌تونن با هم صحبت کنند. آدرس این DNS سرور داخلی داکر هم 127.0.0.11 هست که تنها روی نتورک default داکر که با اسم docker0 ایجاد می‌شه فعال نیست.

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

مراقب خودتون باشید. 🌹🐳🌹



خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.

🫀 Follow DockerMe 🫀

🔔 Follow YouTube 🔔

📣 Follow Instagram 📣

🖇 Follow LinkedIn DockerMe🖇

🔎 Follow Linkedin Ahmad Rafiee 🔎

🕊 Follow Twitter 🕊

داکروالیومنتورکdocker
مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
شاید از این پست‌ها خوشتان بیاید