Docker Compose: ko‘p konteynerli ilovalarni qanday ishga tushirish
Amaliyot3 daqInnovialabs tahririyati
Qisqacha
Docker Compose loyihaning barcha konteynerlarini bitta YAML faylda tasvirlaydi va ularni bitta docker compose up buyrug‘i bilan ishga tushiradi. Servislar bir-birini nomi bo‘yicha ko‘radi, ma’lumotlar volume’da, sozlamalar .env’da saqlanadi.
Docker Compose nima
Docker Compose — bir nechta konteynerni bitta compose.yaml faylida tasvirlaydigan va ularni yagona ilova sifatida boshqaradigan vosita. Bayroqlarga to‘la uchta uzun docker run buyrug‘i o‘rniga konfiguratsiyani bir marta yozasiz va hammasini docker compose up orqali ishga tushirasiz.
Veb-loyiha uchun odatiy to‘plam: ilova, ma’lumotlar bazasi (PostgreSQL) va kesh (Redis). Uni bosqichma-bosqich yig‘amiz.
1-qadam: ilova servisi
services:
app:
build: .
ports:
- "3000:3000"
env_file: .env
build: .— joriy papkadagi Dockerfile’dan obraz yig‘ish.ports— konteyner portini xostga chiqarish:xost:konteyner.env_file— muhit o‘zgaruvchilarini fayldan yuklash.
2-qadam: ma’lumotlar bazasi va volume
db:
image: postgres:16
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER}"]
interval: 5s
retries: 5
volumes:
db-data:
image— tayyor rasmiy obraz, hech narsa yig‘ish shart emas.${...}— qiymatlar compose fayl yonidagi.envfaylidan qo‘yiladi.- Nomlangan volume
db-datama’lumotlarni konteynerdan tashqarida saqlaydi: konteynerni qayta yaratish ularni o‘chirmaydi. healthcheckbaza haqiqatan ulanishlarni qabul qilishga tayyorligini tekshiradi.$$belgisi$ni ekranlaydi, o‘zgaruvchini konteyner ichidagi shell ochishi uchun.
3-qadam: kesh
cache:
image: redis:7
Portni tashqariga chiqarmaymiz: Redis faqat ilovaga kerak.
4-qadam: depends_on va ishga tushirish tartibi
app servisiga qo‘shing:
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
Oddiy depends_on faqat konteynerlarning ishga tushish tartibini kafolatlaydi, servis tayyorligini emas. service_healthy sharti bazaning healthcheck’i muvaffaqiyatli o‘tishini kutadi. Baribir ilova bazaga qayta ulana olishi foydali — bu ishonchliroq.
Tarmoqlar: servislar bir-birini qanday topadi
Compose loyiha uchun avtomatik umumiy tarmoq yaratadi. Uning ichida har bir servis nomi bo‘yicha mavjud. Shuning uchun ilovaning .env faylida xost sifatida localhost emas, db yoziladi:
POSTGRES_USER=app
POSTGRES_PASSWORD=change-me
POSTGRES_DB=app
DATABASE_URL=postgres://app:change-me@db:5432/app
REDIS_URL=redis://cache:6379
Konteyner ichida localhost konteynerning o‘ziga ishora qiladi — bu «connection refused» xatosining tez-tez uchraydigan sababi. .env faylini .gitignorega qo‘shing, repozitoriyda esa .env.exampleni saqlang.
networks kaliti orqali alohida tarmoqlar servislarni bir-biridan ajratish kerak bo‘lganda foydali, masalan frontendni bazadan.
Kundalik buyruqlar
| Buyruq | Nima qiladi |
|---|---|
docker compose up -d | Hammasini fonda ishga tushirish |
docker compose up -d --build | Obrazlarni qayta yig‘ib ishga tushirish |
docker compose ps | Servislar ro‘yxati va holati |
docker compose logs -f app | Servis loglarini real vaqtda ko‘rish |
docker compose exec db psql -U app | Ishlayotgan konteynerda buyruq bajarish |
docker compose down | Konteynerlar va tarmoqni to‘xtatib o‘chirish |
docker compose down -v | Xuddi shu, qo‘shimcha volume’larni o‘chirish — baza ma’lumotlari yo‘qoladi |
Keng tarqalgan xatolar
- Ulanish satrida servis nomi o‘rniga
localhost. - Parollar to‘g‘ridan-to‘g‘ri
compose.yamlda va Gitga commit qilingan. - «Har ehtimolga qarshi»
down -v— va lokal bazani yo‘qotish. - Serverda zaruratsiz baza portini tashqariga ochish.
- healthcheck’siz
depends_onbaza tayyor bo‘lishini kutadi deb o‘ylash.