اگر یک توسعهدهنده ASP.NET هستی، حتماً بارها با این مشکل روبرو شدی: «روی سیستم من کار میکنه، نمیدونم چرا روی سرور مشکل داره!» این جمله آشنا، دقیقاً همان دردی است که Docker برای درمانش ساخته شده.
Docker یک پلتفرم متنباز برای کانتینرسازی (Containerization) اپلیکیشنهاست. به زبان ساده، Docker به تو این امکان را میدهد که اپلیکیشن ASP.NET خودت را همراه با تمام وابستگیهایش (مثل کتابخانهها، تنظیمات و محیط اجرا) در یک «جعبه» ببندی و روی هر سرور یا سیستمی بدون هیچ مشکلی اجرا کنی.
قبل از اینکه وارد عملیات شویم، بیایید مفاهیم کلیدی Docker را با هم مرور کنیم:
Image یک قالب فقطخواندنی (Read-Only Template) است که شامل کد اپلیکیشن، کتابخانهها و تنظیمات محیط اجرا میشود. میتوانی Image را مثل یک نقشه ساختمان تصور کنی.
Container نمونه اجرایی یک Image است. وقتی Image را اجرا میکنی، یک Container ساخته میشود. میتوانی از یک Image چندین Container موازی اجرا کنی.
Dockerfile یک فایل متنی است که دستورالعملهای ساخت Image را مشخص میکند. این فایل قلب کار Docker با ASP.NET است.
Docker Hub یک رجیستری عمومی است که Imageهای آماده در آن قرار دارند. Imageهای رسمی ASP.NET Core از اینجا دانلود میشوند.
docker --version نصب را تأیید کنید.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
حالا میرسیم به قسمت هیجانانگیز! بیایید یک پروژه ASP.NET Core Web API را داکرایز کنیم. این فرایند را Dockerizing مینامند.
dotnet new webapi -n MyDockerApp cd MyDockerApp
بهترین روش برای داکرایز کردن 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 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 در حال اجراست!
مثل .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
در دنیای واقعی، اپلیکیشنها تنها نیستند. معمولاً یک پروژه ASP.NET نیاز به دیتابیس (مثل SQL Server یا PostgreSQL)، Cache (مثل Redis) و سرویسهای دیگر دارد. 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 up -d مشاهده لاگها docker compose logs -f متوقف کردن سرویسها docker compose down بازسازی Imageها docker compose up -d --build مشاهده وضعیت سرویسها docker compose ps
یکی از چالشهای مهم هنگام کار با Docker، مدیریت تنظیمات محیطی (Environment Variables) است. هرگز اطلاعات حساس مثل Connection String یا API Key را مستقیم در Dockerfile ننویس!
.env بذار و آن را در .gitignore اضافه کن.IConfiguration برای خواندن تنظیمات استفاده کن که به صورت خودکار Environment Variables را میخواند.// در Program.cs یا appsettings.json // Docker به صورت خودکار Environment Variables را Override میکند var connectionString = builder.Configuration .GetConnectionString(“DefaultConnection”);
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید.
همین حالا برای مشاوره رایگان با ما تماس بگیرید:
📞 09190994063 - 09376846692
وقتی اپلیکیشنات داخل 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
امنیت در محیطهای کانتینری بسیار مهم است. این نکات را جدی بگیر:
adduser کردیم.docker scout یا Trivy برای اسکن آسیبپذیری استفاده کن.EXPOSE و -p مشخص کن.Microsoft نسخههای Alpine-based از ASP.NET Runtime ارائه میدهد که حجم بسیار کمتری دارند:
به جای این: FROM mcr.microsoft.com/dotnet/aspnet:8.0 از این استفاده کن (حدود ۱۰۰ مگابایت کمتر): FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
Docker از مکانیزم Layer Caching استفاده میکند. با ترتیب درست دستورات، Buildهای بعدی بسیار سریعتر میشوند. همیشه ابتدا فایل .csproj را کپی و Restore کن، بعد کد را کپی کن.
بعد از اینکه Imageات آماده شد، باید آن را به سرور ببری. رایجترین روشها:
روش اول: 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، ادغام با 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
وقتی اپلیکیشن در Production اجرا میشود، باید بتوانی لاگها را بررسی و سلامت سرویس را مانیتور کنی:
docker logs -f myappdocker statsآیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئو یک سرمایهگذاری است، نه هزینه. سئوی سایت خود را به متخصصان ما بسپارید تا نتیجه واقعی ببینید.
همین حالا برای مشاوره رایگان با ما تماس بگیرید:
📞 09190994063 - 09376846692
در این مقاله جامع، با هم یاد گرفتیم:
Docker دیگر یک تکنولوژی اختیاری نیست؛ استاندارد صنعت توسعه نرمافزار شده است. شرکتهای بزرگ ایرانی هم به سرعت در حال پذیرش این تکنولوژی هستند و تسلط بر آن میتواند ارزش بازار کاری تو را به شکل چشمگیری افزایش دهد.
Virtual Machine یک سیستمعامل کامل را شبیهسازی میکند و منابع زیادی مصرف میکند. Docker از kernel سیستمعامل میزبان به اشتراک میگذارد و فقط اپلیکیشن و وابستگیهایش را ایزوله میکند. نتیجه: Docker سریعتر، سبکتر و کارآمدتر است. یک VM میتواند چند گیگابایت مصرف کند، اما یک Container ASP.NET ممکن است فقط ۱۵۰-۲۰۰ مگابایت باشد.
بله، Docker هم روی ویندوز سرور (Windows Containers) و هم روی لینوکس (Linux Containers) کار میکند. اما اکثر توسعهدهندگان ASP.NET Core ترجیح میدهند از Linux Containers استفاده کنند چون سبکتر و ارزانتر هستند. ASP.NET Core کراسپلتفرم است و به خوبی روی لینوکس اجرا میشود.
بهترین روش استفاده از Volume در Docker است. وقتی از Volume استفاده میکنید، دادهها خارج از Container ذخیره میشوند و حتی اگر Container حذف شود، دادهها باقی میمانند. علاوه بر این، میتوانید از دستور docker exec برای اجرای دستورات Backup داخل Container SQL Server استفاده کنید.
Docker Compose برای محیطهای تکسروری و توسعه محلی عالی است. Kubernetes (K8s) یک Orchestration Platform برای محیطهای Production با چند سرور است که قابلیتهای پیشرفتهای مثل Auto-scaling، Self-healing و Rolling Update دارد. برای شروع، Docker Compose کافی است؛ وقتی اپلیکیشنت به مقیاس بزرگ رسید، به Kubernetes نیاز خواهی داشت.
قطعاً بله! حتی برای پروژههای کوچک هم Docker ارزش دارد. دلایل اصلی: استقرار آسانتر، محیط توسعه یکسان برای همه اعضای تیم، آمادهسازی سریع محیط برای اعضای جدید (فقط Docker Compose run کنند!) و امنیت بیشتر. وقتی پروژه رشد کرد، مقیاسپذیری هم خیلی راحتتر خواهد بود.
برای دیباگ Containerهای ASP.NET در Docker میتوانی از این روشها استفاده کنی: دستور docker logs container_name برای مشاهده لاگها، docker exec -it container_name /bin/sh برای ورود به داخل Container و بررسی مستقیم، و Visual Studio و VS Code هر دو از دیباگ Remote داخل Container پشتیبانی میکنند که تجربهای مثل دیباگ محلی به شما میدهد.