آموزش Docker با ASP.NET

تاریخ: 1404/12/4 ساعت: 11:47 بازدید: 17

Docker چیست و چرا باید با آن آشنا باشی؟

اگر یک توسعه‌دهنده ASP.NET هستی، حتماً بارها با این مشکل روبرو شدی: «روی سیستم من کار می‌کنه، نمی‌دونم چرا روی سرور مشکل داره!» این جمله آشنا، دقیقاً همان دردی است که Docker برای درمانش ساخته شده.

Docker یک پلتفرم متن‌باز برای کانتینرسازی (Containerization) اپلیکیشن‌هاست. به زبان ساده، Docker به تو این امکان را می‌دهد که اپلیکیشن ASP.NET خودت را همراه با تمام وابستگی‌هایش (مثل کتابخانه‌ها، تنظیمات و محیط اجرا) در یک «جعبه» ببندی و روی هر سرور یا سیستمی بدون هیچ مشکلی اجرا کنی.

  • سبک‌تر از Virtual Machine: کانتینرهای Docker منابع کمتری مصرف می‌کنند چون kernel سیستم‌عامل را به اشتراک می‌گذارند.
  • قابل حمل (Portable): یک‌بار بساز، هر جا اجرا کن. از لپ‌تاپ تا سرور ابری.
  • ایزوله‌سازی کامل: هر اپلیکیشن در محیط مجزای خودش اجرا می‌شود.
  • استقرار سریع‌تر (Fast Deployment): فرایند CI/CD را به شدت سرعت می‌بخشد.

مفاهیم پایه Docker که باید بدانی

قبل از اینکه وارد عملیات شویم، بیایید مفاهیم کلیدی Docker را با هم مرور کنیم:

Image (ایمیج)

Image یک قالب فقط‌خواندنی (Read-Only Template) است که شامل کد اپلیکیشن، کتابخانه‌ها و تنظیمات محیط اجرا می‌شود. می‌توانی Image را مثل یک نقشه ساختمان تصور کنی.

Container (کانتینر)

Container نمونه اجرایی یک Image است. وقتی Image را اجرا می‌کنی، یک Container ساخته می‌شود. می‌توانی از یک Image چندین Container موازی اجرا کنی.

Dockerfile

Dockerfile یک فایل متنی است که دستورالعمل‌های ساخت Image را مشخص می‌کند. این فایل قلب کار Docker با ASP.NET است.

Docker Hub

Docker Hub یک رجیستری عمومی است که Image‌های آماده در آن قرار دارند. Image‌های رسمی ASP.NET Core از اینجا دانلود می‌شوند.

نصب Docker روی ویندوز و لینوکس

نصب Docker Desktop روی ویندوز

  • به سایت رسمی Docker بروید و Docker Desktop for Windows را دانلود کنید.
  • نیاز به WSL 2 (Windows Subsystem for Linux) دارید که در ویندوز ۱۰ نسخه ۲۰۰۴ به بعد پشتیبانی می‌شود.
  • بعد از نصب، با دستور docker --version نصب را تأیید کنید.

نصب Docker روی Ubuntu / Debian


sudo apt-get update

sudo apt-get install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ساخت اولین Dockerfile برای ASP.NET Core

حالا می‌رسیم به قسمت هیجان‌انگیز! بیایید یک پروژه ASP.NET Core Web API را داکرایز کنیم. این فرایند را Dockerizing می‌نامند.

مرحله ۱: ساخت پروژه ASP.NET Core


dotnet new webapi -n MyDockerApp

cd MyDockerApp

مرحله ۲: نوشتن Dockerfile بهینه (Multi-Stage Build)

بهترین روش برای داکرایز کردن ASP.NET استفاده از Multi-Stage Build است. این روش باعث می‌شود Image نهایی بسیار سبک‌تر باشد:


Stage 1: Build

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

WORKDIR /src

Copy csproj and restore dependencies

COPY [“MyDockerApp.csproj”, “./”]

RUN dotnet restore

Copy all files and build

COPY . .

RUN dotnet build -c Release -o /app/build

Stage 2: Publish

FROM build AS publish

RUN dotnet publish -c Release -o /app/publish --no-restore

Stage 3: Final - Runtime only (lighter image)

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final

WORKDIR /app

Create non-root user for security

RUN adduser --disabled-password --gecos ‘’ appuser

USER appuser

COPY --from=publish /app/publish .

EXPOSE 8080

ENV ASPNETCORE_URLS=http://+:8080

ENTRYPOINT [“dotnet”, “MyDockerApp.dll”]

