Docker Compose nima — bir buyruqda butun loyiha

~12 daq · Docker · Docker Compose

Muammodan boshlaylik

Loyihada uchta xizmat: API, MySQL, Redis. Ishga tushirish uchun:

docker network create dokon-net
docker volume create baza-data
docker run -d --name baza --network dokon-net -e MYSQL_ROOT_PASSWORD=root123 \
  -e MYSQL_DATABASE=dokon -v baza-data:/var/lib/mysql mysql:8.4
docker run -d --name kesh --network dokon-net redis:7-alpine
docker build -t dokon-api .
docker run -d --name api --network dokon-net -p 3000:3000 \
  -e DB_HOST=baza -e DB_PASSWORD=root123 -e REDIS_HOST=kesh dokon-api

Olti buyruq, ularni to'g'ri tartibda bajarish, har birini eslab qolish va jamoaga "README ga yozib qo'yish". To'xtatish — yana buyruqlar. Bitta parametr unutilsa — "nega menda ishlamayapti?"

Docker Compose — butun loyihani bitta YAML faylda tasvirlash va bitta buyruq bilan boshqarish.


compose.yaml

Loyiha ildizida — compose.yaml:

services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: baza
      DB_PASSWORD: root123
      REDIS_HOST: kesh
    depends_on:
      - baza
      - kesh

  baza:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: dokon
    volumes:
      - baza-data:/var/lib/mysql

  kesh:
    image: redis:7-alpine

volumes:
  baza-data:

Yuqoridagi olti buyruq — o'qishli, Git da saqlanadigan bitta fayl.


Ishga tushirish

docker compose up -d
[+] Running 5/5
 ✔ Network dokon_default   Created
 ✔ Volume "dokon_baza-data" Created
 ✔ Container dokon-baza-1   Started
 ✔ Container dokon-kesh-1   Started
 ✔ Container dokon-api-1    Started

Compose:

  • Tarmoq yaratdi — barcha xizmatlar unda, nom bo'yicha DNS ishlaydi (24-dars): API baza va kesh ni topadi
  • Volume yaratdi
  • api uchun image ni build qildi
  • depends_on bo'yicha tartib bilan ishga tushirdi

Yangi dasturchi uchun: git clone → docker compose up → hammasi ishlaydi.


Asosiy buyruqlar

docker compose up -d              # yaratish va ishga tushirish (fonda)
docker compose up -d --build      # image larni qayta yasab
docker compose ps                 # xizmatlar holati
docker compose logs -f api        # bitta xizmat loglari
docker compose logs -f            # hammasi, rangli
docker compose exec api sh        # xizmat ichiga kirish
docker compose exec baza mysql -uroot -proot123 dokon
docker compose restart api
docker compose stop               # to'xtatish (o'chirmasdan)
docker compose down               # to'xtatish va konteynerlar + tarmoqni o'chirish
docker compose down -v            # + volume larni ham ⚠️ (ma'lumot yo'qoladi)

docker compose buyruqlarida — konteyner nomi emas, xizmat nomi (api, baza).

[!WARNING] docker compose down -v — bazaning barcha ma'lumotlarini o'chiradi. Ishlab chiqishda "toza boshlash" uchun qulay; production da — hech qachon.


Loyiha nomi

Compose barcha resurslarni loyiha nomi bilan prefikslaydi — standart holatda papka nomi:

dokon-api-1, dokon-baza-1, dokon_default, dokon_baza-data

Shuning uchun ikki turli papkadagi loyihalar (dokon/ va blog/) to'qnashmaydi — hatto ikkalasida ham baza xizmati bo'lsa ham.

docker compose -p mening-loyiha up -d        # boshqa nom

Yoki faylda: name: dokon (yuqorida).


Fayl nomi

Compose qidiradigan fayllar (tartib bo'yicha): compose.yaml, compose.yml, docker-compose.yaml, docker-compose.yml. Yangi loyihalarda — compose.yaml. Eski faylning boshida version: "3.8" bo'lsa — u eskirgan va kerak emas, olib tashlang.


Compose qachon kerak

Holat Compose
Ishlab chiqish: ilova + baza + kesh ✅ Ideal
Testlar va CI ✅
Bitta serverdagi kichik/o'rta production ✅ Ko'p loyihalar uchun yetarli (42-dars)
Ko'p serverli, avtomatik ko'payadigan tizim ❌ Kubernetes (44-dars)

Nima uchun shunday?

Nima uchun konfiguratsiya YAML faylda — docker run buyruqlarini skriptga yozib qo'ysa bo'lmaydimi?

Skript — qanday qilishni aytadi (imperativ): "avval tarmoq yarat, keyin buni ishga tushir". U ikkinchi marta ishga tushirilsa — "tarmoq allaqachon bor" xatolari. Compose fayli esa — nima bo'lishi kerakligini tasvirlaydi (deklarativ): "shunday xizmatlar, shunday sozlamalar bo'lsin". docker compose up hozirgi holatni kerakli holat bilan solishtiradi va faqat farqni bajaradi: o'zgarmagan konteynerga tegmaydi, o'zgarganini qayta yaratadi. Deklarativ yondashuv — zamonaviy infratuzilmaning asosi (Kubernetes, Terraform ham shunday).


Xulosa

Eslab qoling:

  • Compose — butun loyiha bitta compose.yaml da
  • services — xizmatlar; volumes — nomlangan volume lar
  • Avtomatik tarmoq — xizmatlar nomi bilan bir-birini topadi
  • up -d [--build], ps, logs -f, exec, down
  • down -v — ma'lumotni o'chiradi
  • Buyruqlarda — xizmat nomi; resurslar — loyiha nomi bilan prefikslanadi
  • version: — eskirgan, yozmang

Keyingi dars

27-dars: compose.yaml — services, ports, volumes, networks