Docker Compose nima — bir buyruqda butun loyiha
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
bazavakeshni topadi - Volume yaratdi
apiuchun image ni build qildidepends_onbo'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.yamlda services— xizmatlar;volumes— nomlangan volume lar- Avtomatik tarmoq — xizmatlar nomi bilan bir-birini topadi
up -d [--build],ps,logs -f,exec,downdown -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