Cisco CCNA · 200-301 v2.0

Container و تفاوت آن با Virtual Machine

Container را بدون ریختن اصطلاح‌های سنگین می‌توان فهمید: ابتدا سیستم‌عامل و Kernel را ساده تعریف می‌کنیم، بعد Container و Image را می‌سازیم، شبکه آن را توضیح می‌دهیم و فقط در پایان آن را با VM مقایسه می‌کنیم. هدف این است که Network Engineer بداند یک Application داخل Container از چه مسیری به شبکه می‌رسد.

در پایان این درس باید بتوانی
  • Kernel را در حد لازم برای فهم Container توضیح دهد
  • Image، Container و Container Runtime را از هم تشخیص دهد
  • شبکه ساده Container را توضیح دهد
  • VM و Container را بعد از فهم مستقل هر دو مقایسه کند
  • مشکلات ساده دسترسی شبکه یک Container را مرحله‌ای بررسی کند

ساختار Container از پایه

برای فهم Container اول باید یک بخش از سیستم‌عامل را بشناسیم. Kernel هسته اصلی سیستم‌عامل است؛ بخشی که بین نرم‌افزارها و منابعی مثل CPU، Memory، Disk و Network ارتباط برقرار می‌کند. Application معمولاً مستقیم سخت‌افزار را مدیریت نمی‌کند و از امکانات سیستم‌عامل استفاده می‌کند. این تعریف برای این درس کافی است؛ لازم نیست وارد طراحی داخلی Kernel شویم.

در Virtual Machine معمولاً هر VM سیستم‌عامل کامل خودش را دارد و در نتیجه Kernel خودش را هم اجرا می‌کند. Container روش سبک‌تری برای جدا کردن Applicationهاست. چند Container روی یک Host معمولاً Kernel سیستم‌عامل میزبان را مشترک استفاده می‌کنند، اما فایل‌ها، Processها و تنظیمات موردنیاز Application تا حد زیادی از هم جدا نگه داشته می‌شوند. Process یعنی برنامه‌ای که در حال اجراست. همین اشتراک Kernel یکی از دلایلی است که Container معمولاً از VM سبک‌تر است.

برای ساخت Container معمولاً از Image شروع می‌کنیم. Image یک الگوی آماده از فایل‌ها و وابستگی‌های لازم برای اجرای Application است. وقتی از Image یک نمونه در حال اجرا می‌سازی، آن نمونه Container است. مثال ساده: Image مربوط به یک Web Server می‌تواند فایل‌های لازم و تنظیمات پایه را داشته باشد؛ هر بار که آن Image را اجرا می‌کنی یک Container ساخته می‌شود.

نرم‌افزاری که Imageها و Containerها را اجرا و مدیریت می‌کند Container Runtime یا Engine نامیده می‌شود. Runtime یعنی محیط اجرایی. Docker Engine نمونه شناخته‌شده‌ای است. برای CCNA لازم نیست جزئیات داخلی Docker یا Kubernetes را یاد بگیری. هدف این است که وقتی Application داخل Container است، بدانی یک لایه نرم‌افزاری برای ساخت و اتصال آن به Network وجود دارد و مشکل شبکه ممکن است داخل همان لایه باشد.

شبکه Container

Container برای ارتباط به Network نیاز دارد و معمولاً یک Interface مجازی در اختیارش قرار می‌گیرد. Runtime می‌تواند Container را به یک شبکه مجازی متصل کند و برای آن IP Address داخلی تعریف کند. جزئیات دقیق بین Platformها فرق دارد، اما مفهوم کلی شبیه این است که Container مثل یک Endpoint نرم‌افزاری به شبکه‌ای داخل Host وصل می‌شود.

فرض کن روی یک Linux Host دو Container مربوط به Web داریم. هرکدام می‌توانند IP داخلی خودشان را داشته باشند و از طریق یک Bridge نرم‌افزاری با هم یا با Host ارتباط بگیرند. Bridge در اینجا یک جزء نرم‌افزاری برای متصل کردن Interfaceهاست و از نظر نقش پایه به Switch نزدیک است. لازم نیست در این سطح وارد Network Namespace یا Pluginهای پیشرفته شویم؛ این اصطلاح‌ها برای فهم هدف فعلی CCNA ضروری نیستند.

