Docker — NestJS ni containerlashtirish, Dockerfile

~20 daq · NestJS · Deployment

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

⚠️ .env faylni 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
  • .env faylni image ichiga yozmang

Keyingi dars: 57-dars: Docker Compose — NestJS, PostgreSQL, Redis birga