پروژه روی لپتاپت درست اجرا میشود و روی سرور نه. یک نفر میگوید «داکرش کن»، یکی دیگر میگوید «یک ماشین مجازی جدا بگیر و تمام». هر دو پیشنهاد محیط اجرا را از بقیهٔ سیستم جدا میکنند، ولی این جداسازی را در دو لایهٔ متفاوت انجام میدهند. همین فرق تعیین میکند سرویس در چند ثانیه بالا بیاید یا چند دقیقه، چقدر منابع بخورد و اگر یک برنامه آلوده شد، بقیه چقدر در امان بمانند. اینجا تفاوت داکر و ماشین مجازی را از لایهٔ سختافزار تا تصمیم نهایی مرور میکنیم و آخرش معلوم است برای پروژهٔ تو کدام یکی، یا ترکیب هر دو، منطقیتر است.
توضیحهای فنی این راهنما از مستندات رسمی Docker، صفحهٔ ماشین مجازی در Red Hat و سایت رسمی پروژههایی مثل Kata Containers و gVisor گرفته شده است.
ماشین مجازی (VM) چیست و چطور کار میکند؟
ماشین مجازی یک کامپیوتر کامل است که بهجای سختافزار واقعی، روی سختافزار مجازی اجرا میشود. هر VM پردازنده، حافظه، کارت شبکه و دیسک مجازی خودش را دارد و یک سیستمعامل کامل، با کرنل خودش، داخلش نصب میشود. نرمافزاری که این سختافزار مجازی را میسازد و منابع سرور فیزیکی را بین VMها تقسیم میکند هایپروایزر نام دارد.
هایپروایزرها دو نوعاند. نوع اول مستقیم روی سختافزار مینشیند؛ KVM در لینوکس، Xen و Microsoft Hyper-V از این دستهاند و تقریباً همهٔ سرورهای ابری روی همینها ساخته میشوند. نوع دوم مثل یک برنامهٔ معمولی روی سیستمعامل میزبان اجرا میشود؛ VirtualBox و VMware Workstation را احتمالاً روی لپتاپ دیدهای. هر سرور مجازی (VPS) که اجاره میکنی در عمل یک VM روی هایپروایزر نوع اول است.
چون هر VM کرنل خودش را دارد، میتوانی روی یک سرور لینوکسی، ویندوز سرور اجرا کنی یا یک توزیع لینوکس قدیمی را برای یک نرمافزار قدیمی نگه داری. بهای این آزادی هم روشن است: هر VM باید یک سیستمعامل کامل را بوت کند، بهروز نگه دارد و حافظهاش را جدا رزرو کند.
داکر و کانتینر چیست؟
مستندات Docker کانتینر را خیلی ساده تعریف میکند: یک پروسس ایزوله که همهٔ فایلهای لازم برای اجرایش را همراه دارد. کانتینر سیستمعامل جداگانه بوت نمیکند. همهٔ کانتینرهای روی یک سرور از کرنل همان سرور استفاده میکنند و کرنل لینوکس با دو قابلیت namespaces و cgroups هر کدام را در محیط خودش نگه میدارد؛ namespaces مشخص میکند کانتینر چه چیزهایی را ببیند (پروسسها، شبکه، فایلسیستم) و cgroups سقف مصرف CPU و حافظه را تعیین میکند.
داکر ابزاری است که ساختن، جابهجا کردن و اجرای این کانتینرها را ساده کرده است. تو یک Dockerfile مینویسی، از آن یک ایمیج ساخته میشود و همان ایمیج روی لپتاپ، سرور تست و سرور اصلی یکجور اجرا میشود. اگر با خود داکر آشنا نیستی، اول داکر چیست و چگونه کار میکند؟ را بخوان و بعد برگرد.
تفاوت داکر و ماشین مجازی در لایههای زیرساخت
سادهترین راه فهمیدن تفاوت داکر و ماشین مجازی این است که لایهها را از پایین به بالا بشماری. در VM، روی سختافزار هایپروایزر است، روی آن چند سیستمعامل مهمان کامل، و برنامهها روی هر کدام. در داکر، روی سختافزار یک سیستمعامل میزبان است، روی آن موتور کانتینر، و برنامهها مستقیم روی همان کرنل مشترک اجرا میشوند.

