ویرگول
ورودثبت نام
Ahmadreza Sezavar
Ahmadreza SezavarPhD in AI https://github.com/SezavarH
Ahmadreza Sezavar
Ahmadreza Sezavar
خواندن ۳ دقیقه·۱ ماه پیش

ابزار های کاربردی کد نویسی- بخش پنجم

داکر (Docker) — ناجی دردسرهای وابستگی در پروژه‌های برنامه‌نویسی

حتماً برایتان پیش آمده که پروژه‌ای را روی سیستم خود بدون هیچ مشکلی اجرا کرده‌اید، اما به‌محض اینکه همان فایل‌ها را به سیستم همکار یا سرور دیگری منتقل کرده‌اید، با خطاهای عجیب‌وغریب مواجه شده‌اید.

خطاهایی مثل:

  • ModuleNotFoundError، VersionMismatch و یا مشکلات هنگام اجرا در GPU

علت این اتفاق فقط یک چیز است: تفاوت در محیط برنامه‌نویسی.

سناریو واقعی

فرض کنید شما در پروژه خود از:

- PyTorch 2.3

- CUDA 12.4

استفاده می‌کنید.

اما سیستم همکارتان مجهز به نسخه‌های:

- PyTorch 2.1

- CUDA 11.8

است. همین تفاوت کوچک کافیست تا پروژه‌ی شما به‌طور کامل از کار بیفتد.

راه‌حل: داکر (Docker)

Docker ابزاری است که مشکل تفاوت محیط‌ها را حل می‌کند.

داکر با ایجاد یک محیط ایزوله (isolated environment) شامل تمام وابستگی‌ها، کتابخانه‌ها، کدها و تنظیمات اجرایی، باعث می‌شود پروژه شما روی هر سیستمی دقیقاً مثل سیستم اولیه کار کند.

شما تنها کافیست فایل داکر خود را به همکارتان بدهید، و او با یک دستور ساده همان پروژه را اجرا می‌کند؛ بدون هیچ خطا یا دردسری.

مفاهیم اصلی در Docker

۱. 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 و غیره باشد)

  1. فقط نام بدون تگ (تگ پیش‌فرض 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>

موفق باشید

dockerdocker image
۳
۰
Ahmadreza Sezavar
Ahmadreza Sezavar
PhD in AI https://github.com/SezavarH
شاید از این پست‌ها خوشتان بیاید