وبلاگ
نصب و راهاندازی Docker Compose در لینوکس، مک و ویندوز: راهنمای کامل
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
دوره آموزش Flutter و برنامه نویسی Dart [پروژه محور]
دوره جامع آموزش برنامهنویسی پایتون + هک اخلاقی [با همکاری شاهک]
دوره جامع آموزش فرمولاسیون لوازم آرایشی
دوره جامع علم داده، یادگیری ماشین، یادگیری عمیق و NLP
دوره فوق فشرده مکالمه زبان انگلیسی (ویژه بزرگسالان)
شمع سازی و عودسازی با محوریت رایحه درمانی
صابون سازی (دستساز و صنعتی)
صفر تا صد طراحی دارو
متخصص طب سنتی و گیاهان دارویی
متخصص کنترل کیفی شرکت دارویی
نصب و راهاندازی Docker Compose در لینوکس، مک و ویندوز: راهنمای کامل
در دنیای مدرن توسعه نرمافزار، کانتینرسازی با ابزارهایی مانند داکر (Docker) به یک استاندارد طلایی برای بستهبندی، توزیع و اجرای برنامهها تبدیل شده است. داکر به توسعهدهندگان و متخصصان DevOps این امکان را میدهد که برنامهها و تمامی وابستگیهایشان را در یک محیط مجزا و قابل حمل کپسوله کنند، که این امر تفاوتهای محیطی را به حداقل رسانده و فرآیند استقرار را تسهیل میبخشد. با این حال، بسیاری از کاربردها و سرویسهای مدرن از چندین کانتینر تشکیل شدهاند که برای عملکرد صحیح باید با یکدیگر ارتباط برقرار کنند. مدیریت این مجموعه از کانتینرها، شبکههایشان، و حجمهای ذخیرهسازی مرتبط به صورت دستی میتواند به سرعت پیچیده و زمانبر شود.
اینجاست که Docker Compose وارد عمل میشود. Docker Compose ابزاری قدرتمند است که برای تعریف و اجرای برنامههای چندکانتینری داکر طراحی شده است. با استفاده از یک فایل پیکربندی ساده (معمولاً با نام docker-compose.yml)، میتوانید تمامی سرویسهای مورد نیاز برنامه خود را تعریف کنید، شامل تصاویر داکر (Docker Images) برای هر سرویس، پورتهای مورد نیاز، متغیرهای محیطی، شبکهها، و حجمهای ذخیرهسازی. سپس، با یک دستور واحد، Docker Compose تمامی کانتینرهای تعریف شده را راهاندازی، متصل و مدیریت میکند. این قابلیت به ویژه برای محیطهای توسعه محلی، تست، و استقرار برنامههای کوچک و متوسط بسیار ارزشمند است، زیرا به شما امکان میدهد تا کل پشته برنامه خود را به راحتی بالا بیاورید و پایین بیاورید.
این راهنمای جامع به شما کمک میکند تا Docker Compose را بر روی سه سیستم عامل اصلی یعنی لینوکس، مک و ویندوز نصب و راهاندازی کنید. ما نه تنها به جزئیات مراحل نصب خواهیم پرداخت، بلکه نگاهی عمیقتر به نحوه عملکرد Docker Compose و تفاوتهای نسخههای مختلف آن خواهیم داشت. هدف این مقاله، ارائه یک منبع معتبر و کامل برای توسعهدهندگان، مهندسان DevOps و هر کسی است که به دنبال بهینهسازی فرآیندهای توسعه و استقرار خود با استفاده از کانتینرها است.
پیشنیازهای نصب و راهاندازی Docker Compose
قبل از اینکه بتوانید Docker Compose را نصب و استفاده کنید، لازم است که Docker Engine (که به سادگی به عنوان داکر شناخته میشود) بر روی سیستم عامل شما نصب و فعال باشد. Docker Engine مؤلفه اصلی داکر است که مسئولیت ساخت، ارسال، و اجرای کانتینرها را بر عهده دارد. Docker Compose در واقع یک ابزار کمکی است که بر پایه Docker Engine عمل میکند و بدون آن قادر به کار نخواهد بود.
نصب Docker Engine
اطمینان حاصل کنید که Docker Engine بر روی سیستم شما نصب شده است. اگر قبلاً این کار را انجام ندادهاید، میتوانید به مستندات رسمی داکر برای دستورالعملهای نصب مراجعه کنید. فرآیند نصب Docker Engine برای هر سیستم عامل کمی متفاوت است:
- برای لینوکس: معمولاً شامل افزودن مخزن داکر، بهروزرسانی لیست پکیجها و نصب پکیجهای مربوطه است. ممکن است نیاز باشد کاربر فعلی را به گروه
dockerاضافه کنید تا بدونsudoبتوانید دستورات داکر را اجرا کنید. - برای مک و ویندوز: سادهترین راه برای نصب Docker Engine استفاده از Docker Desktop است. Docker Desktop یک بسته همهکاره است که شامل Docker Engine، Docker CLI، Docker Compose و Kubernetes (اختیاری) میشود. نصب Docker Desktop بر روی مک و ویندوز فرآیندی ساده و گرافیکی دارد و تمامی پیشنیازها را فراهم میکند.
بررسی نصب Docker Engine
پس از نصب Docker Engine، میتوانید با اجرای دستور زیر در ترمینال یا Command Prompt از نصب صحیح آن اطمینان حاصل کنید:
docker --version
docker run hello-world
دستور docker --version باید نسخه Docker Engine نصب شده را نمایش دهد. دستور docker run hello-world یک کانتینر کوچک “hello-world” را اجرا میکند که در صورت موفقیتآمیز بودن، پیامی مبنی بر موفقیتآمیز بودن نصب و راهاندازی داکر را در خروجی نمایش میدهد.
پس از تأیید نصب و عملکرد صحیح Docker Engine، میتوانید به مرحله نصب Docker Compose بر روی سیستم عامل خود بپردازید. در ادامه، ما نصب و راهاندازی Docker Compose را برای هر یک از سیستم عاملهای لینوکس، مک و ویندوز به صورت جداگانه و با جزئیات کامل بررسی خواهیم کرد.
نصب Docker Compose در لینوکس
نصب Docker Compose در لینوکس میتواند به دو روش اصلی انجام شود: دانلود مستقیم باینری یا استفاده از مدیران پکیج. نکته مهمی که باید در نظر داشته باشید، تفاوت بین Docker Compose V1 (که یک باینری مستقل با نام docker-compose بود) و Docker Compose V2 (که به عنوان یک پلاگین برای Docker CLI با نام docker compose عمل میکند) است. در حال حاضر، توصیه میشود از Docker Compose V2 استفاده کنید، زیرا این نسخه جدیدتر است و به صورت یکپارچهتر با Docker CLI کار میکند.
روش ۱: نصب Docker Compose V2 به عنوان پلاگین Docker CLI (توصیه شده)
از نسخه Docker Engine 19.03 به بعد، Docker Compose V2 به عنوان یک پلاگین داخلی برای Docker CLI ارائه شده است. اگر Docker Desktop را نصب کرده باشید، Docker Compose V2 به طور خودکار همراه آن نصب میشود. برای کاربران لینوکس که فقط Docker Engine را نصب کردهاند، میتوان آن را به صورت دستی نصب کرد.
مرحله ۱: بررسی نسخه فعلی Docker Compose (اختیاری)
اگر قبلاً Docker Compose V1 را نصب کردهاید، میتوانید نسخه آن را با دستور زیر بررسی کنید:
docker-compose --version
و برای Docker Compose V2 (پلاگین):
docker compose version
اگر هیچ یک از دستورات بالا کار نکرد، به این معنی است که Docker Compose هنوز نصب نشده است.
مرحله ۲: نصب Docker Compose V2 (پلاگین)
برای نصب Docker Compose V2 به عنوان پلاگین، میتوانید از روشهای مختلفی استفاده کنید. سادهترین راه، نصب آن از طریق مخزن رسمی داکر است، البته این روش بسته به توزیع لینوکس شما ممکن است متفاوت باشد. اگر از یک توزیع محبوب مانند Ubuntu/Debian استفاده میکنید، معمولاً با نصب پکیج Docker Desktop یا پکیج docker-compose-plugin (در نسخههای جدیدتر) انجام میشود.
اگر Docker Desktop را روی لینوکس نصب کردهاید، Docker Compose V2 به طور خودکار همراه آن نصب شده است. برای بررسی، دستور docker compose version را اجرا کنید.
در صورتی که Docker Desktop را نصب نکردهاید و میخواهید Docker Compose V2 را به صورت جداگانه نصب کنید، میتوانید از روش دانلود باینری استفاده کنید. این روش اطمینان میدهد که شما جدیدترین نسخه را در اختیار دارید.
دانلود و نصب باینری Docker Compose V2:
- دانلود باینری: آخرین نسخه باینری Docker Compose را از مخزن GitHub دانلود کنید. برای پیدا کردن آخرین نسخه، به صفحه releases در GitHub Docker Compose مراجعه کنید. سپس دستور زیر را با جایگزینی
<version>با آخرین نسخه (مثلاًv2.24.5) اجرا کنید: - اعمال مجوزهای اجرایی: پس از دانلود، باید مجوزهای اجرایی را به فایل بدهید:
- اعمال مجوزهای اجرایی (برای استفاده بدون sudo): برای اینکه Docker Compose V2 را بدون
sudoاجرا کنید، باید اطمینان حاصل کنید که کاربر فعلی شما در گروهdockerقرار دارد: - بررسی نصب: اکنون میتوانید نصب موفقیتآمیز Docker Compose V2 را بررسی کنید:
sudo curl -L https://github.com/docker/compose/releases/download/<version>/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
توجه: مسیر /usr/local/lib/docker/cli-plugins/ محل پیشفرض برای پلاگینهای Docker CLI است. اگر این مسیر وجود ندارد، ممکن است نیاز باشد آن را ایجاد کنید:
sudo mkdir -p /usr/local/lib/docker/cli-plugins
همچنین، ممکن است بخواهید آن را در /usr/local/bin نیز قرار دهید و یک سیملینک به مسیر پلاگین ایجاد کنید یا به سادگی باینری را به /usr/local/bin/docker-compose تغییر نام دهید و سپس یک alias در bashrc برای docker compose ایجاد کنید تا به این باینری اشاره کند. اما بهترین روش پیروی از ساختار پلاگین داکر است.
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo usermod -aG docker $USER
newgrp docker # یا یک بار از سیستم خارج شوید و دوباره وارد شوید
docker compose version
این دستور باید نسخه Docker Compose V2 را نمایش دهد.
روش ۲: نصب Docker Compose V1 (باینری مستقل – منسوخ شده)
اگر به دلایلی نیاز به استفاده از Docker Compose V1 دارید (که دیگر توصیه نمیشود و توسعه آن متوقف شده است)، میتوانید آن را به عنوان یک باینری مستقل نصب کنید.
مرحله ۱: دانلود باینری Docker Compose V1
باینری Docker Compose را از مخزن GitHub دانلود کنید. آخرین نسخه پایدار V1 را از صفحه releases در GitHub Docker Compose پیدا کنید. سپس دستور زیر را با جایگزینی <version> با آخرین نسخه (مثلاً 1.29.2) اجرا کنید:
sudo curl -L "https://github.com/docker/compose/releases/download/<version>/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
مرحله ۲: اعمال مجوزهای اجرایی
پس از دانلود، باید مجوزهای اجرایی را به فایل بدهید:
sudo chmod +x /usr/local/bin/docker-compose
مرحله ۳: بررسی نصب
اکنون میتوانید نصب موفقیتآمیز Docker Compose V1 را بررسی کنید:
docker-compose --version
این دستور باید نسخه Docker Compose V1 را نمایش دهد.
توصیه نهایی برای لینوکس
همیشه توصیه میشود که جدیدترین نسخه Docker Compose V2 را نصب کنید. این نسخه به طور فعال توسعه مییابد و بهترین یکپارچگی را با Docker CLI مدرن فراهم میکند. در اکثر توزیعهای لینوکس مدرن، با نصب Docker Desktop یا پکیجهای مرتبط از مخازن داکر، Docker Compose V2 به صورت خودکار نصب میشود.
نصب Docker Compose در macOS
نصب Docker Compose بر روی macOS به طور قابل توجهی سادهتر از لینوکس است، زیرا Docker Compose به صورت پیشفرض همراه با Docker Desktop برای مک ارائه میشود. Docker Desktop یک راه حل یکپارچه است که شامل Docker Engine، Docker CLI، Docker Compose و Kubernetes (اختیاری) میشود.
روش ۱: نصب Docker Desktop برای مک (توصیه شده)
این روش، سادهترین و توصیهشدهترین راه برای نصب و استفاده از داکر و داکر کامپوز بر روی macOS است.
مرحله ۱: دانلود Docker Desktop
به وبسایت رسمی Docker بروید و Docker Desktop را برای مک دانلود کنید. میتوانید آن را از آدرس https://www.docker.com/products/docker-desktop/ پیدا کنید. اطمینان حاصل کنید که نسخه مناسب برای پردازنده مک خود (Intel یا Apple Chip) را دانلود میکنید.
مرحله ۲: نصب Docker Desktop
پس از دانلود فایل .dmg، آن را باز کنید. برنامه Docker را به پوشه Applications خود بکشید. سپس Docker را از پوشه Applications یا Launchpad اجرا کنید. در اولین اجرا، Docker Desktop از شما میخواهد که مجوزهای لازم را برای نصب مؤلفههای داخلی آن بدهید (مانند Virtualization framework). دستورالعملهای روی صفحه را دنبال کنید و در صورت نیاز رمز عبور مک خود را وارد کنید.
مرحله ۳: راهاندازی و بررسی
پس از نصب، آیکون Docker در نوار منوی بالای صفحه مک ظاهر میشود. ممکن است چند دقیقه طول بکشد تا Docker Desktop به طور کامل راهاندازی شود. پس از اینکه وضعیت آن به “Docker Desktop is running” تغییر کرد، میتوانید ترمینال خود را باز کرده و نصب Docker و Docker Compose را بررسی کنید:
docker --version
docker compose version
هر دو دستور باید نسخه نصب شده را نمایش دهند. docker compose version باید نسخه Docker Compose V2 را نشان دهد، که به طور پیشفرض توسط Docker Desktop نصب میشود.
روش ۲: نصب با Homebrew (فقط برای Docker Compose V1 – منسوخ شده)
قبلاً امکان نصب Docker Compose V1 از طریق Homebrew وجود داشت. اما با معرفی Docker Compose V2 و یکپارچگی آن با Docker CLI و Docker Desktop، این روش دیگر توصیه نمیشود و Homebrew معمولاً پکیج docker-compose را به عنوان یک وابستگی از docker نصب میکند که به V2 اشاره دارد.
اگر به هر دلیلی نیاز به نصب Docker Compose V1 با Homebrew داشتید (که مجدداً تأکید میشود منسوخ شده است)، مراحل به شرح زیر بود:
- نصب Homebrew: اگر Homebrew را نصب ندارید، آن را با دستور زیر نصب کنید:
- نصب Docker Compose V1: با استفاده از Homebrew دستور زیر را اجرا کنید:
- بررسی نصب:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install docker-compose
docker-compose --version
اما برای کاربران مک، بهترین رویکرد نصب Docker Desktop است که تمامی ابزارهای لازم را به صورت یکپارچه فراهم میکند و از جدیدترین قابلیتها و بهترین عملکرد بهرهمند میشوید.
نصب Docker Compose در ویندوز
مشابه macOS، نصب Docker Compose بر روی ویندوز نیز به سادگی از طریق Docker Desktop انجام میشود. Docker Desktop برای ویندوز شامل Docker Engine، Docker CLI و Docker Compose است و از WSL 2 (Windows Subsystem for Linux 2) برای اجرای محیط داکر استفاده میکند که بهترین عملکرد و سازگاری را فراهم میکند.
روش ۱: نصب Docker Desktop برای ویندوز (توصیه شده)
این روش، سادهترین و توصیهشدهترین راه برای نصب و استفاده از داکر و داکر کامپوز بر روی ویندوز است.
مرحله ۱: پیشنیازها برای WSL 2
Docker Desktop برای ویندوز نیاز به WSL 2 دارد تا بتواند به درستی کار کند. اطمینان حاصل کنید که WSL 2 بر روی سیستم شما فعال و نصب شده است. اگر نیست، مراحل زیر را دنبال کنید:
- فعالسازی ویژگیهای اختیاری ویندوز: در PowerShell (با دسترسی Administrator) دستورات زیر را اجرا کنید:
- ریاستارت سیستم: پس از اجرای دستورات بالا، سیستم خود را ریاستارت کنید.
- نصب بسته بهروزرسانی هسته WSL 2: آخرین بسته بهروزرسانی هسته WSL 2 را از وبسایت مایکروسافت دانلود و نصب کنید.
- تنظیم WSL 2 به عنوان نسخه پیشفرض: در PowerShell دستور زیر را اجرا کنید:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
اکنون WSL 2 آماده است.
مرحله ۲: دانلود Docker Desktop
به وبسایت رسمی Docker بروید و Docker Desktop را برای ویندوز دانلود کنید. میتوانید آن را از آدرس https://www.docker.com/products/docker-desktop/ پیدا کنید.
مرحله ۳: نصب Docker Desktop
فایل .exe دانلود شده را اجرا کنید. در طول فرآیند نصب، اطمینان حاصل کنید که گزینه “Install required Windows components for WSL 2” (یا مشابه آن) فعال است. دستورالعملهای روی صفحه را دنبال کنید. ممکن است نیاز باشد سیستم خود را ریاستارت کنید.
مرحله ۴: راهاندازی و بررسی
پس از نصب، Docker Desktop به صورت خودکار راهاندازی میشود. آیکون آن در نوار وظیفه ویندوز (System Tray) ظاهر میشود. ممکن است چند دقیقه طول بکشد تا Docker Desktop به طور کامل راهاندازی شود و “Docker Desktop is running” را نمایش دهد. پس از آن، Command Prompt یا PowerShell را باز کرده و نصب Docker و Docker Compose را بررسی کنید:
docker --version
docker compose version
هر دو دستور باید نسخه نصب شده را نمایش دهند. docker compose version باید نسخه Docker Compose V2 را نشان دهد.
تفاوت در مسیرها و محیطها
هنگام کار با Docker Compose در ویندوز، ممکن است با چالشهایی در مورد مسیرهای فایل (path) بین محیط ویندوز و محیط لینوکس WSL 2 مواجه شوید. Docker Desktop به خوبی این موارد را مدیریت میکند، اما در فایلهای docker-compose.yml، هنگام تعریف حجمها (volumes)، دقت کنید که از مسیرهای صحیح استفاده کنید. برای مثال، برای اشاره به یک پوشه در درایو C ویندوز، در WSL 2 باید از فرمت /mnt/c/Users/YourUser/YourProject استفاده کنید.
نصب Docker Compose از طریق Docker Desktop بر روی ویندوز، بهینهترین و سادهترین راه برای بهرهمندی از تمامی قابلیتهای اکوسیستم داکر است.
مفاهیم اساسی و شروع کار با Docker Compose
پس از اتمام نصب Docker Compose، زمان آن است که با مفاهیم اساسی آن آشنا شوید و اولین برنامه چندکانتینری خود را راهاندازی کنید. هسته اصلی Docker Compose، فایل docker-compose.yml است که در آن تمامی سرویسها، شبکهها، و حجمهای ذخیرهسازی برنامه شما تعریف میشوند.
فایل docker-compose.yml
این فایل، که معمولاً با فرمت YAML نوشته میشود، به Docker Compose میگوید که چگونه سرویسهای شما را بسازد، اجرا کند، و به یکدیگر متصل کند. ساختار کلی آن شامل یک نسخه (version)، یک بخش services برای تعریف کانتینرها، و بخشهای اختیاری networks و volumes است.
ساختار پایه فایل docker-compose.yml
version: '3.8' # نسخه داکر کامپوز
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
depends_on:
- app # این سرویس به 'app' وابسته است
networks:
- my-network
app:
build: . # ساخت از Dockerfile در همین دایرکتوری
ports:
- "5000:5000"
environment:
DATABASE_URL: postgres://user:password@db:5432/mydatabase
networks:
- my-network
volumes:
- .:/app # ماونت کردن کد منبع به داخل کانتینر
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- my-network
volumes:
db_data: # تعریف یک Named Volume
networks:
my-network: # تعریف یک شبکه سفارشی
در این مثال:
version: '3.8': نسخه سینتکس Docker Compose را مشخص میکند. همیشه از آخرین نسخه پایدار استفاده کنید.services: شامل تعریف کانتینرهای مختلف برنامه شما است.web: یک سرویس Nginx است که پورت 80 میزبان را به پورت 80 کانتینر مپ میکند، فایلهای پیکربندی و محتوا را ماونت میکند و به سرویسappوابسته است.app: یک سرویس برنامه سفارشی است که از یک Dockerfile در همان دایرکتوری ساخته میشود، پورت 5000 را مپ میکند، متغیرهای محیطی برای اتصال به دیتابیس را تنظیم میکند و کد منبع را ماونت میکند.db: یک سرویس دیتابیس PostgreSQL است که متغیرهای محیطی برای پیکربندی دیتابیس را تنظیم میکند و از یک Named Volume برای ذخیرهسازی دادهها استفاده میکند.
volumes: بخشی برای تعریف Named Volumes است که دادههای پایا را ذخیره میکنند.db_dataیک نمونه است.networks: برای تعریف شبکههای سفارشی است که سرویسها میتوانند از طریق آنها با یکدیگر ارتباط برقرار کنند.my-networkیک نمونه است.
دستورات اساسی Docker Compose
پس از ایجاد فایل docker-compose.yml، میتوانید از دستورات زیر برای مدیریت برنامه خود استفاده کنید. فرض میکنیم شما در دایرکتوری حاوی فایل docker-compose.yml قرار دارید:
docker compose up:این دستور تمامی سرویسهای تعریف شده در فایل
docker-compose.ymlرا راهاندازی میکند. اگر تصاویر (images) وجود نداشته باشند، آنها را دانلود میکند (یا میسازد). همچنین شبکهها و حجمهای ذخیرهسازی لازم را ایجاد میکند. میتوانید از گزینههای زیر استفاده کنید:docker compose up: سرویسها را در Foreground (پیشزمینه) راهاندازی میکند. خروجی لاگها را مستقیماً در ترمینال نمایش میدهد.docker compose up -d: سرویسها را در Detached mode (پسزمینه) راهاندازی میکند. این برای اجرا کردن برنامه به عنوان یک سرویس پسزمینه مفید است.docker compose up --build: قبل از راهاندازی، تصاویر را دوباره میسازد، حتی اگر نسخههای کش شده موجود باشند. برای زمانی که Dockerfile تغییر کرده باشد مفید است.
docker compose up -ddocker compose ps:وضعیت تمامی کانتینرهای مربوط به برنامه فعلی را نمایش میدهد. این شامل نام کانتینر، فرمان اجرا شده، وضعیت و پورتهای مپ شده است.
docker compose psdocker compose logs:لاگهای (logs) سرویسهای برنامه را نمایش میدهد. میتوانید نام سرویس را مشخص کنید تا فقط لاگهای آن سرویس را ببینید، یا از
-fبرای دنبال کردن لاگها در زمان واقعی استفاده کنید.docker compose logs -f webdocker compose stop:تمامی سرویسهای در حال اجرا را متوقف میکند، اما کانتینرها را حذف نمیکند. کانتینرها در حالت توقف باقی میمانند و میتوانند دوباره راهاندازی شوند.
docker compose stopdocker compose start:سرویسهای متوقف شده را دوباره راهاندازی میکند.
docker compose startdocker compose restart:تمامی سرویسها را متوقف کرده و دوباره راهاندازی میکند.
docker compose restartdocker compose down:تمامی سرویسهای در حال اجرا را متوقف و حذف میکند. همچنین شبکههای ایجاد شده توسط Compose را حذف میکند. اگر از گزینه
-vاستفاده کنید، حجمهای ذخیرهسازی (volumes) تعریف شده در فایلdocker-compose.yml(مثلdb_dataدر مثال بالا) را نیز حذف میکند. این دستور برای پاکسازی محیط توسعه بسیار مفید است.docker compose down -vdocker compose exec <service_name> <command>:یک دستور را درون یک کانتینر در حال اجرا اجرا میکند. برای مثال، برای ورود به یک shell در کانتینر برنامه:
docker compose exec app bash
با این دستورات اساسی، شما میتوانید به راحتی برنامههای چندکانتینری خود را با Docker Compose مدیریت کنید. در بخشهای بعدی، به مفاهیم پیشرفتهتر و بهترین شیوهها خواهیم پرداخت.
مفاهیم پیشرفته و بهترین شیوهها در Docker Compose
پس از آشنایی با اصول اولیه، برای بهرهبرداری کامل از Docker Compose و ساختن محیطهای توسعه و استقرار قدرتمندتر، لازم است با مفاهیم پیشرفتهتر و بهترین شیوهها آشنا شوید. این موارد به شما کمک میکنند تا فایلهای docker-compose.yml خود را ماژولارتر، قابل نگهداریتر و مقیاسپذیرتر بسازید.
۱. استفاده از فایلهای .env برای متغیرهای محیطی
گنجاندن اطلاعات حساس مانند رمز عبور دیتابیس یا کلیدهای API مستقیماً در فایل docker-compose.yml توصیه نمیشود، به خصوص اگر این فایل به سیستم کنترل نسخه (مانند Git) اضافه شود. Docker Compose به شما امکان میدهد متغیرهای محیطی را از یک فایل .env بارگذاری کنید. این فایل باید در همان دایرکتوری فایل docker-compose.yml قرار گیرد.
مثال .env:
DB_USER=myuser
DB_PASSWORD=mysecretpassword
DB_NAME=mydb
APP_PORT=5000
استفاده در docker-compose.yml:
version: '3.8'
services:
app:
build: .
ports:
- "${APP_PORT}:${APP_PORT}" # استفاده از متغیر محیطی
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
Docker Compose به طور خودکار متغیرهای تعریف شده در فایل .env را بارگذاری کرده و جایگزین مقادیر ${VAR_NAME} در فایل docker-compose.yml میکند.
۲. گسترشدهی و بازاستفاده با extends و چند فایل Compose
برای پروژههای بزرگتر یا محیطهای مختلف (توسعه، تست، تولید)، ممکن است بخواهید فایل docker-compose.yml خود را به چند فایل کوچکتر تقسیم کنید تا مدیریت آن آسانتر شود و از تکرار جلوگیری شود.
extends(منسوخ شده، از Docker Compose V2 توصیه نمیشود): قبلاً ازextendsبرای به اشتراک گذاشتن پیکربندی سرویسها استفاده میشد، اما این ویژگی در Docker Compose V2 به نفع استفاده از چندین فایل Compose و قابلیتinclude(در نسخههای جدیدتر) منسوخ شده است.- چندین فایل Compose: روش مدرن و توصیه شده، استفاده از چندین فایل
docker-compose.ymlاست. میتوانید یک فایل پایه برای پیکربندیهای مشترک داشته باشید و سپس فایلهای اضافی برای overrides خاص محیط (مثلاًdocker-compose.dev.ymlیاdocker-compose.prod.yml) ایجاد کنید.
مثال با چند فایل Compose:
docker-compose.yml (پیکربندی پایه):
version: '3.8'
services:
app:
build: .
volumes:
- .:/app
networks:
- my-network
# ... سایر تنظیمات مشترک
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- my-network
volumes:
db_data:
networks:
my-network:
docker-compose.dev.yml (تنظیمات خاص توسعه):
version: '3.8'
services:
app:
command: ["python", "app.py", "--debug"] # اجرای برنامه با حالت debug
ports:
- "5000:5000" # مپ کردن پورت فقط در توسعه
environment:
DEBUG_MODE: "true"
db:
ports:
- "5432:5432" # دسترسی مستقیم به دیتابیس در توسعه
برای استفاده از هر دو فایل، دستور docker compose را با گزینه -f اجرا کنید:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
ترتیب فایلها مهم است؛ فایلهای بعدی مقادیر فایلهای قبلی را override میکنند.
۳. مدیریت حجمهای ذخیرهسازی (Volumes)
حجمهای ذخیرهسازی برای نگهداری دادههای پایا استفاده میشوند که باید مستقل از چرخه حیات کانتینر باشند. Docker Compose دو نوع اصلی حجم را پشتیبانی میکند:
- Bind Mounts: یک دایرکتوری یا فایل از سیستم میزبان را به داخل کانتینر ماونت میکند. این برای توسعه (مانند ماونت کردن کد منبع) بسیار مفید است، زیرا تغییرات در سیستم میزبان بلافاصله در کانتینر منعکس میشوند.
volumes:
- ./my_app_code:/app # کد محلی به /app در کانتینر
- /path/on/host/data:/var/data # مسیر مطلق در میزبان
volumes:
- db_data:/var/lib/postgresql/data # db_data یک Named Volume است
volumes:
db_data: # تعریف Named Volume
driver: local # یا یک درایور دیگر مانند nfs
driver_opts:
type: nfs
o: addr=192.168.1.1,rw
device: ":/path/to/share"
۴. پیکربندی شبکه (Networking)
Docker Compose به طور پیشفرض یک شبکه bridge برای تمامی سرویسهای تعریف شده در یک فایل docker-compose.yml ایجاد میکند. این به سرویسها امکان میدهد که با استفاده از نام سرویس (مانند db یا app) با یکدیگر ارتباط برقرار کنند. با این حال، میتوانید شبکههای سفارشی نیز تعریف کنید:
- شبکههای سفارشی: به شما کنترل بیشتری بر روی ایزولهسازی و اتصال کانتینرها میدهد.
services:
app:
networks:
- backend_network
web:
networks:
- frontend_network
- backend_network
networks:
frontend_network:
backend_network:
networks:
external_network:
external: true
name: my_pre_existing_network # نام شبکه خارجی موجود
۵. Health Checks (بررسی سلامت)
Health checks به داکر و Docker Compose اجازه میدهند تا وضعیت سلامت یک کانتینر را تشخیص دهند. این برای تعیین اینکه آیا یک سرویس آماده پذیرش درخواستها است یا خیر، بسیار مهم است. برای مثال، یک کانتینر دیتابیس ممکن است راهاندازی شده باشد، اما هنوز آماده پذیرش اتصالات نباشد.
services:
db:
image: postgres:13
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
interval: 5s
timeout: 5s
retries: 5
start_period: 10s # صبر قبل از شروع تست سلامت
۶. Resource Limits (محدودیت منابع)
برای جلوگیری از مصرف بیش از حد منابع سیستم توسط یک کانتینر، میتوانید محدودیتهایی برای CPU و RAM آن تعریف کنید:
services:
app:
deploy:
resources:
limits:
cpus: '0.5' # محدودیت 0.5 هسته CPU
memory: 512M # محدودیت 512 مگابایت رم
reservations:
cpus: '0.25' # رزرو 0.25 هسته CPU
memory: 128M # رزرو 128 مگابایت رم
این بخش deploy بیشتر برای محیطهای production و استفاده با Docker Swarm یا Kubernetes است، اما برای توسعه محلی نیز میتواند مفید باشد.
۷. ساخت تصاویر (Building Images)
اگر از تصاویر داکر از Docker Hub استفاده نمیکنید و نیاز به ساخت تصاویر سفارشی دارید، میتوانید از دستور build استفاده کنید:
services:
app:
build:
context: ./app # مسیر Dockerfile
dockerfile: Dockerfile.prod # نام Dockerfile (اگر غیر از Dockerfile باشد)
args:
- HTTP_PROXY=http://proxy.example.com
# ...
با استفاده از این مفاهیم پیشرفته، میتوانید محیطهای توسعه و تست خود را با Docker Compose به مراتب قدرتمندتر، قابل نگهداریتر و نزدیکتر به محیط تولید بسازید.
مقایسه Docker Compose V1 و V2
یکی از تغییرات مهم در اکوسیستم داکر، تکامل Docker Compose از یک ابزار مستقل (V1) به یک پلاگین یکپارچه با Docker CLI (V2) است. درک این تفاوتها برای کاربران ضروری است تا از بهترین شیوهها و قابلیتهای جدید بهرهمند شوند.
Docker Compose V1 (Legacy)
Docker Compose V1 یک باینری پایتون مستقل بود که معمولاً با نام docker-compose در ترمینال فراخوانی میشد. این نسخه در طول سالیان متمادی ابزاری اساسی برای تعریف و اجرای برنامههای چندکانتینری بوده است.
ویژگیها و مشخصات V1:
- نصب مستقل: به صورت یک پکیج جداگانه نصب میشد و مدیریت آن مستقل از Docker Engine بود.
- پایتون: با پایتون نوشته شده بود.
- سینتکس دستور: دستورات با
docker-compose <command>شروع میشدند (مثلاًdocker-compose up). - عملکرد: در برخی موارد، ممکن بود به دلیل ماهیت پایتونی آن و نحوه ارتباط با داکر، کمی کندتر عمل کند.
- پایان عمر: توسعه فعال V1 متوقف شده است و دیگر بهروزرسانیهای جدیدی دریافت نمیکند (به جز رفع باگهای بحرانی).
Docker Compose V2 (Current Standard)
Docker Compose V2 بازنویسی شده Docker Compose است که به زبان Go نوشته شده و به عنوان یک پلاگین بومی برای Docker CLI عمل میکند. این بدان معناست که دیگر یک ابزار کاملاً مستقل نیست، بلکه بخشی از تجربه یکپارچه Docker CLI است.
ویژگیها و مشخصات V2:
- یکپارچگی با Docker CLI: به عنوان یک زیردستور (subcommand) از Docker CLI با نام
docker composeفراخوانی میشود (مثلاًdocker compose up). این یکپارچگی باعث میشود که تمامی دستورات داکر در یک مکان و با یک سینتکس مشابه قرار گیرند. - نصب خودکار: در اکثر موارد، به خصوص با نصب Docker Desktop، Docker Compose V2 به طور خودکار نصب میشود.
- Go Lang: با زبان Go نوشته شده که به طور کلی به دلیل ماهیت کامپایلشده و بهینهسازیهای آن، عملکرد بهتری را ارائه میدهد.
- عملکرد بهبود یافته: سرعت اجرا و مدیریت منابع آن بهبود یافته است.
- توسعه فعال: این نسخه در حال حاضر به طور فعال توسعه مییابد و تمامی قابلیتهای جدید و رفع باگها در این نسخه ارائه میشوند.
- سازگاری: با فایلهای
docker-compose.yml(از جمله نسخههای 3.x) کاملاً سازگار است و نیازی به تغییر در فایلهای پیکربندی موجود نیست.
جدول مقایسه
| ویژگی | Docker Compose V1 | Docker Compose V2 |
|---|---|---|
| نام فرمان اجرایی | docker-compose |
docker compose |
| نوع | باینری مستقل | پلاگین Docker CLI |
| زبان توسعه | پایتون | Go Lang |
| وضعیت توسعه | پایان عمر (EOL) | توسعه فعال |
| عملکرد | متوسط | بهتر و سریعتر |
| نحوه نصب | معمولاً به صورت جداگانه (مثلاً با pip یا curl) | همراه Docker Desktop یا به عنوان پکیج docker-compose-plugin |
| یکپارچگی CLI | ندارد | یکپارچه با docker |
مهاجرت از V1 به V2
برای مهاجرت از Docker Compose V1 به V2، در اکثر موارد فقط کافی است دستورات خود را از docker-compose <command> به docker compose <command> تغییر دهید. فایلهای docker-compose.yml نیازی به تغییر ندارند زیرا V2 کاملاً با فرمت V1 سازگار است.
در واقع، اگر Docker Desktop را نصب کردهاید، Docker Compose V2 به طور پیشفرض در دسترس شما است و میتوانید بلافاصله از آن استفاده کنید. برای کاربران لینوکس که Docker Compose V1 را به صورت دستی نصب کرده بودند، توصیه میشود باینری V1 را حذف کرده و Docker Compose V2 را به عنوان پلاگین نصب کنند تا از مزایای آن بهرهمند شوند.
استفاده از Docker Compose V2 نه تنها عملکرد بهتری را ارائه میدهد، بلکه شما را با استانداردهای جدید اکوسیستم داکر همسو میکند و تجربه کاربری یکپارچهتری را فراهم میآورد.
عیبیابی مشکلات رایج در Docker Compose
حتی با دقیقترین دستورالعملها، ممکن است در طول نصب یا استفاده از Docker Compose با مشکلاتی مواجه شوید. این بخش به بررسی برخی از مشکلات رایج و راهحلهای آنها میپردازد.
۱. خطای “docker: command not found” یا “docker compose: command not found”
علت:
- Docker Engine یا Docker Compose به درستی نصب نشدهاند.
- مسیر (PATH) سیستم به باینریهای داکر اضافه نشده است.
راهحل:
- نصب صحیح: اطمینان حاصل کنید که Docker Engine (و Docker Desktop برای مک/ویندوز) و Docker Compose به درستی نصب شدهاند. دستورات نصب را دوباره بررسی کنید.
- بررسی PATH: مطمئن شوید که دایرکتوری حاوی باینریهای داکر (معمولاً
/usr/local/binدر لینوکس یا محل نصب Docker Desktop) در متغیر محیطی PATH سیستم شما قرار دارد. پس از نصب، معمولاً نیاز است ترمینال را بسته و دوباره باز کنید.
۲. خطای “permission denied” هنگام اجرای دستورات داکر
علت:
- کاربر فعلی شما در گروه
dockerقرار ندارد یا تغییرات اعمال نشدهاند.
راهحل (فقط برای لینوکس):
- کاربر خود را به گروه
dockerاضافه کنید:sudo usermod -aG docker $USER - پس از افزودن، از سیستم خارج شوید و دوباره وارد شوید یا دستور
newgrp dockerرا اجرا کنید تا تغییرات اعمال شوند. - اگر نمیخواهید از
sudoاستفاده کنید، اما به دلایل امنیتی گروهdockerرا اضافه نمیکنید، باید همیشه دستورات داکر را باsudoاجرا کنید (مثلاًsudo docker compose up). اما این توصیه نمیشود.
۳. خطاهای سینتکسی در فایل docker-compose.yml
علت:
- خطا در نگارش YAML (فاصلهگذاری نامناسب، استفاده از تب به جای فاصله، کاراکترهای نامعتبر).
- پیکربندی نامعتبر (مثلاً استفاده از کلیدهای ناموجود یا مقادیر اشتباه).
راهحل:
- اعتبارسنجی YAML: از یک ابزار اعتبارسنجی YAML آنلاین یا یک IDE با افزونههای YAML linting استفاده کنید تا خطاهای سینتکسی را پیدا کنید.
- مستندات: مستندات رسمی Docker Compose را برای سینتکس صحیح هر بخش بررسی کنید.
- پیام خطا: پیام خطای Docker Compose معمولاً محل و نوع خطا را به خوبی نشان میدهد. به دقت آن را بخوانید.
۴. کانتینرها راهاندازی نمیشوند یا بلافاصله از کار میافتند
علت:
- تصویر داکر (Docker Image) مشکل دارد یا پیدا نمیشود.
- دستورات ورودی کانتینر (
commandیاentrypoint) اشتباه هستند. - وابستگیها (مانند دیتابیس) قبل از شروع سرویس وابسته، آماده نیستند.
- پورتهای استفاده شده توسط کانتینر، قبلاً توسط فرآیند دیگری در سیستم میزبان اشغال شدهاند.
- متغیرهای محیطی مورد نیاز کانتینر تنظیم نشدهاند.
راهحل:
- بررسی لاگها: مهمترین قدم، بررسی لاگهای کانتینرهای مشکلساز با
docker compose logs <service_name>است. این معمولاً دلیل اصلی مشکل را نشان میدهد. - بررسی تصاویر: مطمئن شوید که تصاویر با استفاده از
docker imagesوجود دارند و درست هستند. اگر ازbuildاستفاده میکنید، دستورdocker compose buildرا به صورت جداگانه اجرا کنید تا ببینید آیا خطایی در ساخت تصویر وجود دارد. - وابستگیها (
depends_onو Health Check): ازdepends_onبرای اطمینان از ترتیب راهاندازی سرویسها استفاده کنید. برای سرویسهایی مانند دیتابیس، ازhealthcheckاستفاده کنید تا Compose منتظر بماند تا سرویس کاملاً آماده شود. - پورتها: با
netstat -tulnp(لینوکس) یاGet-NetTCPConnection | Where-Object {$_.State -eq 'Listen'}(پاورشل ویندوز) بررسی کنید که آیا پورت مورد نظر قبلاً اشغال شده است. اگر بله، پورتهای مپ شده درdocker-compose.ymlرا تغییر دهید. - متغیرهای محیطی: با
docker compose exec <service_name> envمتغیرهای محیطی داخل کانتینر را بررسی کنید.
۵. مشکلات شبکه بین کانتینرها
علت:
- کانتینرها در یک شبکه مشترک قرار ندارند.
- نامهای سرویس برای ارتباط داخلی به درستی استفاده نمیشوند.
- فایروال (در سیستم میزبان یا داخل کانتینر) ارتباط را مسدود کرده است.
راهحل:
- تعریف شبکه: اطمینان حاصل کنید که تمامی سرویسهایی که نیاز به ارتباط با یکدیگر دارند، در یک شبکه مشترک تعریف شدهاند (مانند
my-networkدر مثالهای بالا). - استفاده از نام سرویس: برای ارتباط بین کانتینرها، از نام سرویس تعریف شده در فایل
docker-compose.ymlبه عنوان نام هاست استفاده کنید (مثلاًhttp://app:5000). - بررسی فایروال: فایروال سیستم میزبان را بررسی کنید که آیا پورتهای مورد نیاز مسدود شدهاند.
۶. مشکلات با حجمهای ذخیرهسازی (Volumes)
علت:
- مسیرهای Bind Mount اشتباه هستند.
- اجازههای دسترسی (permissions) برای Bind Mount ها در سیستم میزبان صحیح نیستند.
- Named Volume به درستی ایجاد نشده یا به اشتباه مپ شده است.
راهحل:
- بررسی مسیرها: مسیرهای Bind Mount را در
docker-compose.ymlبه دقت بررسی کنید. مسیر سمت میزبان باید یک مسیر معتبر در سیستم عامل شما باشد. - اجازههای دسترسی: اطمینان حاصل کنید که کاربر داکر در سیستم میزبان (یا کاربری که کانتینر با آن اجرا میشود) دارای اجازههای خواندن و نوشتن مناسب بر روی دایرکتوریهای ماونت شده است.
- بررسی Named Volumes: با
docker volume lsوdocker volume inspect <volume_name>وضعیت Named Volumes را بررسی کنید.
با رویکرد منظم و توجه به جزئیات، اکثر مشکلات Docker Compose قابل حل هستند. همیشه از لاگها به عنوان اولین منبع اطلاعات استفاده کنید و به مستندات رسمی داکر مراجعه کنید.
نتیجهگیری و آینده Docker Compose
در این راهنمای جامع، ما به طور کامل به نصب و راهاندازی Docker Compose بر روی سه سیستم عامل اصلی لینوکس، مک و ویندوز پرداختیم. از پیشنیازهای اولیه Docker Engine گرفته تا مراحل گام به گام نصب برای هر سیستم عامل، و سپس شیرجهای عمیق به مفاهیم اساسی و پیشرفته Docker Compose. ما با نحوه تعریف سرویسها، شبکهها و حجمهای ذخیرهسازی در فایل docker-compose.yml آشنا شدیم و دستورات کلیدی برای مدیریت برنامههای چندکانتینری را فرا گرفتیم. علاوه بر این، به بررسی بهترین شیوهها مانند استفاده از متغیرهای محیطی، چندین فایل Compose، Health Checks و محدودیت منابع پرداختیم تا به شما کمک کنیم محیطهای توسعه خود را بهینهتر و پایدارتر سازید. در نهایت، تفاوتهای اساسی بین Docker Compose V1 و V2 را تشریح کردیم و راهنمایی برای عیبیابی مشکلات رایج ارائه دادیم.
Docker Compose ابزاری بینهایت قدرتمند و انعطافپذیر است که فرآیند توسعه برنامههای چندکانتینری را به طرز چشمگیری ساده میکند. این ابزار به توسعهدهندگان امکان میدهد تا کل پشته برنامه خود را در یک فایل واحد تعریف کرده و با یک دستور آن را راهاندازی کنند، که این امر شبیهسازی محیط تولید را در توسعه محلی آسان میسازد. از زمان معرفی آن، Docker Compose به سنگ بنای بسیاری از جریانهای کاری DevOps تبدیل شده است و برای توسعهدهندگان فردی، تیمهای کوچک و حتی برای پروتوتایپسازی و تستهای CI/CD در پروژههای بزرگتر، ابزاری ضروری محسوب میشود.
آینده Docker Compose روشن به نظر میرسد، به خصوص با تمرکز بر Docker Compose V2 به عنوان یک پلاگین یکپارچه با Docker CLI. این رویکرد جدید نه تنها عملکرد و تجربه کاربری را بهبود بخشیده است، بلکه نشاندهنده تعهد داکر به ارائه یک اکوسیستم کانتینرسازی یکپارچه و قدرتمند است. با گذار به V2، کاربران میتوانند انتظار داشته باشند که ابزار قدرتمندتری را در اختیار داشته باشند که بهتر با سایر ابزارهای داکر مانند Docker Swarm و Kubernetes ادغام میشود.
با تسلط بر Docker Compose، شما نه تنها بهرهوری خود را در توسعه و استقرار برنامهها افزایش میدهید، بلکه مهارتهای حیاتی در زمینه کانتینرسازی و مدیریت زیرساختهای مدرن را نیز کسب میکنید. این ابزار، پلی ضروری بین توسعه محلی و محیطهای تولید کانتینری فراهم میکند و به شما امکان میدهد تا پیچیدگیهای مرتبط با برنامههای میکرو سرویس و معماریهای توزیع شده را به سادگی مدیریت کنید. امیدواریم این راهنما به شما در مسیر حرفهای و فنیتان یاری رسانده باشد و به شما در ساختن برنامههای کانتینری موفق کمک کند.
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان