Docker

Docker Compose

Real loyihalar odatda bir nechta xizmatdan iborat: veb-ilova, ma'lumotlar bazasi, kesh va boshqalar. Ularning har birini alohida docker run uzun buyruqlari bilan ishga tushirish noqulay va xatolarga to'la. Docker Compose aynan shu muammoni hal qiladi โ€” bir nechta konteynerni bitta fayl orqali boshqaradi.

Muammo: bir nechta konteynerni boshqarish

Tasavvur qiling, loyihangizda Node.js ilova va PostgreSQL ma'lumotlar bazasi bor. Ularni Docker'da ishga tushirish uchun ikkita uzun buyruq yozishingiz kerak:

docker run -d --name baza -e POSTGRES_PASSWORD=parol -v data:/var/lib/postgresql/data postgres:16
docker run -d --name ilova -p 3000:3000 -e DB_HOST=baza mening-ilovam

Bu buyruqlar uzun, eslab qolish qiyin va har safar qo'lda yozish kerak. Bundan tashqari, ularni to'g'ri tartibda ishga tushirish, tarmoqni sozlash kabi qo'shimcha ishlar bor. Xizmatlar ko'paygan sari bu boshqarib bo'lmas holga keladi.

Yechim: docker-compose.yml

Docker Compose โ€” barcha xizmatlarni bitta docker-compose.yml fayli (YAML formatida) da tavsiflashga imkon beradi. So'ng bitta buyruq bilan hammasini birga ishga tushirasiz.

YAML โ€” bu sozlamalar uchun ishlatiladigan oddiy matn formati. Unda chekinish (indentation, bo'sh joylar) juda muhim โ€” u tuzilmani belgilaydi. Tab emas, bo'sh joy (probel) ishlating. Odatda ikki probel bilan chekinadi.

docker-compose.yml tuzilishi

Fayl asosan services (xizmatlar) bo'limidan iborat. Har bir xizmat โ€” bu bitta konteyner. Sodda misol:

services:
  web:
    image: nginx
    ports:
      - "8080:80"

Bu web nomli xizmatni belgilaydi: u nginx image'idan yaratiladi va 8080-port 80-portga bog'lanadi. Bu docker run -p 8080:80 nginx buyrug'ining fayldagi ko'rinishi.

Asosiy sozlamalar

Har bir xizmat uchun ishlatiladigan asosiy sozlamalar:

To'liq namuna: Node + Postgres

Endi haqiqiy misol โ€” Node.js ilova va PostgreSQL bazasidan iborat loyiha uchun to'liq docker-compose.yml:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_USER=admin
      - DB_PASSWORD=maxfiy123
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=maxfiy123
      - POSTGRES_DB=dukon
    volumes:
      - baza-malumoti:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  baza-malumoti:

Bu faylni bo'laklarga ajratamiz:

Diqqat qiling: web xizmatida DB_HOST=db deb yozdik โ€” db! Bu ma'lumotlar bazasi xizmatining nomi. Compose xizmatlarni bir tarmoqqa ulaydi va ularni nomi orqali topish mumkin. IP manzil kerak emas โ€” shunchaki xizmat nomini yozasiz.

compose up va down buyruqlari

Fayl tayyor bo'lgach, barcha xizmatlarni birga ishga tushirish uchun:

docker compose up -d

Bu buyruq docker-compose.ymlni o'qib, barcha xizmatlarni to'g'ri tartibda ishga tushiradi. -d โ€” fonda ishlash uchun. Compose kerak bo'lgan image'larni yuklaydi, tarmoqni yaratadi va konteynerlarni ishga tushiradi โ€” hammasi bitta buyruq bilan.

Ishlab turgan xizmatlarni ko'rish va jurnallarni kuzatish:

# Xizmatlar holatini ko'rish
docker compose ps

# Barcha xizmatlar jurnalini kuzatish
docker compose logs -f

Hammasini to'xtatib, o'chirish uchun:

# Konteynerlarni to'xtatib, o'chirish
docker compose down

# Volume'lar bilan birga o'chirish (ma'lumot ham o'chadi!)
docker compose down -v
docker compose down -v โ€” -v bayrog'i volume'larni ham o'chiradi, ya'ni ma'lumotlar bazasidagi barcha ma'lumot yo'qoladi. Oddiy down volume'ga tegmaydi. Ishlab turgan loyihada -vni ehtiyotkorlik bilan ishlating.

docker compose va docker-compose

Ikki xil yozuv uchraydi: yangi versiyalarda docker compose (ikki so'z, bo'sh joy bilan), eski versiyalarda docker-compose (chiziqcha bilan) ishlatiladi. Ikkalasi ham deyarli bir xil ishlaydi; zamonaviy tavsiya โ€” docker compose (bo'sh joyli).

Xulosa