Docker — NestJS ni containerlashtirish, Dockerfile
Muammodan boshlaylik
Ilova sizning kompyuteringizda ishlaydi. Serverga ko'chirdingiz — ishlamaydi. Sababi: serverda Node.js versiyasi boshqacha, ba'zi paketlar o'rnatilmagan, environment farqli.
Bu muammoning klassik yechimi: "mening kompyuterimda ishlaydi" — lekin bu javob emas.
Docker bu muammoni hal qiladi: ilova va uning barcha bog'liqliklarini bitta konteynerga joylashtirasiz. Konteyner har qanday mashinada bir xil ishlaydi.
Docker nima?
Docker — ilovani o'z muhiti bilan birga izolyatsiya qilib ishlatish texnologiyasi.
Hayotiy o'xshatma: yuk konteyneri.
Dengiz yuk konteyneri ichiga nima joylashtirsangiz — Xitoydan Amerikaga bir xil yetib boradi. Port kranlari, kemalar — barchasi standart konteynerlar bilan ishlaydi. Ichidagi yuk muhim emas.
Docker konteyneri ham shunday: ichiga Node.js, ilovangiz, konfiguratsiya joylaysiz — qaysi serverdа ishlatmang, bir xil ishlaydi.
Asosiy tushunchalar
Image — konteyner shabloni. O'zgarmaydigan nusxa. Container — ishayotgan image. Image dan bir necha konteyner yaratish mumkin. Dockerfile — image ni qanday yaratishni ko'rsatuvchi ko'rsatmalar.
Dockerfile → docker build → Image → docker run → Container
NestJS uchun Dockerfile
# Dockerfile
# 1. Base image
FROM node:20-alpine
# 2. Ishchi katalog
WORKDIR /app
# 3. Paket fayllarini ko'chirish (cache uchun alohida)
COPY package*.json ./
# 4. Paketlarni o'rnatish
RUN npm ci --only=production
# 5. Manba kodni ko'chirish
COPY . .
# 6. Build qilish
RUN npm run build
# 7. Port ochish
EXPOSE 3000
# 8. Ishga tushirish
CMD ["node", "dist/main"]
Multi-stage build — image hajmini kamaytirish
# Dockerfile
# 1-bosqich: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 2-bosqich: Production
FROM node:20-alpine AS production
WORKDIR /app
# Faqat production paketlarini o'rnatish
COPY package*.json ./
RUN npm ci --only=production
# Faqat build natijasini ko'chirish
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/main"]
Multi-stage bilan image hajmi kichik bo'ladi: development bog'liqliklar, TypeScript source — barchasi tashlab ketiladi.
.dockerignore
.gitignore ga o'xshash — Docker ga nima kerakmasligini aytamiz:
# .dockerignore
node_modules
dist
.env
.git
*.md
node_modules ni ko'chirmaslik muhim — konteyner ichida npm ci bilan qaytadan o'rnatiladi.
Image yaratish va ishlatish
# Image yaratish
docker build -t myapp:latest .
# Ishga tushirish
docker run -p 3000:3000 --env-file .env myapp:latest
# Background da
docker run -d -p 3000:3000 --env-file .env --name myapp myapp:latest
# Ishayotgan konteynerlarni ko'rish
docker ps
# Log ko'rish
docker logs myapp
# Konteynerga kirish
docker exec -it myapp sh
# To'xtatish
docker stop myapp
Environment Variables
# Dockerfile da default qiymat (kam ishlatiladi)
ENV NODE_ENV=production
Amalda — env ni tashqaridan beramiz:
docker run -e NODE_ENV=production -e DATABASE_URL=... myapp
# yoki
docker run --env-file .env.production myapp
⚠️
.envfaylni image ichiga yozmang — maxfiy ma'lumotlar xavfli. Tashqaridan bering.
Dockerfile tekshirish
# Image hajmini ko'rish
docker images myapp
# Image qatlamlarini ko'rish
docker history myapp:latest
Yaxshi image: 150-300MB. Agar 1GB dan oshsa — multi-stage ishlatilmagan.
Tez-tez uchraydigan xatolar
1. node_modules muammosi
Error: Cannot find module 'express'
Sababi: .dockerignore da node_modules yo'q, eski versiyasi ko'chirilgan.
Yechim: .dockerignore ga node_modules qo'shing.
2. Port ochiq emas
connect ECONNREFUSED 127.0.0.1:3000
Sababi: EXPOSE 3000 yozilgan, lekin docker run -p 3000:3000 qilinmagan.
Yechim: -p host_port:container_port ni unutmang.
3. Environment variable topilmayapti
Sababi: --env-file yoki -e berilmagan.
Yechim: docker run --env-file .env myapp
Xulosa
Eslab qoling:
- Docker — ilovani muhiti bilan birga izolyatsiya qiladi
Dockerfile— image yaratish ko'rsatmalari- Multi-stage build — image hajmini kamaytiradi
.dockerignore— keraksiz fayllarni build dan chiqarish.envfaylni image ichiga yozmang
Keyingi dars: 57-dars: Docker Compose — NestJS, PostgreSQL, Redis birga