برای اینکه کاربر بیرون Host به Web Server داخل Container برسد، معمولاً باید مشخص شود درخواست ورودی به کدام Port داخل Container هدایت شود. Port اینجا شماره سرویس در TCP یا UDP است، مثل TCP 80 برای HTTP. Runtime می‌تواند Port روی Host را به Port داخل Container نگاشت کند. این کار Port Mapping نام دارد؛ یعنی مثلاً Traffic ورودی TCP/8080 روی Host به TCP/80 داخل Container فرستاده شود.

مثال مفهومی Port Mapping
Client → Host-IP:8080 → Container-Web:80

اگر کاربر به IP Host دسترسی دارد ولی Web Application داخل Container باز نمی‌شود، ممکن است شبکه فیزیکی کاملاً سالم باشد و مشکل در Port Mapping، اجرای خود Container یا Firewall Host باشد. همین موضوع نشان می‌دهد Network Engineer در محیط Container باید قبل از تعویض کابل بداند سرویس در کدام قسمت اجرا می‌شود.

تفاوت معماری VM و Container

حالا می‌توانیم VM و Container را مقایسه کنیم، چون هر دو را جدا فهمیده‌ایم. Virtual Machine یک کامپیوتر مجازی کامل‌تر است. Hypervisor برای آن CPU، RAM، Disk و vNIC مجازی می‌سازد و داخل VM یک Guest OS مستقل اجرا می‌شود. اگر سه VM داشته باشی، معمولاً سه Guest OS جدا هم داری. این جداسازی می‌تواند برای اجرای سیستم‌عامل‌های متفاوت یا نیاز به جداسازی بیشتر مناسب باشد، اما منابع بیشتری مصرف می‌کند.

Container معمولاً Guest OS کامل جدا برای هر Application ندارد. Containerها Kernel Host را به اشتراک می‌گذارند و فقط محیط لازم برای Application را جدا می‌کنند. به همین دلیل ساخت و Start شدن Container معمولاً سریع‌تر است و حجم کمتری نسبت به VM کامل دارد. این به معنی «همیشه بهتر بودن» Container نیست؛ انتخاب به Application، امنیت، سیستم‌عامل موردنیاز و طراحی زیرساخت بستگی دارد.

از دید شبکه، VM معمولاً vNIC دارد که به vSwitch متصل می‌شود. Container هم Interface مجازی دارد، اما مدیریت آن معمولاً توسط Container Runtime و شبکه نرم‌افزاری Host انجام می‌شود. در هر دو حالت، Traffic در نهایت برای خروج از Host باید به NIC فیزیکی و شبکه بیرونی برسد، مگر اینکه مقصد داخل همان Host باشد. تفاوت اصلی در نحوه ساخت محیط اجرایی و اجزای میانی داخل Host است.

مقایسه خوب قرار نیست یک جدول پر از اصطلاح باشد. اگر Application به Windows Server کامل با سرویس‌های سیستم‌عاملی مشخص نیاز دارد، VM ممکن است انتخاب طبیعی‌تری باشد. اگر یک Web Service کوچک Linux داریم که قرار است چندین نمونه سریع و سبک از آن اجرا شود، Container می‌تواند مناسب‌تر باشد. برای CCNA قرار نیست معماری Application را انتخاب کنی؛ باید تشخیص بدهی Workload کجا اجرا می‌شود و Network Path آن چه تفاوتی با Server فیزیکی دارد.

منابع و چرخه اجرای Container

چون Containerها Kernel مشترک دارند، لازم نیست برای هر Container یک سیستم‌عامل کامل Boot شود. به همین دلیل Start شدن آن‌ها معمولاً سریع است. اگر بخواهی ده نسخه از یک سرویس کوچک Web اجرا کنی، ده Container می‌توانند در بسیاری از طراحی‌ها منابع کمتری از ده VM کامل مصرف کنند. باز هم عدد دقیق به Application و محدودیت‌های منابع بستگی دارد.