چرا از Multi-Stage Build استفاده می‌کنیم؟ چون SDK دات‌نت حدود ۷۰۰ مگابایت است اما Runtime فقط ۲۰۰ مگابایت. با این روش، Image نهایی بسیار سبک‌تر خواهد بود.

مرحله ۳: ساخت و اجرای Image


ساخت Image

docker build -t my-aspnet-app:latest .

مشاهده Image ساخته‌شده

docker images

اجرای Container

docker run -d -p 8080:8080 --name myapp my-aspnet-app:latest

مشاهده Container‌های در حال اجرا

docker ps

حالا مرورگر را باز کن و به آدرس http://localhost:8080 برو. اپلیکیشن ASP.NET Core ات داخل Docker در حال اجراست!

فایل .dockerignore را فراموش نکن!

مثل .gitignore، فایل .dockerignore مشخص می‌کند چه فایل‌هایی به Image کپی نشوند. این کار سرعت Build را بالا می‌برد:


**/.classpath

**/.dockerignore

**/.env

**/.git

**/.gitignore

**/.project

**/.settings

**/.toolstarget

**/.vs

**/.vscode

**/*.*proj.user

**/*.dbmdl

**/*.jfm

**/bin

**/charts

*/docker-compose

**/compose.y*ml

*/Dockerfile

**/node_modules

**/npm-debug.log

**/obj

**/secrets.dev.yaml

**/values.dev.yaml

LICENSE

README.md

Docker Compose: مدیریت چند سرویس همزمان

در دنیای واقعی، اپلیکیشن‌ها تنها نیستند. معمولاً یک پروژه ASP.NET نیاز به دیتابیس (مثل SQL Server یا PostgreSQL)، Cache (مثل Redis) و سرویس‌های دیگر دارد. Docker Compose ابزاری است که این سرویس‌ها را با هم مدیریت می‌کند.

مثال: ASP.NET + SQL Server با Docker Compose


version: ‘3.8’

services:

سرویس اپلیکیشن ASP.NET

webapp:

build:

context: .

dockerfile: Dockerfile

container_name: aspnet_app

ports:

“8080:8080”

environment:

ASPNETCORE_ENVIRONMENT=Production
ConnectionStrings__DefaultConnection=Server=sqlserver;Database=MyAppDb;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;

depends_on:

sqlserver:

condition: service_healthy

networks:

app-network

restart: unless-stopped

سرویس SQL Server

sqlserver:

image: mcr.microsoft.com/mssql/server:2022-latest

container_name: sql_server

environment:

ACCEPT_EULA=Y
SA_PASSWORD=YourStrong@Passw0rd
MSSQL_PID=Developer

ports:

“1433:1433”

volumes:

sqlserver_data:/var/opt/mssql

healthcheck:

test: [“CMD-SHELL”, “/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P YourStrong@Passw0rd -Q ‘SELECT 1’”]

interval: 10s

timeout: 5s

retries: 5

networks:

app-network

restart: unless-stopped

سرویس Redis برای Cache

redis:

image: redis:7-alpine

container_name: redis_cache

ports:

“6379:6379”

networks:

app-network

restart: unless-stopped

volumes:

sqlserver_data:

networks:

app-network:

driver: bridge

دستورات اصلی Docker Compose


راه‌اندازی همه سرویس‌ها

docker compose up -d

مشاهده لاگ‌ها

docker compose logs -f

متوقف کردن سرویس‌ها

docker compose down

بازسازی Image‌ها

docker compose up -d --build

مشاهده وضعیت سرویس‌ها

docker compose ps

تنظیم Environment Variables و Configuration در ASP.NET داکرایزشده

یکی از چالش‌های مهم هنگام کار با Docker، مدیریت تنظیمات محیطی (Environment Variables) است. هرگز اطلاعات حساس مثل Connection String یا API Key را مستقیم در Dockerfile ننویس!

  • فایل .env: متغیرهای محیطی را در فایل .env بذار و آن را در .gitignore اضافه کن.
  • Docker Secrets: برای محیط‌های Production از Docker Secrets استفاده کن.
  • ASP.NET Configuration: از IConfiguration برای خواندن تنظیمات استفاده کن که به صورت خودکار Environment Variables را می‌خواند.

// در Program.cs یا appsettings.json

// Docker به صورت خودکار Environment Variables را Override می‌کند

var connectionString = builder.Configuration

.GetConnectionString(“DefaultConnection”);

🚀 می‌خواهی سایتت در صفحه اول گوگل باشد؟

آیا می‌خواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگ‌خورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید.

همین حالا برای مشاوره رایگان با ما تماس بگیرید:

📞 09190994063 - 09376846692

Health Check در ASP.NET Core داکرایزشده

