مشکل «روی سیستم من کار میکند» احتمالاً قدیمیترین درد توسعهدهندههاست. یک اپلیکیشن در محیط توسعهٔ توسعهدهنده درست کار میکند، اما روی سرور یا سیستم همکار، به دلیل تفاوت در نسخهٔ کتابخانهها، پیکربندی و سیستمعامل، از کار میافتد. داکر برای حل همین مسئله متولد شد.
Docker یک پلتفرم متنباز برای کانتینریسازی (Containerization) است که در سال ۲۰۱۳ توسط Solomon Hykes و تیمش در شرکت DotCloud معرفی شد. داکر به شما اجازه میدهد اپلیکیشن و همهٔ وابستگیهایش را در یک بستهٔ سبک به نام کانتینر بستهبندی کنید و آن را روی هر سیستمعامل و هر زیرساختی — از لپتاپ تا سرور ابری — به یک شکل اجرا کنید.
کانتینر چیست؟
یک کانتینر یک واحد استاندارد از نرمافزار است که کد، رانتایم، کتابخانههای سیستمی و پیکربندی را بستهبندی میکند. برخلاف ماشین مجازی که یک سیستمعامل کامل را شبیهسازی میکند، کانتینر از کرنل میزبان استفاده میکند و فقط لایههای کاربری (User Space) را ایزوله میکند.
کانتینر در مقابل ماشین مجازی
تفاوت اصلی بین کانتینر و ماشین مجازی (VM) در سطح ایزولهسازی است:
- ماشین مجازی — یک هایپروایزر مثل KVM یا Hyper-V یک سیستمعامل کامل مهمان را اجرا میکند. هر VM شامل کرنل، کتابخانهها و اپلیکیشن است و حجم آن معمولاً چند گیگابایت است
- کانتینر — فقط اپلیکیشن و وابستگیهایش را در خود دارد و از کرنل میزبان استفاده میکند. حجم آن معمولاً چند ده مگابایت است و در چند میلیثانیه بالا میآید
- ایزولهسازی — VM جداسازی کامل و مستحکم دارد؛ کانتینر با namespace و cgroup جداسازی در سطح فرآیند دارد که سبکتر اما به اندازهٔ VM مستحکم نیست
- تراکم (Density) — روی یک سرور میتوان دهها کانتینر اجرا کرد، اما تعداد VMها به دلیل مصرف منابع محدود است
کانتینر و VM رقیب هم نیستند؛ اغلب در کنار هم استفاده میشوند — کانتینرها داخل یک VM اجرا میشوند تا هم ایزولهسازی کرنل داشته باشیم و هم سبکی کانتینرها.
اجزای اصلی داکر
Dockerfile — دستور پخت تصویر
Dockerfile یک فایل متنی است که مراحل ساخت تصویر را مشخص میکند: از کدام پایه شروع کنیم، چه وابستگیهایی نصب کنیم، چه فایلهایی را کپی کنیم و اپلیکیشن چگونه اجرا شود.
FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]هر دستور در Dockerfile یک لایه (Layer) میسازد. لایهها به صورت Cache ذخیره میشوند؛ اگر یک لایه تغییر نکند، دفعهٔ بعد از کش استفاده میشود. به همین دلیل ترتیب دستورها مهم است: دستورهای کمتغییر (مثل نصب وابستگیها) باید بالاتر قرار بگیرند تا build سریعتر شود.
Image و Registry
Image (تصویر) یک قالب فقطخواندنی از کانتینر است. وقتی یک تصویر اجرا میشود، یک لایهٔ قابل نوشتن روی آن اضافه میشود که همان کانتینر است. تصاویر در Registry ذخیره و توزیع میشوند؛ Docker Hub عمومیترین آنهاست و سازمانها میتوانند رجیستری خصوصی هم اجرا کنند.
Docker Engine و Docker Compose
Docker Engine همان دیمونی است که کانتینرها را میسازد و اجرا میکند. Docker Compose هم ابزاری برای تعریف و اجرای چند کانتینر با یک فایل compose.yaml است — برای مثال یک اپلیکیشن به همراه دیتابیس و Redis.
services:
web:
build: .
ports:
- "3000:3000"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:با یک دستور docker compose up کل این مجموعه بالا میآید — این همان چیزی است که توسعهٔ محلی را تا این حد راحت کرده است.
Volume و Network
کانتینرها ذاتاً بیحافظه (Stateless) هستند؛ هر تغییری با حذف کانتینر از بین میرود. Volume فضایی در دیسک میزبان است که برای دادهٔ ماندگار — مثل فایلهای دیتابیس — به کانتینر متصل میشود. Network هم اجازه میدهد کانتینرها با نام سرویس یکدیگر را پیدا کنند و ارتباط برقرار کنند.
امکانات پیشرفتهٔ داکر
Healthcheck — بررسی سلامت
داکر میتواند به صورت دورهای سلامت کانتینر را چک کند (مثلاً درخواست HTTP به یک مسیر مشخص). سرویسهای ارکستری مثل Swarm یا Kubernetes از نتیجهٔ این چک برای تصمیمگیری دربارهٔ ریاستارت یا ترافیکدهی استفاده میکنند.
محدودیت منابع (Resource Limits)
با فلگهایی مثل --memory و --cpus میتوانید حداکثر مصرف RAM و CPU هر کانتینر را محدود کنید. این کار از «فرار حافظه» یک سرویس پراشکال که کل سرور را از کار بیندازد جلوگیری میکند.
Multi-stage Build
با build چندمرحلهای، ابزارهای ساخت (مثل کامپایلر) در یک مرحله استفاده و سپس دور ریخته میشوند و فقط خروجی نهایی در تصویر نهایی کپی میشود. نتیجه: تصاویر بسیار کوچکتر و امنتر.
داکر در پلتفرمهای PaaS
تقریباً همهٔ پلتفرمهای PaaS مدرن از داکر به عنوان فرمت پایهٔ دپلوی استفاده میکنند: کد خود را در یک تصویر میسازید و پلتفرم آن را اجرا و مقیاس میکند. در این مدل، داکر به «فرمت استاندارد بستهبندی اپلیکیشن» تبدیل شده است — مثل ZIP برای فایلها.
مقایسهٔ داکر با ماشین مجازی و Kubernetes
داکر همخانواده با VM و Kubernetes است اما هر کدام در سطح متفاوتی کار میکنند. جدول زیر خلاصهٔ تفاوتهاست:
| ویژگی | Docker | ماشین مجازی (VM) | Kubernetes |
|---|---|---|---|
| سطح ایزولهسازی | فرآیند (کرنل مشترک) | سیستمعامل کامل | مدیریت کانتینرها |
| زمان راهاندازی | میلیثانیه | دقیقه | میلیثانیه (برای کانتینر) |
| حجم | دهها مگابایت | چند گیگابایت | — |
| مقیاسپذیری | دستی / Compose | دستی | خودکار (Autoscaling) |
| مدیریت سرورها | تکمیزبان | تکمیزبان | چندمیزبان (Cluster) |
| پیچیدگی | پایین | متوسط | بالا |
| مناسب برای | بستهبندی و اجرای اپ | نیاز به ایزولهٔ مستحکم | مقیاس بزرگ و HA |
موارد استفادهٔ داکر
۱. توسعهٔ محلی یکسان برای کل تیم
با یک فایل compose.yaml، تمام اعضای تیم — و حتی CI/CD — همان محیط دقیق را اجرا میکنند. پایان «روی سیستم من کار میکرد».
۲. CI/CD
در پایپلاینهای CI/CD، هر مرحله میتواند در یک کانتینر اجرا شود و خروجی همان تصویری است که در نهایت دپلوی میشود — هیچ فاصلهای بین تست و تولید نیست.
۳. اجرای سرویسهای آماده (Dependency)
دیتابیس، Redis، Elasticsearch و دهها ابزار دیگر با یک دستور docker run بالا میآیند، بدون آلوده کردن سیستم میزبان.
۴. میکروسرویسها
داکر واحد طبیعی بستهبندی در معماری میکروسرویسی است: هر سرویس مستقل ساخته، نسخهبندی و استقرار میشود.
۵. آپلود و دپلوی روی PaaS
در پلتفرمهای PaaS، تصویر داکر را آپلود میکنید و پلتفرم آن را اجرا میکند — دپلوی به چند کلیک ساده میشود.
چه زمانی داکر انتخاب مناسبی است؟
- میخواهید محیط توسعه و تولید را یکسان کنید
- اپلیکیشن شما وابستگیهای پیچیده دارد (نصب کتابخانه، نسخههای مختلف رانتایم و ...)
- به استقرار مکرر و قابل تکرار (Reproducible) نیاز دارید
- در حال ساخت معماری میکروسرویسی یا چند سرویس وابسته هستید
- میخواهید میان ابزارهای مختلف (دیتابیس، صف پیام و ...) بدون نصب روی سیستم کار کنید
- به دنبال دپلوی ساده روی PaaS یا هاست ابری هستید
برای چه چیزهایی مناسب نیست؟
- نیاز به ایزولهسازی مستحکم و جداسازی کرنل — اگر چند مستأجر با نیازهای امنیتی سخت دارید، VM یا K8s با VM بهتر است
- اپلیکیشنهای دسکتاپ با GUI سنگین — هرچند ممکن است، اما دردسر و سربار دارد
- مقیاس کلان بدون ابزار ارکستریشن — اجرای صدها کانتینر به صورت دستی روی دهها سرور فاجعه است؛ به Kubernetes یا یک سرویس PaaS نیاز خواهید داشت
- بارهای کاری Real-time با نیاز به عملکرد فوقالعاده پایین — لایهٔ شبکه و namespace سربار کوچک اما غیرصفر دارند
- دادهٔ ماندگار با پیچیدگی بالا — کانتینر برای Stateless بودن طراحی شده؛ مدیریت دیتابیسهای سنگین همچنان تخصص خودش را میخواهد
لکسویا در سرویس پلتفرم ابری (PaaS) خود از این تکنولوژی پشتیبانی میکند — با چند کلیک دپلوی کنید.
نتیجهگیری
داکر با حذف تفاوت بین محیطها، انقلابی در توسعه و استقرار نرمافزار ایجاد کرد. از یک Dockerfile ساده تا تصاویر چندمرحلهای، اکوسیستم داکر آنقدر بالغ شده که فرمت استاندارد بستهبندی اپلیکیشن در صنعت به شمار میرود — و تقریباً همهٔ PaaSها و ابزارهای مدرن بر پایهٔ آن ساخته شدهاند.
داکر برای همه چیز راهحل نیست؛ برای ایزولهسازی مستحکم یا مقیاس کلان ابزارهای دیگری لازم است. اما اگر مشکل شما «یکسانسازی محیطها و دپلوی ساده و قابل تکرار» است، داکر بهترین نقطهٔ شروع است.