Image کمک می‌کند محیط Application تکرارپذیر باشد. اگر Image مشخصی را روی چند Host سازگار اجرا کنی، فایل‌های پایه Application یکسان هستند. این ویژگی در Automation و توسعه نرم‌افزار ارزش دارد، اما برای Network Engineer مهم‌ترین بخش آن این است که IP یا Port یک Container ممکن است موقت و پویا باشد. یعنی نباید همیشه مثل Server فیزیکی فرض کنی یک Container خاص برای همیشه همان IP را خواهد داشت.

در محیط‌های بزرگ، ابزارهایی می‌توانند چندین Container را روی چند Host مدیریت کنند. یکی از معروف‌ترین‌ها Kubernetes است. اما جزئیات Kubernetes، Pod، Service و Network Plugin از هدف فعلی CCNA فراتر می‌روند. فقط کافی است بدانی شبکه Container در محیط واقعی می‌تواند چند لایه نرم‌افزاری داشته باشد و در عیب‌یابی باید مشخص کنی کدام قسمت در محدوده مسئولیت توست. اضافه کردن ده اصطلاح جدید بدون نیاز، یادگیری پایه را بهتر نمی‌کند.

مثل VM، کمبود منابع Host می‌تواند روی Container هم اثر بگذارد. اگر CPU Host اشباع باشد، پاسخ Application کند می‌شود. پس «کندی» همیشه از Packet Loss نیست. بررسی Network Counterها باید کنار وضعیت سرویس و منابع Compute انجام شود. تفکیک Network Problem از Application یا Compute Problem مهارتی است که در Troubleshooting بارها به آن برمی‌گردیم.

عیب‌یابی ساده شبکه Container

فرض کن یک Web Application داخل Container اجرا می‌شود. کاربران می‌گویند سایت باز نمی‌شود، اما خود Host Ping می‌شود و سرویس‌های دیگری روی Host سالم‌اند. اول Scope را مشخص می‌کنی: آیا خود Container Running است؟ آیا Application داخل آن روی Port موردنظر Listen می‌کند؟ Listen یعنی برنامه منتظر اتصال ورودی روی آن Port است. آیا Port Mapping بین Host و Container درست تعریف شده؟ آیا Firewall Host اجازه Traffic می‌دهد؟

اگر Container از داخل Host به Gateway دسترسی ندارد، شبکه مجازی Container و Route داخل Host بررسی می‌شوند. اگر Container Gateway را می‌بیند ولی DNS Name Resolve نمی‌شود، تنظیم DNS مربوط به Container یا Host مطرح می‌شود. اگر فقط دسترسی از بیرون مشکل دارد ولی از داخل Host سرویس باز می‌شود، Port Mapping، Firewall و مسیر ورودی بیشتر اهمیت پیدا می‌کنند. هر تست محدوده را کوچک می‌کند.

دوباره سالم بودن Switch فیزیکی را بیش از حد تفسیر نکن. اگر NIC Host up/up است و بقیه Applicationهای همان Host سالم‌اند، تغییر VLAN روی Access Switch برای یک Container خاص باید با دلیل قوی انجام شود. از نزدیک‌ترین نقطه به سرویس شروع کن و کم‌کم به شبکه بیرونی برو. همین ترتیب در VM هم داشتیم؛ فقط اجزای نرم‌افزاری داخل Host متفاوت هستند.

مسیر ساده دسترسی به سرویس Container
Client
  ↓
Physical Network
  ↓
Host NIC
  ↓
Host / Container Network
  ↓
Port Mapping
  ↓
Container Interface
  ↓
Application

بعد از رفع مشکل، تست واقعی کاربر را تکرار کن. اگر Port Mapping اصلاح شد و صفحه Web باز شد، Log و تنظیم تغییرکرده را ثبت کن. اگر فقط Restart کردن Container سرویس را موقتاً برگرداند ولی علت مشخص نشد، Root Cause هنوز تأیید نشده است و باید این موضوع در Ticket نوشته شود. بازگرداندن سرویس و پیدا کردن علت اصلی دو نتیجه متفاوت هستند.