وقتی اپلیکیشن‌ات داخل Docker اجرا می‌شه، Docker باید بداند آیا برنامه سالم است یا نه. Health Check این کار را انجام می‌دهد:


// Program.cs

builder.Services.AddHealthChecks()

.AddSqlServer(connectionString)

.AddRedis(redisConnectionString);

app.MapHealthChecks(“/health”);

و در Dockerfile:


HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \

CMD curl -f http://localhost:8080/health || exit 1

نکات امنیتی مهم در Docker با ASP.NET

امنیت در محیط‌های کانتینری بسیار مهم است. این نکات را جدی بگیر:

  • از کاربر غیر Root استفاده کن: هرگز Container را با کاربر root اجرا نکن. در مثال بالا دیدیم که adduser کردیم.
  • Image‌ها را آپدیت نگه دار: از Image‌های رسمی Microsoft استفاده کن و آن‌ها را به‌روز نگه دار.
  • اسکن امنیتی Image: از ابزارهایی مثل docker scout یا Trivy برای اسکن آسیب‌پذیری استفاده کن.
  • پورت‌های غیرضروری را باز نگذار: فقط پورت‌های مورد نیاز را در EXPOSE و -p مشخص کن.
  • Secret‌ها را هرگز در Image نذار: از Docker Secrets یا Vault برای مدیریت اطلاعات حساس استفاده کن.

بهینه‌سازی Docker Image برای ASP.NET

استفاده از Image‌های Alpine برای کاهش حجم

Microsoft نسخه‌های Alpine-based از ASP.NET Runtime ارائه می‌دهد که حجم بسیار کمتری دارند:


به جای این:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

از این استفاده کن (حدود ۱۰۰ مگابایت کمتر):

FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine

لایه‌بندی بهینه در Dockerfile

Docker از مکانیزم Layer Caching استفاده می‌کند. با ترتیب درست دستورات، Build‌های بعدی بسیار سریع‌تر می‌شوند. همیشه ابتدا فایل .csproj را کپی و Restore کن، بعد کد را کپی کن.

استقرار روی سرور لینوکس با Docker

بعد از اینکه Image‌ات آماده شد، باید آن را به سرور ببری. رایج‌ترین روش‌ها:

  • Docker Hub: Image را Push کن و روی سرور Pull کن.
  • Private Registry: برای پروژه‌های سازمانی از Registry خصوصی مثل Harbor استفاده کن.
  • SCP و Load: Image را به صورت فایل tar صادر کن و با SCP به سرور بفرست.

روش اول: Push به Docker Hub

docker tag my-aspnet-app:latest username/my-aspnet-app:latest

docker push username/my-aspnet-app:latest

روی سرور:

docker pull username/my-aspnet-app:latest

docker compose up -d

روش دوم: Export و Import

docker save my-aspnet-app:latest | gzip > my-aspnet-app.tar.gz

scp my-aspnet-app.tar.gz user@server:/home/user/

روی سرور:

docker load < my-aspnet-app.tar.gz

Docker و CI/CD با GitHub Actions

یکی از قدرتمندترین کاربردهای Docker، ادغام با Pipeline های CI/CD است. با GitHub Actions می‌توانی به صورت خودکار Image بسازی و Deploy کنی:


name: Build and Deploy ASP.NET Docker

on:

push:

branches: [ main ]

jobs:

build:

runs-on: ubuntu-latest

steps:

uses: actions/checkout@v4

name: Build Docker Image

run: docker build -t my-aspnet-app:${{ github.sha }} .

name: Login to Docker Hub

uses: docker/login-action@v3

with:

username: ${{ secrets.DOCKER_USERNAME }}

password: ${{ secrets.DOCKER_PASSWORD }}

name: Push Image

run: |

docker tag my-aspnet-app:${{ github.sha }} username/my-aspnet-app:latest

docker push username/my-aspnet-app:latest

name: Deploy to Server

uses: appleboy/ssh-action@v1

with:

host: ${{ secrets.SERVER_HOST }}

username: ${{ secrets.SERVER_USER }}

key: ${{ secrets.SSH_PRIVATE_KEY }}

script: |

docker pull username/my-aspnet-app:latest

docker compose up -d --force-recreate

مانیتورینگ و Logging در Docker با ASP.NET

وقتی اپلیکیشن در Production اجرا می‌شود، باید بتوانی لاگ‌ها را بررسی و سلامت سرویس را مانیتور کنی:

  • docker logs: برای مشاهده لاگ‌های یک Container: docker logs -f myapp
  • docker stats: مانیتور مصرف CPU و RAM: docker stats
  • Portainer: یک UI گرافیکی برای مدیریت Docker که راه‌اندازی‌اش بسیار ساده است.
  • Grafana + Prometheus: برای مانیتورینگ پیشرفته و ایجاد Dashboard.

