Docker Compose — NestJS, PostgreSQL, Redis birga
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 tushadivolumes— 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