حتماً برایتان پیش آمده که پروژهای را روی سیستم خود بدون هیچ مشکلی اجرا کردهاید، اما بهمحض اینکه همان فایلها را به سیستم همکار یا سرور دیگری منتقل کردهاید، با خطاهای عجیبوغریب مواجه شدهاید.
خطاهایی مثل:
ModuleNotFoundError، VersionMismatch و یا مشکلات هنگام اجرا در GPU
علت این اتفاق فقط یک چیز است: تفاوت در محیط برنامهنویسی.
فرض کنید شما در پروژه خود از:
- PyTorch 2.3
- CUDA 12.4
استفاده میکنید.
اما سیستم همکارتان مجهز به نسخههای:
- PyTorch 2.1
- CUDA 11.8
است. همین تفاوت کوچک کافیست تا پروژهی شما بهطور کامل از کار بیفتد.
Docker ابزاری است که مشکل تفاوت محیطها را حل میکند.
داکر با ایجاد یک محیط ایزوله (isolated environment) شامل تمام وابستگیها، کتابخانهها، کدها و تنظیمات اجرایی، باعث میشود پروژه شما روی هر سیستمی دقیقاً مثل سیستم اولیه کار کند.
شما تنها کافیست فایل داکر خود را به همکارتان بدهید، و او با یک دستور ساده همان پروژه را اجرا میکند؛ بدون هیچ خطا یا دردسری.
۱. Dockerfile — دستور پخت محیط اجرایی
فایل Dockerfile شامل مراحل و دستورات لازم برای ساخت محیط اجرایی مورد نیاز پروژه شماست.
این دستورات معمولاً شامل نصب کتابخانهها، تنظیم نسخهها و کپی فایلهای پروژه در محیط داکر هستند.
مثال:
FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "main.py"]
در این مثال، یک محیط ایزوله پایتون نسخه ۳.۱۰ ساخته میشود و تمام وابستگیها از فایل requirements.txt نصب خواهند شد.
۲. Image — قالب آماده اجرا
پس از اجرای دستور docker build، خروجی عملیات ساخت یک Image است.
این Image یک قالب read-only محسوب میشود که شامل تمام کتابخانهها، فایلها و تنظیمات شماست.
مثال:
اگر فایل اسمش Dockerfile باشه و در مسیری باشی که این فایل وجود داره، کافی است:
docker build -t myapp:latest .
اگر اسم فایل مثلاً Dockerfile.dev باشد یا در مسیر دیگری باشد، از فلگ -f استفاده میکنی:
docker build -f Dockerfile.dev -t myapp:dev .
این دستور یک image به نام myapp ایجاد میکند.
فلگ -t برای تعیین نام و تگ (tag) image استفاده میشود، در دستورات فوق نام image را myapp انتخاب کرده و tag را روی نسخه dev تنظیم کردیم (میتواند latest, prod یا حتی v1, 1.2 و غیره باشد)
فقط نام بدون تگ (تگ پیشفرض latest میشود):
docker build -t myapp . # نتیجه: image با نام myapp:latest ساخته میشود
---
۳. Container — نسخه در حال اجرا از Image
هر زمان که یک Image را اجرا کنید، یک Container ساخته میشود:
در واقع Container همان فرآیند فعال و زندهای است که پروژه شما را اجرا میکند.
مثال:
docker run -d -p 5000:5000 myapp
از ایمیج myapp یک کانتینر ایجاد و در پسزمینه (background) اجرا کن، و پورت ۵۰۰۰ داخل کانتینر را به پورت ۵۰۰۰ روی سیستم من (host) متصل کن.
فلگ -d یعنی اجرا در پسزمینه (Detached Mode) انجام میشود و فقط شناسهی کانتینر را دریافت میکنی.
۴. docker-compose — ارکستر چند کانتینر
گاهی پروژهها از چند سرویس مختلف تشکیل میشوند، مثل:
سرویس بکاند (Python)
پایگاه داده (PostgreSQL)
وبسرور (Nginx)
در این حالت مدیریت آنها با چند دستور Docker سخت میشود.
فایل docker-compose.yml برای همین هدف طراحی شده تا بتوانید چندین container را با یک فرمان راهاندازی کنید.
مثال ساده:
```yaml
version: '3.8' services: web: build: . ports: - "5000:5000" db: image: postgres:14 environment: POSTGRES_PASSWORD: example
با اجرای docker-compose up -d تمام سرویسها با هم بالا میآیند.
مزایای استفاده از Docker
حذف اختلاف نسخهها بین سیستمها
سرعت بالای راهاندازی پروژه در محیطهای جدید
سهولت در استقرار (Deploy) روی سرور
یکپارچگی در توسعه، تست و اجرا
در پایان، اگر بخواهیم در یک جمله Docker را تعریف کنیم:
> Docker ابزاری است که پروژهی شما را در یک «جعبه قابلحمل» قرار میدهد تا در هرجا دقیقاً به همان شکل کار کند.
1. مدیریت ایمیجها (Images)
- لیست ایمیجها:
docker images
- ساخت ایمیج از Dockerfile:
docker build -t <image_name>:<tag> .
- حذف ایمیج:
docker rmi <image_id>
2. مدیریت کانتینرها (Containers)
- اجرای یک کانتینر:
docker run -d -p <host_port>:<container_port> <image_name>
- لیست کانتینرهای فعال:
docker ps
- لیست همه کانتینرها (فعال و غیر فعال):
docker ps -a
- متوقف کردن یک کانتینر:
docker stop <container_id>
- حذف یک کانتینر:
docker rm <container_id>
- مشاهده لاگهای کانتینر:
docker logs <container_id>
- دسترسی به ترمینال درون کانتینر:
docker exec -it <container_id> /bin/bash
۳. مدیریت حجمها (Volumes)
- لیست حجمها:
docker volume ls
- ایجاد یک حجم جدید:
docker volume create <volume_name>
- حذف یک حجم:
docker volume rm <volume_name>
موفق باشید