💡 رقبای شما الان سئو می‌کنند!

آیا می‌خواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگ‌خورهایتان چند برابر شود؟ سئو یک سرمایه‌گذاری است، نه هزینه. سئوی سایت خود را به متخصصان ما بسپارید تا نتیجه واقعی ببینید.

همین حالا برای مشاوره رایگان با ما تماس بگیرید:

📞 09190994063 - 09376846692

جمع‌بندی: Docker با ASP.NET یعنی آینده توسعه

در این مقاله جامع، با هم یاد گرفتیم:

  • ✅ مفاهیم پایه Docker (Image، Container، Dockerfile)
  • ✅ نوشتن Dockerfile بهینه با Multi-Stage Build
  • ✅ مدیریت چند سرویس با Docker Compose
  • ✅ نکات امنیتی و بهینه‌سازی Image
  • ✅ استقرار روی سرور و CI/CD با GitHub Actions
  • ✅ مانیتورینگ و Health Check

Docker دیگر یک تکنولوژی اختیاری نیست؛ استاندارد صنعت توسعه نرم‌افزار شده است. شرکت‌های بزرگ ایرانی هم به سرعت در حال پذیرش این تکنولوژی هستند و تسلط بر آن می‌تواند ارزش بازار کاری تو را به شکل چشمگیری افزایش دهد.


سوالات متداول (FAQ)

۱. تفاوت Docker و Virtual Machine چیست؟

Virtual Machine یک سیستم‌عامل کامل را شبیه‌سازی می‌کند و منابع زیادی مصرف می‌کند. Docker از kernel سیستم‌عامل میزبان به اشتراک می‌گذارد و فقط اپلیکیشن و وابستگی‌هایش را ایزوله می‌کند. نتیجه: Docker سریع‌تر، سبک‌تر و کارآمدتر است. یک VM می‌تواند چند گیگابایت مصرف کند، اما یک Container ASP.NET ممکن است فقط ۱۵۰-۲۰۰ مگابایت باشد.

۲. آیا Docker روی ویندوز سرور هم کار می‌کند؟

بله، Docker هم روی ویندوز سرور (Windows Containers) و هم روی لینوکس (Linux Containers) کار می‌کند. اما اکثر توسعه‌دهندگان ASP.NET Core ترجیح می‌دهند از Linux Containers استفاده کنند چون سبک‌تر و ارزان‌تر هستند. ASP.NET Core کراس‌پلتفرم است و به خوبی روی لینوکس اجرا می‌شود.

۳. چطور می‌توانم دیتابیس SQL Server را در Docker پشتیبان‌گیری کنم؟

بهترین روش استفاده از Volume در Docker است. وقتی از Volume استفاده می‌کنید، داده‌ها خارج از Container ذخیره می‌شوند و حتی اگر Container حذف شود، داده‌ها باقی می‌مانند. علاوه بر این، می‌توانید از دستور docker exec برای اجرای دستورات Backup داخل Container SQL Server استفاده کنید.

۴. تفاوت Docker Compose و Kubernetes چیست؟

Docker Compose برای محیط‌های تک‌سروری و توسعه محلی عالی است. Kubernetes (K8s) یک Orchestration Platform برای محیط‌های Production با چند سرور است که قابلیت‌های پیشرفته‌ای مثل Auto-scaling، Self-healing و Rolling Update دارد. برای شروع، Docker Compose کافی است؛ وقتی اپلیکیشنت به مقیاس بزرگ رسید، به Kubernetes نیاز خواهی داشت.

۵. آیا Docker برای پروژه‌های کوچک ASP.NET هم مناسب است؟

قطعاً بله! حتی برای پروژه‌های کوچک هم Docker ارزش دارد. دلایل اصلی: استقرار آسان‌تر، محیط توسعه یکسان برای همه اعضای تیم، آماده‌سازی سریع محیط برای اعضای جدید (فقط Docker Compose run کنند!) و امنیت بیشتر. وقتی پروژه رشد کرد، مقیاس‌پذیری هم خیلی راحت‌تر خواهد بود.

۶. چگونه خطاهای Docker را دیباگ کنم؟

برای دیباگ Container‌های ASP.NET در Docker می‌توانی از این روش‌ها استفاده کنی: دستور docker logs container_name برای مشاهده لاگ‌ها، docker exec -it container_name /bin/sh برای ورود به داخل Container و بررسی مستقیم، و Visual Studio و VS Code هر دو از دیباگ Remote داخل Container پشتیبانی می‌کنند که تجربه‌ای مثل دیباگ محلی به شما می‌دهد.

نظرات کاربران