اگر شما یک توسعهدهنده نرمافزار باشید، به احتمال زیاد با این جمله کابوسوار آشنا هستید: «نمیدانم چرا کار نمیکند، روی دستگاه من که درست بود!». این مشکل، که ناشی از تفاوت بین محیط توسعه، تست و محصول نهایی است، سالهاست که تیمهای نرمافزاری را آزار میدهد. کتابخانههای متفاوت، نسخههای ناسازگار و تنظیمات منحصر به فرد هر سیستم، همگی دست به دست هم میدهند تا فرآیند استقرار (Deployment) نرمافزار را به یک میدان مین تبدیل کنند.
پایان کابوس “روی دستگاه من کار میکند!
اینجاست که داکر (Docker) وارد صحنه میشود. داکر یک پلتفرم متن-باز انقلابی است که با استفاده از تکنولوژی کانتینرسازی (Containerization)، این مشکل را برای همیشه حل میکند. به زبان ساده، داکر به شما اجازه میدهد تا اپلیکیشن خود را به همراه تمام وابستگیهایش (کتابخانهها، فریمورکها، تنظیمات و…) در یک بسته قابل حمل و ایزوله به نام کانتینر (Container) قرار دهید. این کانتینر سپس میتواند روی هر سیستمی که داکر روی آن نصب باشد، به شکلی یکسان و قابل پیشبینی اجرا شود.
در این راهنمای جامع، ما از صفر شروع میکنیم، مفاهیم کلیدی داکر را بررسی کرده، آن را با ماشینهای مجازی مقایسه میکنیم و با دستورات عملی به شما نشان میدهیم که چگونه اولین کانتینر خود را بسازید و مدیریت کنید.
۱. چرا اصلاً به داکر نیاز داریم؟ دنیای پیش از کانتینرها
برای درک ارزش واقعی داکر، باید نگاهی به مشکلات گذشته بیندازیم. پیش از این، راهحل اصلی برای ایزولهسازی محیطها، استفاده از ماشینهای مجازی (Virtual Machines – VMs) بود. یک VM یک کامپیوتر کامل را به صورت نرمافزاری شبیهسازی میکند. یعنی شما روی سیستمعامل میزبان خود (مثلاً ویندوز)، یک سیستمعامل مهمان کامل (مثلاً یک نسخه از لینوکس) را نصب میکنید.
این رویکرد مشکلات خاص خود را داشت:
- سنگین و حجیم: هر VM شامل یک سیستمعامل کامل است که چندین گیگابایت فضا اشغال میکند و منابع زیادی (RAM و CPU) مصرف مینماید.
- کند بودن: راهاندازی یک VM دقایقی طول میکشد، که این موضوع سرعت فرآیند توسعه و تست را به شدت کاهش میدهد.
- هزینهبر: به دلیل مصرف بالای منابع، برای اجرای چندین VM به سختافزار بسیار قدرتمندی نیاز است که هزینههای سرور را افزایش میدهد.
داکر با ارائه یک راهکار سبکتر و سریعتر به نام کانتینر، این معادلات را بر هم زد.
۲. مفاهیم بنیادین داکر: ایمیج، کانتینر و Dockerfile
برای کار با داکر، باید با چند مفهوم کلیدی آشنا شوید. بیایید آنها را با یک مثال ساده (پختن کیک) درک کنیم.
- Image (ایمیج): نقشه ساخت یک ایمیج داکر یک فایل ثابت و غیرقابل تغییر است که شامل تمام دستورالعملها و مواد لازم برای اجرای یک اپلیکیشن است: کد برنامه، کتابخانهها، متغیرهای محیطی و فایلهای تنظیمات. ایمیجها خواندنی (Read-only) هستند.
- مثال کیک: ایمیج مانند «دستور پخت کیک» است. این دستورالعمل به شما میگوید به چه موادی (کد، کتابخانهها) و با چه ترتیبی نیاز دارید.
- Container (کانتینر): محصول نهایی در حال اجرا یک کانتینر نمونه در حال اجرای یک ایمیج است. وقتی شما یک ایمیج را «اجرا» میکنید، در واقع یک کانتینر از روی آن میسازید. کانتینرها محیطی کاملاً ایزوله هستند و میتوانند اجرا، متوقف، حذف یا جابجا شوند.
- مثال کیک: کانتینر همان «کیک پختهشده» است. شما میتوانید با یک دستور پخت (ایمیج)، چندین کیک (کانتینر) درست کنید. هر کیک یک موجودیت جداگانه است.
- Dockerfile (داکرفایل): دستورالعمل ساخت نقشهداکرفایل یک فایل متنی ساده است که در آن دستورات لازم برای ساختن یک ایمیج داکر را خط به خط مینویسید. داکر این فایل را میخواند و به صورت خودکار ایمیج مورد نظر شما را تولید میکند.
- مثال کیک: داکرفایل مانند «نوشتن دستور پخت کیک روی کاغذ» است. شما مشخص میکنید که چه موادی و با چه ترتیبی باید ترکیب شوند تا دستور پخت نهایی (ایمیج) ایجاد شود.
- Docker Hub / Registry (رجیستری): کتابخانه نقشهها رجیستریها مخازنی برای ذخیره و به اشتراکگذاری ایمیجها هستند. Docker Hub معروفترین رجیستری عمومی است که هزاران ایمیج آماده (مانند ایمیج رسمی Python, Node.js, Nginx, Ubuntu و…) در آن وجود دارد. این مانند GitHub برای کد است، اما برای ایمیجهای داکر.
۳. مقایسه داکر با ماشین مجازی (VM): تفاوت در معماری
تفاوت اصلی داکر و VM در لایه ایزولهسازی آنهاست.
ویژگی | ماشین مجازی (VM) | کانتینر داکر (Container) |
معماری | هر VM یک سیستمعامل مهمان کامل روی Hypervisor دارد. | کانتینرها هسته (Kernel) سیستمعامل میزبان را به اشتراک میگذارند. |
حجم و اندازه | بسیار بزرگ (چندین گیگابایت) | بسیار سبک (چندین مگابایت) |
زمان راهاندازی | چند دقیقه | چند ثانیه (یا کمتر) |
مصرف منابع | بالا (CPU و RAM زیاد) | بسیار کم و بهینه |
ایزولهسازی | ایزولهسازی کامل در سطح سختافزار و سیستمعامل | ایزولهسازی در سطح فرآیند (Process) |
۴. راهنمای نصب داکر (Docker)
نصب داکر بسیار ساده است. بهترین منبع همیشه مستندات رسمی خود داکر است.
- برای ویندوز و macOS: بهترین راه، نصب Docker Desktop است. این برنامه شامل موتور داکر، کلاینت خط فرمان (CLI) و یک رابط کاربری گرافیکی برای مدیریت کانتینرها و ایمیجهاست.
- برای لینوکس: میتوانید موتور داکر را با استفاده از مدیر بسته (Package Manager) توزیع خود نصب کنید.
- برای مثال در Ubuntu:
sudo apt-get update && sudo apt-get install docker-ce
- برای مثال در Ubuntu:
پس از نصب، ترمینال یا Command Prompt را باز کرده و دستور زیر را برای اطمینان از نصب صحیح وارد کنید:
docker --version
اگر نسخه داکر نمایش داده شد، نصب با موفقیت انجام شده است.
۵. شروع به کار: دستورات ضروری داکر که باید بلد باشید
حالا به بخش عملی میرسیم. بیایید با چند دستور کلیدی کار کنیم.
docker pull
: دریافت یک ایمیج از Docker Hub برای شروع، بیایید ایمیج رسمی وبسرور معروف Nginx را دانلود کنیم.
docker pull nginx
docker images
: مشاهده ایمیجهای موجود در سیستم این دستور لیستی از تمام ایمیجهایی که دانلود یا ساختهاید را نمایش میدهد.
docker images
docker run
: اجرا کردن یک کانتینر از روی یک ایمیج حالا وبسرور Nginx را اجرا میکنیم.
docker run --name my-nginx-server -p 8080:80 -d nginx
بیایید این دستور را تجزیه کنیم:
--name my-nginx-server
: یک نام دلخواه برای کانتینر خود انتخاب میکنیم.-p 8080:80
: پورت ۸۰۸۰ سیستم شما را به پورت ۸۰ داخل کانتینر (پورت پیشفرض Nginx) متصل میکند (Port Mapping). حالا اگر در مرورگر خود آدرسhttp://localhost:8080
را باز کنید، صفحه خوشامدگویی Nginx را خواهید دید!-d
: کانتینر را در حالت Detached (پسزمینه) اجرا میکند تا ترمینال شما آزاد بماند.nginx
: نام ایمیجی که میخواهیم از روی آن کانتینر بسازیم.
docker ps
: مشاهده کانتینرهای در حال اجرا این دستور لیستی از تمام کانتینرهایی که در حال حاضر فعال هستند را نمایش میدهد. برای دیدن تمام کانتینرها (حتی متوقف شدهها) از docker ps -a
استفاده کنید.
docker stop
: متوقف کردن یک کانتینر برای متوقف کردن کانتینر Nginx، از نام یا ID آن استفاده کنید.
docker stop my-nginx-server
docker rm
: حذف یک کانتینر متوقف شده پس از توقف، میتوانید کانتینر را برای آزاد شدن فضا حذف کنید.
docker rm my-nginx-server
docker rmi
: حذف یک ایمیج اگر دیگر به ایمیجی نیاز ندارید، میتوانید آن را حذف کنید.
docker rmi nginx
- نکته: برای حذف یک ایمیج، ابتدا باید تمام کانتینرهایی که از روی آن ساخته شدهاند را حذف کنید.
۶. ساخت اولین ایمیج شخصی با Dockerfile
قدرت واقعی داکر زمانی آشکار میشود که شما ایمیجهای شخصیسازیشده خود را برای اپلیکیشنهایتان بسازید. فرض کنید یک اپلیکیشن ساده Node.js دارید.
۱. ابتدا یک فایل به نام Dockerfile
(بدون پسوند) در ریشه پروژه خود ایجاد کنید. ۲. محتویات زیر را در آن قرار دهید:
# 1. انتخاب ایمیج پایه
FROM node:18-alpine
# 2. تعیین پوشه کاری داخل کانتینر
WORKDIR /app
# 3. کپی کردن فایلهای پکیج جیسون
COPY package*.json ./
# 4. نصب وابستگیها
RUN npm install
# 5. کپی کردن بقیه فایلهای پروژه
COPY . .
# 6. پورتی که اپلیکیشن روی آن اجرا میشود را مشخص کنید
EXPOSE 3000
# 7. دستور اجرای اپلیکیشن
CMD ["node", "app.js"]
حالا در ترمینال، در همان مسیری که Dockerfile
قرار دارد، دستور زیر را برای ساخت ایمیج اجرا کنید:
docker build -t my-nodejs-app .
-t my-nodejs-app
: نام و تگ ایمیج شما را مشخص میکند..
: به داکر میگوید کهDockerfile
در مسیر فعلی قرار دارد.
تبریک! شما اولین ایمیج داکر خود را ساختید. حالا میتوانید آن را با دستور docker run
مانند هر ایمیج دیگری اجرا کنید.
جمعبندی: آیندهای به نام داکر
داکر چیزی فراتر از یک ابزار است؛ یک تغییر پارادایم در چرخه حیات نرمافزار است. با استفاده از داکر، شما ثبات، سرعت و مقیاسپذیری بینظیری را به فرآیندهای توسعه، تست و استقرار خود میآورید. این راهنما تنها نقطه شروعی برای ورود به این دنیای شگفتانگیز بود.
مفاهیم پیشرفتهتری مانند Docker Compose (برای مدیریت چندین کانتینر به صورت همزمان) و Kubernetes (برای ارکستراسیون و مدیریت کانتینرها در مقیاس بسیار بزرگ) قدمهای بعدی شما در این مسیر خواهند بود. اما با تسلط بر همین اصول اولیه، شما قدرتمندترین ابزار DevOps مدرن را در جعبه ابزار خود خواهید داشت.