سناریوی عملی

یک Web Application داخل Container روی Hostی با IP 192.168.50.20 اجرا می‌شود. Host قابل Ping است و SSH هم کار می‌کند، اما کاربر به http://192.168.50.20:8080 دسترسی ندارد. بررسی نشان می‌دهد Container Running است و Application داخل آن روی TCP/80 Listen می‌کند، اما Port Mapping برای ۸۰۸۰ به ۸۰ تعریف نشده است. بعد از تعریف Mapping صحیح، سرویس از Client باز می‌شود. چون سایر ارتباط‌های Host سالم بودند، تغییر Switch یا VLAN لازم نبود.

اشتباهات رایج

اشتباهات رایج در فهم Container

  • قبل از توضیح Kernel، Container را با عبارت «اشتراک Kernel» رها نکن
  • Image را با Container در حال اجرا یکی ندان؛ Image الگو و Container نمونه اجراشده است
  • Runtime را بدون توضیح به‌عنوان یک اصطلاح مبهم وارد آموزش نکن
  • برای CCNA بدون نیاز وارد Kubernetes، Namespace و Pluginهای پیشرفته نشو
  • سالم بودن شبکه فیزیکی Host را معادل سالم بودن Port Mapping یا شبکه داخلی Container ندان
تمرین عملی

تمرین VM و Container

  1. با زبان خودت Kernel، Image، Container و Runtime را هرکدام در یک پاراگراف کوتاه توضیح بده
  2. مسیر Client تا Web Application داخل Container را روی کاغذ رسم کن
  3. مسیر Traffic یک VM و یک Container را کنار هم بکش و فقط اجزایی را بنویس که واقعاً توضیح داده شده‌اند
  4. سه سناریو بساز: Container خاموش، Port Mapping اشتباه و NIC فیزیکی Host Down؛ مشخص کن هرکدام چه Scopeی دارد
  5. اگر Docker Lab داری، یک Web Container ساده اجرا کن و Port Mapping را مشاهده کن؛ هدف فهم مسیر است نه حفظ دستور Docker

نکته‌هایی که باید با خودت ببری

  • Kernel بخش اصلی سیستم‌عامل است که منابع سخت‌افزار را برای نرم‌افزارها مدیریت می‌کند
  • Container معمولاً Kernel Host را مشترک استفاده می‌کند و محیط Application را جدا نگه می‌دارد
  • Image الگوی ساخت و Container نمونه در حال اجرا از آن الگو است
  • Runtime ابزار اجرای Image و مدیریت Container است
  • Container شبکه مجازی و Interface خودش را دارد و دسترسی بیرونی ممکن است به Port Mapping وابسته باشد
  • VM Guest OS مستقل دارد؛ Container معمولاً سبک‌تر است ولی هیچ‌کدام به‌صورت مطلق برای همه کاربردها بهتر نیست
  • عیب‌یابی باید مشخص کند مشکل در Application، شبکه Container، Host یا شبکه فیزیکی است
خودسنجی

فهم Container بدون حفظ اصطلاح

تفاوت اصلی Guest OS در VM و Container چیست؟

VM معمولاً Guest OS مستقل خودش را اجرا می‌کند؛ Containerها معمولاً Kernel سیستم‌عامل Host را مشترک استفاده می‌کنند و محیط Application را جدا می‌کنند.

Image با Container چه فرقی دارد؟

Image الگوی فایل‌ها و وابستگی‌های لازم است؛ Container نمونه‌ای است که از آن Image ساخته و اجرا شده است.

Host Ping می‌شود ولی یک Web Container از بیرون باز نمی‌شود. چه چیزی باید قبل از تغییر Switch بررسی شود؟

Running بودن Container، Listen بودن Application، Port Mapping و Firewall Host باید بررسی شوند، چون شبکه فیزیکی Host تا حدی سالم است.

منابع رسمی

منابع مرجع این درس

مطالعه همیشه آزاد است

برای ذخیره پیشرفت وارد حساب شو

حساب کاربری برای آزمون و ثبت مرحله‌ها استفاده می‌شود

ورود یا ثبت‌نام