یک آزمایش کوچک این فرق را ملموس میکند. روی یک سرور لینوکسی که داکر دارد، نسخهٔ کرنل را یک بار روی خود سرور و یک بار داخل کانتینر بگیر:
# on the Linux host
uname -r
# inside a throwaway Alpine container
docker run --rm alpine uname -r
# both commands print the same kernel version
هر دو یک عدد را نشان میدهند، چون کانتینر کرنل جداگانه ندارد. همین دستور داخل یک VM، نسخهٔ کرنل سیستمعامل مهمان را برمیگرداند که هیچ ربطی به کرنل میزبان ندارد.
این فرق پیامد مهمی هم دارد. ایمیج لینوکسی به کرنل لینوکس نیاز دارد. برای همین Docker Desktop روی ویندوز و مک، کانتینرها را داخل یک ماشین مجازی سبک لینوکسی اجرا میکند. مستندات نصب Docker Desktop روی ویندوز صریحاً از بکاندهای WSL 2 و Hyper-V نام میبرد. پس روی لپتاپ ویندوزی، داکر در عمل روی یک VM سوار است.
جدول مقایسهٔ داکر و ماشین مجازی
| معیار | کانتینر داکر | ماشین مجازی |
|---|---|---|
| چه چیزی ایزوله میشود | یک پروسس و فایلهای آن | یک کامپیوتر کامل با سختافزار مجازی |
| کرنل | مشترک با میزبان | کرنل جدا برای هر VM |
| سیستمعامل | فقط همخانوادهٔ کرنل میزبان | هر سیستمعاملی که هایپروایزر پشتیبانی کند |
| زمان راهاندازی | معمولاً چند ثانیه یا کمتر | معمولاً از چند ده ثانیه تا چند دقیقه (بوت کامل) |
| حجم | ایمیجها اغلب در حد مگابایت | دیسکها اغلب در حد گیگابایت |
| سربار منابع | کم؛ سیستمعامل تکراری اجرا نمیشود | بیشتر؛ هر VM سیستمعامل و حافظهٔ خودش را دارد |
| شدت ایزولهسازی | در سطح کرنل؛ باگ کرنل روی همه اثر دارد | در سطح سختافزار مجازی؛ مرز محکمتر |
| قابلحمل بودن | یک ایمیج همهجا یکجور اجرا میشود | جابهجایی دیسک VM سنگینتر است |
| نگهداری | با ساخت ایمیج جدید بهروز میشود | سیستمعامل هر VM باید جدا آپدیت شود |
| دادههای ماندگار | باید در volume نگه داشته شود | روی دیسک VM میماند |
چه زمانی ماشین مجازی انتخاب بهتری است؟
- به سیستمعامل یا کرنل دیگری نیاز داری. برنامهٔ ویندوزی روی میزبان لینوکسی، نرمافزاری که فقط روی یک نسخهٔ قدیمی CentOS تأیید شده، یا ماژول کرنل اختصاصی؛ هیچکدام در کانتینر معمولی جواب نمیدهد.
- کد غیرقابلاعتماد اجرا میکنی. اگر چند مشتری یا چند تیم ناشناس روی یک سرور کد اجرا میکنند، مرز سختافزاری VM خطر فرار از محیط ایزوله را کمتر میکند. مستندات امنیت Docker Engine هم میگوید امنیت کانتینر به امنیت کرنل میزبان و تنظیم درست خود کانتینر بستگی دارد.
- یک «سرور کامل» میخواهی. پنلهایی مثل cPanel، نرمافزارهای دسکتاپی با رابط گرافیکی، یا سرویسهایی که فرض میکنند systemd و فایروال کامل در دسترساند، روی VM راحتتر نصب میشوند.
- کنترل کامل شبکه و فایروال لازم داری. در VM با دسترسی root، iptables و تنظیمات شبکه دست خودت است. در یک کانتینر مدیریتشده این دسترسیها عمداً بستهاند.
چه زمانی داکر انتخاب بهتری است؟
- محیط توسعه و اجرا باید یکی باشد. نسخهٔ Node، Python یا کتابخانههای سیستمی داخل ایمیج قفل میشود و جملهٔ «روی سیستم من کار میکند» کمتر شنیده میشود.
- چند سرویس کوچک داری. فرانتاند، API، صف و کش هر کدام در کانتینر خودش، بدون اینکه برای هر کدام یک سیستمعامل کامل نگه داری. برای تعریف چند کانتینر کنار هم، Docker Compose ابزار معمول است.
- استقرار مکرر داری. در CI/CD هر commit یک ایمیج جدید میسازد و برگشت به نسخهٔ قبل یعنی اجرای ایمیج قبلی.
- مقیاس افقی میخواهی. بالا آوردن ده نسخه از یک کانتینر کار چند ثانیه است. وقتی تعداد کانتینرها زیاد شد، سراغ ارکستریشن میروی؛ مقایسهاش را در docker یا kubernetes؟ نوشتهایم.
یک ضعف مهم داکر را هم جدی بگیر: کانتینر موقتی است. اگر کانتینر را پاک کنی، هر چیزی که داخل لایهٔ قابلنوشتنش ذخیره شده بود از بین میرود. دیتابیس و فایلهای آپلودی باید در volume نگه داشته شوند. خیلی از گزارشهای «دادههایم پرید» از همینجا شروع میشود.
داکر داخل ماشین مجازی؛ رایجترین ترکیب
در عمل، سؤال اغلب «یا این یا آن» نیست. خود مستندات Docker میگوید در محیط ابری ماشینهایی که تحویل میگیری معمولاً VM هستند و بهجای اینکه هر VM فقط یک برنامه اجرا کند، یک موتور کانتینر روی آن چند برنامه را کنار هم اجرا میکند. یعنی VM مرز امنیتی و سیستمعامل را میدهد و داکر بستهبندی و استقرار برنامهها را.
الگوی رایج برای یک تیم کوچک همین است: یک سرور مجازی لینوکسی، داکر روی آن، و هر سرویس در کانتینر خودش. وقتی پروژه بزرگتر شد، همان ایمیجها بدون تغییر به چند سرور یا یک کلاستر کوبرنتیز منتقل میشوند.
گزینههای بین داکر و ماشین مجازی
بین کانتینر معمولی و VM کامل چند فناوری هست که سعی میکنند بخشی از مزیت هر دو را با هم بدهند. هر کدام هم هزینهٔ خودش را دارد:
- Kata Containers: یک container runtime که هر کانتینر را داخل یک ماشین مجازی سبک با کرنل جدا اجرا میکند. رابطش مثل کانتینر است و ایزولهسازیاش به VM نزدیک. ضعفش: به پشتیبانی مجازیسازی سختافزاری نیاز دارد و راهاندازیاش از داکر معمولی پیچیدهتر است.
- Firecracker: فناوری متنباز microVM که بر پایهٔ KVM ساخته شده و برای سرویسهای چندمستأجری و serverless طراحی شده است. ضعفش: ابزاری برای سازندگان پلتفرم است، نه چیزی که یک توسعهدهندهٔ معمولی مستقیم با آن کار کند.
- gVisor: یک «کرنل اپلیکیشنی» که فراخوانیهای سیستمی کانتینر را خودش جواب میدهد تا کمتر به کرنل میزبان برسند. ضعفش: همهٔ فراخوانیهای سیستمی را پشتیبانی نمیکند و برای کارهای پر از I/O کندتر است.
- Podman: جایگزین داکر برای اجرای کانتینر، بدون daemon مرکزی و با تمرکز روی اجرای بدون root. بیشتر دستورهایش مثل داکر است، ولی بعضی ابزارهای اکوسیستم داکر روی آن تنظیم اضافه میخواهند.
- Proxmox VE: پلتفرم مجازیسازی متنباز که هم VMهای KVM و هم کانتینرهای سیستمی LXC را از یک پنل مدیریت میکند. برای سرور فیزیکی خودت یا لابراتوار خانگی مناسب است، ولی نصب و نگهداریاش با خودت است.
اگر هدف فقط ساختن محیط توسعهٔ تکرارپذیر روی VM است، Vagrant هم ابزار قدیمی و هنوز کاربردی این کار است.
چطور بین داکر و ماشین مجازی تصمیم بگیریم؟
چند سؤال کوتاه بیشتر وقتها جواب را مشخص میکند:

- برنامه به سیستمعامل یا کرنل خاصی نیاز دارد؟ اگر بله، ماشین مجازی.
- کد افراد یا مشتریهای ناشناس روی یک میزبان اجرا میشود؟ اگر بله، VM یا گزینههای بینراهی مثل Kata و gVisor.
- یک برنامهٔ وب یا API معمولی داری که Dockerfile دارد یا میشود برایش نوشت؟ کانتینر کافی است.
- چند سرویس داری که با هم کار میکنند و میخواهی کنترل کامل سرور دست خودت باشد؟ یک VM و داکر روی آن.
- نمیخواهی سیستمعامل، فایروال و آپدیتهای امنیتی را مدیریت کنی؟ سرویس مدیریتشدهٔ کانتینر.
تفاوت داکر و ماشین مجازی در سرویسهای چابکان
در چابکان هر دو مدل را داری و هر کدام محدودیت خودش را هم دارد.
هاست ابری داکر یک کانتینر مدیریتشده است. طبق مستند استقرار داکر چابکان، یا آدرس یک ایمیج آماده را میدهی یا Dockerfile خودت را، و ساخت، لاگها، پورتها، دامنه و SSL از پنل مدیریت میشود. بکاپ روزانه هم خودکار گرفته میشود و لازم نیست سیستمعامل یا فایروال را آپدیت کنی. محدودیتها: هر سرویس یک ایمیج اجرا میکند، پس پروژهای که چند سرویس را در یک فایل compose تعریف کرده باید سرویسهایش را جدا بسازد. به کرنل و شبکهٔ میزبان دسترسی نداری و ساخت تانل داخل کانتینرها مجاز نیست.
سرور ابری و سرور مجازی یک VM کامل با دسترسی root است. سیستمعامل لینوکس یا ویندوز را از پنل نصب میکنی، داکر و هر ابزار دیگری را خودت روی آن میگذاری و موقعیت سرور را بین دیتاسنترهای ایران و خارج انتخاب میکنی. ضعفش این است که همهچیز با خودت است: آپدیت امنیتی، فایروال، مانیتورینگ. سرورهای ابری بکاپ خودکار ندارند و باید قبل از تغییرهای پرریسک اسنپشات بگیری یا بکاپ دستی داشته باشی. اگر بین سرور ابری و VPS هم مرددی، سرور ابری یا VPS؟ را ببین.
منابع و امکانات هر پلن در جدول پلنهای همان صفحهها آمده است. اگر هنوز مطمئن نیستی، از سرویس داکر شروع کن؛ اگر به محدودیتش خوردی، همان Dockerfile را روی یک سرور ابری اجرا میکنی و چیزی از کارت هدر نمیرود.
سؤالات متداول
داکر جایگزین ماشین مجازی است؟
نه برای همهٔ کارها. داکر برای بستهبندی و اجرای برنامه جای VM را گرفته، ولی هر وقت سیستمعامل دیگر، کرنل اختصاصی یا مرز امنیتی محکمتر لازم باشد، VM هنوز لازم است. بیشتر سرورهایی که داکر رویشان اجرا میشود خودشان VM هستند.
کانتینر امنتر است یا ماشین مجازی؟
ایزولهسازی VM بهطور پیشفرض قویتر است، چون هر VM کرنل جدا دارد و یک باگ کرنل فقط همان VM را درگیر میکند. کانتینر با تنظیم درست (کاربر غیر root، قابلیتهای محدود، ایمیج بهروز) برای برنامههای خودت کاملاً قابلاتکاست، ولی برای اجرای کد ناشناس انتخاب اول نیست.
میشود ویندوز را داخل داکر اجرا کرد؟
کانتینرهای ویندوزی وجود دارند، ولی به میزبان ویندوزی نیاز دارند. روی سرور لینوکسی، کانتینر ویندوزی اجرا نمیشود، چون کرنل مشترک است. برای اجرای ویندوز روی سختافزار لینوکسی باید سراغ ماشین مجازی بروی.
چرا داکر روی لپتاپ مک یا ویندوز من کندتر از سرور است؟
چون Docker Desktop روی این سیستمها کانتینرها را داخل یک VM لینوکسی اجرا میکند و فایلهایی که بین سیستم تو و آن VM به اشتراک گذاشته میشوند از یک لایهٔ اضافه رد میشوند. روی سرور لینوکسی این لایه وجود ندارد.
برای یادگرفتن داکر، سرور مجازی بگیرم یا هاست داکر؟
اگر میخواهی خود داکر را یاد بگیری (نصب، شبکه، volume، compose)، سرور مجازی لینوکسی بهتر است چون همهچیز را از نزدیک میبینی. اگر هدفت اجرای یک برنامه است و مدیریت سرور برایت جذاب نیست، هاست داکر کار را کوتاهتر میکند. برای فهم بهتر خود مفهوم کانتینر ابری، کانتینر ابری چیست؟ را هم ببین.