Docker ilə Next.js App Deployment — Addım-Addım Bələdçi
Next.js layihəni Docker ilə containerləşdirib production-a çıxarmağın ən sadə və düzgün yolu — real kod nümunələri ilə.
Docker ilə Next.js App Deployment — Addım-Addım Bələdçi
Salam, developer dostum! 👋
Bakıda iş müsahibələrinə gedirsənsə, son 1-2 ildə bir şeyi mütləq görmüsən: vakansiyaların 70%-də Docker tələb olunur. ABB, Kapital Bank, Pasha Holding, SOCAR-ın texnoloji departamentləri — hamısı containerization biliyini soruşur. Əgər freelance işləyirsənsə, Upwork-də "Next.js + Docker" combo ilə saatlıq $25-40 arası rate tutmaq mümkündür.
Bu gün sənə Next.js appini Docker ilə necə deployment-ə hazırlayacağını sıfırdan, addım-addım göstərəcəm. Məqalənin sonunda production-ready bir setup-ın olacaq.
Niyə Docker? Niyə indi?
Klassik ssenari tanışdır: "Məndə işləyir" sindromu. Sən Bakıda oturub development edirsən, server Frankfurtda və ya İstanbulda. Node versiyası fərqlidir, dependency-lər uyğun gəlmir, OS başqadır. Docker bütün bunları həll edir — "bir dəfə yaz, hər yerdə işlət".
Statistikaya baxaq:
- Stack Overflow 2025 Survey: Developer-lərin 59%-i Docker-dən istifadə edir
- Azərbaycanda: LinkedIn-də "Docker" tələb edən vakansiyaların orta maaşı 2500-4500 AZN arasıdır (Junior-Middle)
- Build vaxtı qənaəti: Multi-stage build ilə image ölçüsü ~85% azalır
Addım 0: Nə lazımdır?
- Node.js 18+ quraşdırılmış kompüter
- Docker Desktop (Windows/Mac) və ya Docker Engine (Linux)
- Hazır Next.js layihə (yoxdursa, indi yaradacağıq)
Terminalı aç:
bashnpx create-next-app@latest my-baku-app cd my-baku-app npm run dev
http://localhost:3000-da işləyirsə — əladır, davam edirik.
Addım 1: .dockerignore faylı yarat
Layihənin root qovluğunda .dockerignore faylı yarat. Bu fayl Docker-ə lazımsız faylları göndərməməyi deyir:
node_modules
.next
.git
.gitignore
README.md
docker-compose*.yml
.env*.local
Bu addımı unutma — node_modules qovluğunu context-ə göndərmək build vaxtını 3-5 dəqiqə artırır.
Addım 2: Dockerfile yarat (Multi-Stage Build)
Bu ən vacib hissədir. Multi-stage build istifadə edirik ki, final image kiçik olsun. Layihənin root-unda Dockerfile yarat:
dockerfile# ========== Stage 1: Dependencies ========== FROM node:18-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci --only=production # ========== Stage 2: Build ========== FROM node:18-alpine AS builder WORKDIR /app COPY /app/node_modules ./node_modules COPY . . # Next.js telemetry-ni söndürürük ENV NEXT_TELEMETRY_DISABLED 1 RUN npm run build # ========== Stage 3: Production ========== FROM node:18-alpine AS runner WORKDIR /app ENV NODE_ENV production ENV NEXT_TELEMETRY_DISABLED 1 # Təhlükəsizlik üçün non-root user yaradırıq RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs COPY /app/public ./public # Standalone output üçün lazım olan fayllar COPY /app/.next/standalone ./ COPY /app/.next/static ./.next/static USER nextjs EXPOSE 3000 ENV PORT 3000 ENV HOSTNAME "0.0.0.0" CMD ["node", "server.js"]
Addım 3: next.config faylını yenilə
Standalone output aktiv etmək lazımdır. next.config.mjs faylını belə redaktə et:
javascript/** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', // Bakıdakı API server-inə proxy (misal) // async rewrites() { // return [ // { // source: '/api/:path*', // destination: 'http://your-baku-api:8080/:path*', // }, // ]; // }, }; export default nextConfig;
output: 'standalone' — bu seçim Next.js-ə deyir ki, bütün lazımi faylları bir qovluğa yığsın. Docker image ölçüsünü ~1.2 GB-dan ~150 MB-a endirir.
Addım 4: Build et və işə sal
Terminalda bu əmrləri yaz:
bash# Image-i build et docker build -t my-baku-app:latest . # Container-i işə sal docker run -p 3000:3000 my-baku-app:latest
Brauzerə gir: http://localhost:3000 — təbriklər, Docker-ləşdirilmiş Next.js appın işləyir! 🎉
Addım 5: docker-compose ilə real setup
Production-da adətən tək container olmur. docker-compose.yml faylı yarat:
yamlversion: '3.8' services: web: build: context: . dockerfile: Dockerfile ports: - "3000:3000" environment: - DATABASE_URL=postgresql://user:pass@db:5432/mydb - NEXT_PUBLIC_API_URL=https://api.example.az depends_on: - db restart: unless-stopped db: image: postgres:16-alpine environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=pass - POSTGRES_DB=mydb volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" volumes: pgdata:
İndi bir əmrlə hər şeyi qaldır:
bashdocker compose up -d --build
Image ölçülərini müqayisə edək
| Metod | Image Ölçüsü | Build Vaxtı |
|---|---|---|
| Sadə Dockerfile (node:18) | ~1.4 GB | ~3 dəq |
| Alpine + multi-stage | ~180 MB | ~2 dəq |
| Alpine + standalone output | ~130 MB | ~1.5 dəq |
Bizim yanaşma ilə image 10 dəfədən çox kiçilir.
Deployment: Hara deploy edək?
Azərbaycandan işləyən developer-lər üçün populyar seçimlər:
- Railway / Render — pulsuz tier var, Docker dəstəyi əla, başlayanlar üçün ideal
- DigitalOcean App Platform — aylıq $5-dan başlayır (~8.5 AZN), Dockerfile-dan avtomatik deploy
- AWS ECS / Google Cloud Run — böyük layihələr üçün, Kapital Bank və PASHA kimi şirkətlər istifadə edir
- VPS + Docker — Hetzner-dən aylıq €4-a server alıb,
docker compose up -dilə deploy etmək ən ucuz yoldur
Tez-tez edilən səhvlər
.dockerignoreyazmamaq →node_modulescontext-ə düşür, build 5x yavaşlayır- Root user ilə container işlətmək → təhlükəsizlik riski, biz yuxarıda
nextjsuser yaratdıq output: 'standalone'unutmaq → image nəhəng olur- ENV dəyişənləri hardcode etmək →
.envfaylını Docker-ə göndərmə,environmentbölməsindən istifadə et - Health check qoymamaq → production-da container crash olsa, bilməzsən
Health check əlavə etmək istəyirsənsə, Dockerfile-a bu sətri əlavə et:
dockerfileHEALTHCHECK \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1
Son söz
Docker bilmək artıq "plus" deyil, tələbdir. Bakıda müsahibəyə girəndə "Docker istifadə etmişəm" demək, CV-ni digər namizədlərdən fərqləndirən ən asan yoldur. Bu məqalədəki setup-ı öz portfolio layihənə tətbiq et, GitHub-a push et və LinkedIn-də paylaş.
Sualın varsa, kommentlərdə yaz — cavablandıracam. 🚀
Müəllif: Baku Stack redaksiyası | 12 Aprel 2026
Oxşar məqalələr
GitHub Actions ilə Avtomatik Deploy — Pulsuz Hosting, Sıfır Stress
Hər git push əmrindən sonra saytın avtomatik deploy olsun, həm də pulsuz? GitHub Actions + GitHub Pages ilə bunu 10 dəqiqəyə qurursan.
Kubernetes başlanğıcı — nə vaxt lazım olur, nə vaxt yox?
Hər layihəyə Kubernetes lazım deyil. Gəl birlikdə baxaq: K8s nə vaxt həqiqətən işə yarayır, nə vaxt isə vaxt itkisidir.
Environment Variables Təhlükəsizliyi — Developer-lərin Buraxdığı Səhvlər
Hər il minlərlə API key GitHub-da açıq qalır. Azərbaycanlı developer-lər olaraq biz də bu səhvləri edirik — gəlin real nümunələrlə öyrənək və qorunaq.