در ادامهی مسیرمون به سمت دواپس اینبار یه مقدار دقیق تر بررسی میکنیم که داکر به چه صورت استورج و شبکه رو برای کانتینرهایی که بالا میاره مدیریت میکنه و بیشتر باهاش آشنا میشیم.
خب یه مروری کنیم پستهای قبلی رو:
توصیه میکنم که حتما این پستها رو هم مطالعه کنید. بریم که ادامه بدیم.
همونطور که میدونید اگر بخوایم دیتایی از کانتینرمون رو ذخیره کنیم که مثلا در صورت داون شدن کانتینر اون رو از دست ندیم، دیتامون از طریق والیوم از کانتینر خارج میکنیم. والیومها توی داکر میتونن از سه نوع bind mount یا volume یا tmpfs mount باشند.
توی این حالت یک فایل یا دایرکتوری از هاست مون مانت میکنیم توی کانتینر. این روش از ابتدای توسعه داکر وجود داشت و کامند لاین خاصی داکر برای منیج کردن اون نداره و صرفا انگار یه فایل یا دایرکتوری که کانتینر شما باهاش کار میکنه، همونیه که روی هاستتون هست و بهش مانت کردید. اینجا شاید بهتر بتونید کاری که نیم اسپیس و سی گروپ توی ایزوله کردن و محدود کردن منابع میکنند رو درک کنید چون داریم به کمک داکر دسترسی ایجاد میکنیم به قسمتی مشخص از فایل سیستممون و دیسکمون که جزو منابع ما هست. معمولا مورد استفادهی این روش، برای کانفیگ فایلهای سرویس کانتینریمون هست. یوز کیس اصلی این روش الان برای فایلهای Read-Only است که نیاز به دسترسی write نداره و دسترسی خواندن داشته باشه کفایت میکنه.
راه استاندارد داکر برای ذخیره دیتای کانتینر استفاده از Volume هست که توی این روش خود داکر با استفاده از درایوری که بهش داده میشه و قابل کانفیگ هست، میاد و قسمتی از دیسک رو برای ذخیره دیتا در اختیار کانتینر میذاره و علاوه بر دستورات کامند لاین، فیچرهایی مثل قابلیت کنترل دسترسی و کنترل محدودیت های خواندن و نوشتن هم در اختیارمون میذاره. معمولا یوزکیس این روش برای ذخیره دیتای کانتینره که برامون مهم هست که پاک نشه مثل اطلاعات دیتابیس. با استفاده از والیوم داکر میتونیم دیتای خودمون رو توی Local Storage و روی Remote Storage ذخیره کنیم. قابلیت درایور بهمون این امکان رو میده که بتونیم دیتای خودمون رو روی یه استوریج که از طریق شبکه بهش دسترسی داریم ذخیره کنیم.
این نوع از والیوم دیتا رو روی RAM نگه میداره و با از بین رفتن کانتینر دیتای این والیوم هم پاک میشه! و از بیرون کانتینر هم امکان تغییر اون رو نداریم. ممکنه بگید این که نشد والیوم 🙂 اصلا همچین چیزی به چه دردی میخوره؟
معمولا خیلی کم از این نوع والیوم استفاده میشه و استفادههای خاصی داره. مثلا حالتی رو فرض کنید که کانتینر شما توی یه مسیر خاصی زیاد مینویسه و سرعت دیسک اون مسیر براتون مهم هست، یا مثلا دیتایی توی کانتینر تون دارید که نمیخواید ذخیره اش کنید اما براتون مهم هست که توی دیسکتون هم به صورت موقت نره حالا به دلایلی مثل حساسیت دیتا یا امکان مخرب بودن دیتا یا حتی کم بودن فضای دیسک تون یا IOPS خیلی زیاد! توی موارد این چنینی tmpfs نوعی از والیوم هست که میتونه بهتون کمک کنه.
در ادامه کامند لاین 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
انواع شبکه توی داکر به شش دسته تقسیم میشن که در ادامه هر کدوم رو به اختصار توضیح میدم. سه تای اول نتورکهای دیفالت داکر هستن و سه تای بعدی نیاز به درایور دارن برای استفاده. به جز این موارد امکان استفاده از remote networkها هم برامون فراهمه و میتونیم بهش متصل بشیم.
توی این نوع از شبکه کانتینر به صورت کامل به لحاظ نتورکی نسبت به بقیه کانتینرها و هاست داکر ایزوله هست و هیچ گونه دسترسی به شبکه ندارد. در واقع تو این حالت داکر به کانتینر استک نتورکی و نیم اسپیس مخصوص همون کانتینر رو میده ولی هیچ اینترفیسی رو داخل اون کانفیگ نمیکنه.
این نوع شبکه که نوع دیفالت، متداول و پر استفاده شبکه در داکر هست در واقع داکر یک اینترفیس بریج که در لایه دوم شبکه از کارت شبکه ما به صورت مجازی ایجاد شده، ایجاد میکند که از طریق اون کانتینر ما به شبکه دسترسی خواهد داشت و نسبت به بقیه کانتینرهایی که توی اون نتورک نیستند ایزوله خواهد بود. این طوری با کانتینرهایی که تو شبکهی خودش هست ارتباط داره و میتونه باهاشون صحبت کنه. تو این نتورک همواره Gateway کارت شبکهی هاست میباشد و از طریق اون میتونه با دنیای بیرون هم ارتباط بگیره و باهاشون کار کنه.
توی این مدل کانتینر به صورت کامل به استک نتورکی هاست ما دسترسی داره و از طریق هیچ نیم اسپیسی ایزوله نمیشه و میتونه به صورت مستقیم از همه ی اینترفیس هایی که روی هاستمون هست استفاده کنه. با این تعریف یعنی تمام کارتهای شبکه، hostname و تمام موارد مربوط به نتورک هاست داخل کانتینر هم وجود داره.
توی این نوع نتورک درایور overlay یک شبکه overlay که قابلیت پشتیبانی مالتی هاست رو هم داره ایجاد میکنه و با استفاده از ترکیب شبکه بریج داخلی لینوکس و VXLAN امکان ارتباط بین کانتینرها رو بر بستری روی شبکه فیزیکی ایجاد میکنه. تو این نتورک ما میتونیم Multi host networking داشته باشیم. امکانی که بهمون کمک میکنه تا کانتینرهای داخل هاست اول با کانتینرهای داخل هاست دوم داخل یک شبکه بوده و بتونن باهم صحبت کنند. تو این نتورک Routing و Switching انجام میشه.
توی این نوع نتورک میتونیم شبکه های مجازی رو ایجاد کنیم که کانتینرها در لایه دو و از طریق مک آدرس بتونن توی اون شبکه با هم ارتباط داشته باشند. این مورد بیشتر برای سرویسهای قدیمی کاربرد داره که دوست دارند با کانتینرها همانند VMها توی شبکه برخورد کنند. تو این شبکه انگار هر کانتینر ما یه VM هست و از طریق مک آدرسی که داره در دسترس هست و یه روش خوب برای ماگریت کردن از VM به Container هست. البته که هزینهی بالایی داره چون از رنج هاست داریم بهشون آیپی میدیم و این برامون مطلوب نیست. از این نتورک هم خیلی کم استفاده میشه.
به کمک این نوع شبکه ها میتونیم کنترل کامل رو هر دو نوع Ipv4 و Ipv6 داشته باشیم. نسخهی سادهتر و کاراتر macvlan هست با این تفاوت که به کانتینرها mac address یکتا نمیده. برای جاهایی که تعداد مکآدرسها رو میخواهیم کمتر داشته باشیم استفاده میشه. از این نتورک هم استفادهی خیلی کمی داریم.
یک نکتهی مهم همانطور که در VM ما میتونیم چندین کارت شبکه داشته باشیم و تو چند تا نتورک باشیم اینجا هم این امکان برامون فراهمه و میتونیم که داخل کانتینر چند تا نتورک داشته باشیم. فقط اگر از درایور None و Host داریم استفاده میکنیم به دلیل ذات خود درایور امکان وجود چند کارت شبکه رو نداریم.
در ادامه کامند لاین 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 متصل بشیم. اسم برخی از پلاگین های شبکه توی داکر رو اینجا براتون میذارم که اگه خواستید در موردشون بیشتر بخونید.
برای ارتباطات کانتینرها نیاز هست که NAT و Forwarding تو فایروال لینوکس کانفیگ بشه. خب ایجاد این Ruleها معمولا کار سختی هست و نیاز به دانش مناسب برای کانفیگش داره. خب داکر همهی کارها رو راحت کرده و بعیده که اینجا کاری نکرده باشه. داکر به صورت خودکار خودش تمام دسترسیها و Ruleهایی که لازم داره رو توی Iptables برامون میزنه و دسترسی کانتینر رو براش فراهم میکنه. این خیلی خوبه ولی یه سری نکتهی مهم هم داره. در ادامه به برخی از آنها اشاره میکنم:
به پورتی که کانتینر ما به اون گوش میده و سرویس رو از طریق اون ارائه میده و داخل کانتینر listen میشه exposed port میگیم حالا اگه این پورت رو به یکی از پورت های هاستمون هم فوروارد کنیم به این کار publish کردن پورت میگیم. به پورتی که exposed port رو به اون پابلیش میکنیم mapped port هم گفته میشه. که باز اینجا هم دارید میبینید که داکر به ما کمک میکنه دسترسی کانتینرها رو به اجزا مختلف منابعی که داریم کنترل کنیم و اون دیدی که توی قسمت تکنولوژی Underlay داکر بدست آوردید برای درک بقیه مفاهیم کمکتون میکنه. ما میتونیم چند تا کانتینر با پورتهای یکسان که داخلشون Expose شده باشه داشته باشیم ولی نمیتونیم دو تا پورت رو روی یه پورت خاص از هاست مانت کنیم. در تصویر زیر کامل این موضوع قابل مشاهده است.
یه نکتهی مهم دیگه اینکه تو قسمت iptables هم بهش اشاره کردم اگر پورتی Publish بشه داکر براش rule فایروال میزنه و دسترسی براش ایجاد میکنه. به دلیل اهمیتی که داشت دو بار به این موضوع اشاره کردم.
یادمه یه بار یکی از بچهها پورت دیتابیسش رو پابلیش کرده بود که باهاش کار کنه. البته میخواست توی همون سرور با دیتابیس کار کنه ولی دسترسی دیتابیسش برای همه باز شده بود و این اصلا خوشایند نبود چون بعد از یک ساعت کل دیتابیسش پاک شده بود و از این موضوع شاکی بود که چرا داکر دسترسی ایجاد کرده. بهش توضیح دادم که اگر بخوای روی لوکال هاست سرور باشه باید بهش IP که اون پورت میخواد روش Publish بشه رو بدی و مشخص کنی. کلا اگر ندونی که چطور باید از یک ابزار استفاده کنی حتما نمیتونی خوب ازش بهره بگیری.
این خیلی اتفاق خوبیه که تو داکر داریمش. از نسخهی ۱.۱۰ به بعد ما امکان این رو داریم که بتونیم از DNS سرور داخلی داکر استفاده کنیم که امکانات زیادی رو در اختیار ما قرار میده. شما وقتی تو دنیای کانتینرها ورود میکنید احتمالا با تعداد زیادی کانتینر مواجه هستید. موضوع بعدی اینکه برای ما انسانها کار کردن با اسمها راحتتر از کار کردن با IPها هست. به این دو علت نیاز به یک DNS سرور که برای تمامی کانتینرها بیاد رکورد DNS بزنه خیلی احساس میشد که داکر ارائه کرد. با استفاده از این قابلیت ما میتونیم دیگه مدیریت IPها رو رها کنیم و بگذاریم که داکر مدیریت کنه و ما روی اسمها فوکس کنیم و ازشون استفاده کنیم. با استفاده از این امکان ما میتونیم برای تمام موارد زیر رکورد داشته باشیم و اصطلاحا با این اسمها هر کانتینر رو صدا کنیم:
این طوری ما امکانش رو داریم که با اسم با کانتینر هامون صحبت کنیم. مثلا شما یه دیتابیس دارید به اسم mydb و یه کانتینر دیگه دارید که نیاز داره با اون دیتابیس صحبت کنه اینجا میتونید بدون دونستن آیپی دیتابیس فقط از اسمش استفاده کنید و اگر این دو تا کانتینر تو یک نتورک باشند همدیگه رو میبینن و میتونن با هم صحبت کنند. آدرس این DNS سرور داخلی داکر هم 127.0.0.11 هست که تنها روی نتورک default داکر که با اسم docker0 ایجاد میشه فعال نیست.
خب پس تا اینجا فهمیدیم که کانتیرها توی داکر چطوری با هم حرف میزنن و اگه بخوایم یه دیتایی رو ازشون بیرون بکشیم و نگهش داریم باید چیکار کنیم، در ادامه مسیر توی داکر عمیق تر میشیم و باهاش بیشتر آشنا میشیم.
مراقب خودتون باشید. 🌹🐳🌹
خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.
🫀 Follow DockerMe 🫀
🔔 Follow YouTube 🔔
📣 Follow Instagram 📣
🖇 Follow LinkedIn DockerMe🖇
🔎 Follow Linkedin Ahmad Rafiee 🔎
🕊 Follow Twitter 🕊