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.
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:
imageโ ishlatiladigan tayyor image (masalanpostgres:16);buildโ image'ni yaratish uchun Dockerfile yo'li (image o'rniga);portsโ port bog'lash ro'yxati (-pbayrog'iga teng);environmentโ muhit o'zgaruvchilari (-ebayrog'iga teng);volumesโ ma'lumot saqlash uchun ulanishlar (-vbayrog'iga teng);depends_onโ bu xizmat qaysi boshqa xizmatlarga bog'liqligini bildiradi (ishga tushirish tartibi).
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:
- web xizmati: joriy papkadagi Dockerfile'dan yaratiladi (
build: .), 3000-port ochiladi, muhit o'zgaruvchilari beriladi va udbxizmatiga bog'liq; - db xizmati:
postgres:16image'idan, parol va baza nomi bilan, ma'lumot volume'da saqlanadi; - pastdagi
volumes:bo'limi โ nomli volume'ni e'lon qiladi (bu haqda keyingi darsda).
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
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
- Docker Compose bir nechta konteynerni bitta fayl orqali boshqaradi;
docker-compose.ymlโ YAML formatidagi fayl, unda chekinish (bo'sh joy) muhim;- Har bir
servicesostidagi element โ bitta konteyner (xizmat); - Asosiy sozlamalar:
image/build,ports,environment,volumes,depends_on; - Xizmatlar bir-birini nomi orqali topadi (IP kerak emas) โ masalan
DB_HOST=db; docker compose up -dโ hammasini ishga tushiradi,docker compose downโ to'xtatib o'chiradi.