Docker Compose — NestJS, PostgreSQL, Redis birga

~20 daq · NestJS · Deployment

Muammodan boshlaylik

Real loyiha bir necha xizmatdan iborat: NestJS app, PostgreSQL, Redis. Har birini alohida docker run bilan ishlatish qiyin:

docker run -d postgres
docker run -d redis
docker run -d --link postgres --link redis myapp
# ... environment variable lar, network, volume lar...

Bu ko'p buyruq, ko'p xato. Docker Compose bitta faylda barchasini belgilash va bitta buyruq bilan ishlatish imkonini beradi.


Docker Compose nima?

Docker Compose — bir necha konteynerdan iborat ilovani bitta YAML faylda belgilash va boshqarish vositasi.

Hayotiy o'xshatma: to'liq oshxona jihozlari ro'yxati.

Mebel do'konidan har narsani alohida olib kelish o'rniga — to'plam buyurtma qilasiz: divan, stol, kreslolar birga keladi, to'g'ri joylashgan holda.


docker-compose.yml

# docker-compose.yml

version: '3.8'

services:

  # NestJS ilovasi
  app:
    build: .                        # Dockerfile dan build
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://postgres:password@db:5432/mydb
      REDIS_URL: redis://redis:6379
    depends_on:
      db:
        condition: service_healthy  # DB tayyor bo'lgandan keyin ishga tush
      redis:
        condition: service_healthy

  # PostgreSQL
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data  # Ma'lumotlar saqlansin
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  # Redis
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

volumes:
  postgres_data:
  redis_data:

Buyruqlar

# Barcha xizmatlarni ishga tushirish
docker compose up

# Background da
docker compose up -d

# Log ko'rish
docker compose logs -f

# Faqat app ning logi
docker compose logs -f app

# To'xtatish
docker compose down

# To'xtatish va volumelarni o'chirish
docker compose down -v

.env fayl bilan ishlatish

# docker-compose.yml
services:
  app:
    env_file:
      - .env.production  # ← env fayldan o'qiydi

Development va Production konfiguratsiyasi

# docker-compose.dev.yml — development uchun
services:
  app:
    volumes:
      - .:/app          # ← hot reload uchun kod mirroring
      - /app/node_modules
    command: npm run start:dev

  db:
    ports:
      - "5432:5432"     # ← DB ga tashqaridan kirish (dev da qulay)
# Development da
docker compose -f docker-compose.yml -f docker-compose.dev.yml up

# Production da
docker compose up

Migratsiyalarni ishga tushirish

# docker-compose.yml
services:
  migrate:
    build: .
    command: npx prisma migrate deploy  # yoki typeorm migration:run
    environment:
      DATABASE_URL: postgres://postgres:password@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy
    restart: "no"  # ← bir marta ishlaydi va to'xtaydi
docker compose run migrate

Tez-tez uchraydigan xatolar

1. App DB dan oldin ishga tushdi

Error: Connection refused to postgres

Sababi: depends_on bor, lekin condition: service_healthy yo'q. Yechim: healthcheck va condition: service_healthy qo'shing.


2. Volume o'zgarishlardan keyin eski ma'lumotlar Sababi: Volume qayta ishlatilmoqda. Yechim: docker compose down -v bilan eski volumeni tozalang.


3. Port band

Error: port is already allocated

Sababi: Lokal mashinada o'sha port ishlatilmoqda. Yechim: Port ni o'zgartiring: "5433:5432" (host port: container port).


Xulosa

Eslab qoling:

  • Docker Compose — bir necha konteynerning birga ishlash konfiguratsiyasi
  • depends_on + healthcheck — servislar to'g'ri tartibda ishga tushadi
  • volumes — ma'lumotlar konteyner o'chganda ham saqlanadi
  • Development va production uchun alohida compose fayllari
  • docker compose up -d — background da ishlatish

Keyingi dars: 58-dars: Nginx — reverse proxy, SSL