پرش به مطلب اصلی

Docker

مقدمه​

در فازهای بعد با PostgreSQL و SQL Server کار می‌کنید. به‌جای نصب جداگانهٔ هر Database روی سیستم، در این فاز هر دو را با Docker بالا می‌آورید — با یک فایل Compose و یک دستور.

‌

هدف پایان این فاز: هر دو Database با docker compose up بالا باشند. اتصال با client و زدن query در فاز SQL است.

Docker چیست و چرا به درد می‌خورد؟​

Docker ابزاری است برای بسته‌بندی و اجرای نرم‌افزار داخل Container. به‌جای اینکه PostgreSQL یا SQL Server را مستقیم روی سیستم‌عامل نصب کنید، یک Image آماده می‌گیرید و از روی آن یک Container اجرا می‌کنید.

مزیت برای این مسیر:

  1. راه‌اندازی هر دو Database سریع و تکرارپذیر است.
  2. بعداً در Integration Test با Testcontainers همین ایدهٔ container را خود تست به‌صورت خودکار بالا می‌آورد.

قبل از ادامه:

‌

اگر ویدیو را ترجیح می‌دهید:

Docker in 100 Seconds

مفاهیم کلیدی​

Image در برابر Container​

  • Image: قالب فقط‌خواندنی (مثل PostgreSQL یا SQL Server آماده‌ی اجرا)
  • Container: یک نمونهٔ در حال اجرا از آن Image

Port mapping​

Database داخل Container روی یک port داخلی گوش می‌دهد. با port mapping آن را به port سیستم خودتان وصل می‌کنید تا از localhost به آن برسید.

مثال:

  • PostgreSQL داخل container روی 5432 → شما روی localhost:5432
  • SQL Server داخل container روی 1433 → شما روی localhost:1433

Environment variable​

Imageها معمولاً با environment variable پیکربندی می‌شوند؛ مثلاً رمز عبور یا نام Database. در Compose همین مقادیر را زیر کلید environment می‌نویسید.

Volume​

اگر Container را پاک کنید، دادهٔ داخلش ممکن است از بین برود. Volume داده را بیرون از عمر Container نگه می‌دارد تا با خاموش/روشن شدن از دست نرود.

Docker Compose چیست؟​

تا اینجا می‌توانستید برای هر Database یک دستور طولانی docker run بزنید. وقتی چند سرویس دارید، این کار زود شلوغ و سخت‌تکرار می‌شود.

Compose یعنی تعریف چند سرویس در یک فایل (معمولاً docker-compose.yml) و بالا آوردن همه‌شان با یک دستور.

در این فاز دقیقاً همین کار را می‌کنید: یک فایل می‌سازید که PostgreSQL و SQL Server را با هم تعریف کند، بعد up می‌کنید.

نصب Docker​

Docker Desktop را نصب کنید و مطمئن شوید روشن است:

‌

بعد از نصب در ترمینال بزنید:

docker version
docker compose version

اگر خطا داد، معمولاً Docker Desktop هنوز کامل بالا نیامده یا WSL2 / virtualization فعال نیست.

تمرین: ساخت Compose و بالا آوردن هر دو Database​

اینجا دو Database را بالا می‌آورید: PostgreSQL و SQL Server. لازم نیست الان عمیق بدانید Database چیست یا چطور query بزنید — فقط محیط را آماده می‌کنید. با خود Database و SQL در فاز بعد آشنا می‌شوید؛ همان‌جایی که به این دو سرویس وصل می‌شوید و با آن‌ها کار می‌کنید.

‌

Docker Hub و mcr.microsoft.com از داخل ایران معمولاً در دسترس نیستند. در این فاز Imageها را از کش‌رجیستری هم‌داکر (هم‌روش) می‌گیرید؛ همان Image رسمی است، فقط دامنه عوض شده.

۱) ساخت فایل​

یک پوشه بسازید (مثلاً mohaymen-databases) و داخلش فایل docker-compose.yml را با محتوای زیر بسازید:

services:
postgres:
image: hub.hamdocker.ir/library/postgres:16
container_name: mohaymen-postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: mohaymen
ports:
- "5432:5432"
volumes:
- mohaymen-pgdata:/var/lib/postgresql/data

sqlserver:
image: mcr.hamdocker.ir/mssql/server:2022-latest
container_name: mohaymen-sqlserver
environment:
ACCEPT_EULA: "Y"
MSSQL_SA_PASSWORD: "Your_strong_Password123"
ports:
- "1433:1433"
volumes:
- mohaymen-mssqldata:/var/opt/mssql

volumes:
mohaymen-pgdata:
mohaymen-mssqldata:

مرجع و جستجوی Image:

‌

معادل‌ها:

  • postgres:16 → hub.hamdocker.ir/library/postgres:16
  • mcr.microsoft.com/mssql/server:2022-latest → mcr.hamdocker.ir/mssql/server:2022-latest

۲) این فایل چه می‌گوید؟​

بخشمعنی
servicesلیست سرویس‌هایی که می‌خواهید همزمان بالا بیایند
postgres / sqlserverنام منطقی هر سرویس داخل Compose
imageاز کدام رجیستری و Image این container ساخته شود (اینجا هم‌داکر)
container_nameنامی که در docker ps می‌بینید
environmentتنظیمات لازم برای استارت Database (یوزر، رمز، نام DB، پذیرش EULA)
ports"HOST:CONTAINER" — از سیستم خودتان به port داخل container
volumes (زیر سرویس)داده کجا روی دیسک ماندگار شود
volumes (پایین فایل)تعریف Volumeهای نام‌دار که سرویس‌ها به آن وصل‌اند
‌

فرمت ports: "5432:5432" یعنی: port سمت چپ مال سیستم شماست، سمت راست مال داخل container. اگر 5432 یا 1433 روی سیستم‌تان اشغال است، فقط عدد سمت چپ را عوض کنید (مثلاً "5433:5432") و در client هم همان port سمت چپ را بزنید.

‌

رمز MSSQL_SA_PASSWORD باید سیاست پیچیدگی SQL Server را رعایت کند (طول کافی، حرف بزرگ/کوچک، عدد، نماد). رمز نمونهٔ بالا فقط برای یادگیری است؛ در محیط واقعی رمز قوی‌تر و مدیریت‌شده بگذارید.

۳) بالا آوردن​

در همان پوشه‌ای که فایل را ساختید:

docker compose up -d
  • up یعنی سرویس‌های فایل را بساز و اجرا کن
  • -d یعنی در پس‌زمینه (detached) اجرا شود تا ترمینال آزاد بماند

وضعیت و لاگ:

docker compose ps
docker compose logs -f

با Ctrl+C فقط دنبال‌کردن لاگ قطع می‌شود؛ خود containerها بالا می‌مانند.

برای توقف موقت:

docker compose stop

برای شروع دوباره:

docker compose start

برای خاموش کردن و حذف containerها (Volumeها معمولاً می‌مانند):

docker compose down
‌

اگر یکی بالا نیامد، docker compose logs را بخوانید. رایج‌ترین علت‌ها: روشن نبودن Docker Desktop، اشغال بودن port، یا ضعیف بودن رمز SQL Server.

در ادامه...​

در فاز بعد روی همین دو Database که با Compose بالا آوردید، SQL را یاد می‌گیرید. کار روی همین containerها است.