Zamonaviy veb-ilovalar deyarli hech qachon bitta dasturdan iborat bo'lmaydi. Oddiy bir loyiha ham odatda veb-server, ma'lumotlar bazasi va kesh xizmatini birga talab qiladi. Ana shu komponentlarni har birini alohida o'rnatish, sozlash va bir-biriga ulash ko'p vaqt oladi hamda xatolarga sabab bo'ladi. Docker va Docker Compose aynan shu muammoni hal qilish uchun yaratilgan bo'lib, butun ishlash muhitini bitta fayl orqali e'lon qilish va bir buyruq bilan ishga tushirish imkonini beradi.
Konteyner nima va nega kerak
Docker konteyneri โ bu ilovani uning barcha bog'liqliklari bilan birga o'rab oluvchi yengil, izolyatsiya qilingan muhitdir. Virtual mashinadan farqli ravishda konteyner butun operatsion tizimni emas, balki faqat ilova uchun zarur kutubxonalar va fayllarni o'z ichiga oladi, shuning uchun u tez ishga tushadi va kam resurs sarflaydi. Bir xil konteyner dasturchining noutbukida ham, sayt.uz serverida ham bir xil tarzda ishlaydi, bu esa "menda ishlayapti-ku" degan klassik muammoni butunlay yo'qotadi. Konteyner obrazi (image) โ bu konteynerni yaratish uchun shablon bo'lib, undan istalgancha bir xil nusxalar ko'tarish mumkin.
Bitta konteyner bilan ishlash oson, lekin haqiqiy loyihalarda bir nechta konteyner kerak bo'ladi va ularni qo'lda boshqarish murakkablashadi. Har bir konteyner uchun alohida tarmoq, port va o'zaro bog'lanishni qo'lda yozish charchatadi. Aynan shu yerda Docker Compose vositasi yordamga keladi va bir nechta konteynerni yagona, izchil tizim sifatida boshqarishni soddalashtiradi.
Docker Compose nima qiladi
Docker Compose โ bu ko'p konteynerli ilovalarni e'lon qilish va boshqarish uchun mo'ljallangan vosita. Siz barcha kerakli xizmatlarni, ularning obrazlarini, portlarini, jildlarini va o'zaro bog'liqliklarini bitta docker-compose.yml nomli YAML faylda tasvirlaysiz. Shundan so'ng yagona buyruq bilan butun tizim ishga tushadi: Compose kerakli obrazlarni yuklab oladi, konteynerlarni yaratadi, ular orasida tarmoq o'rnatadi va belgilangan tartibda ishga tushiradi. Bu yondashuv muhitni kod sifatida saqlash imkonini beradi, ya'ni konfiguratsiya faylini Git'da versiyalash va jamoa bilan ulashish mumkin.
docker-compose.yml tuzilmasi
Compose faylining markazida services bo'limi turadi โ bu yerda har bir konteyner xizmati e'lon qilinadi. Har bir xizmat uchun image orqali qaysi obraz ishlatilishini, ports orqali tashqi va ichki portlarni bog'lashni, volumes orqali ma'lumotlarni doimiy saqlash uchun jildlarni, environment orqali muhit o'zgaruvchilarini va depends_on orqali ishga tushish tartibini belgilaysiz. Quyidagi misol asosiy maydonlarni ko'rsatadi:
services:
web:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
environment:
APP_ENV: production
depends_on:
- db
- cache
Bu yerda ports ostidagi "8080:80" yozuvi serverning 8080-portini konteynerning ichki 80-portiga yo'naltiradi. volumes esa loyiha kodini host tizimdan konteynerga ulaydi, shuning uchun kodni o'zgartirganda konteynerni qayta qurish shart emas. depends_on Compose'ga web xizmatini ma'lumotlar bazasi va keshdan keyin ishga tushirishni aytadi.
Amaliy misol: PHP + MySQL + Redis
Endi to'liq, real loyihaga yaqin misolni ko'rib chiqamiz. Bunda veb-ilova PHP'da ishlaydi, ma'lumotlar MySQL bazasida saqlanadi, tez-tez so'raladigan ma'lumotlar esa Redis keshida turadi. Quyidagi konfiguratsiya uchta xizmatni bir-biriga bog'laydi va ularning barchasini yagona tarmoqda birlashtiradi:
services:
app:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
- cache
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: shop
volumes:
- db_data:/var/lib/mysql
cache:
image: redis:7
ports:
- "6379:6379"
volumes:
db_data:
E'tibor bering, app xizmati ichidan ma'lumotlar bazasiga ulanishda host sifatida oddiygina db nomini ishlatish mumkin, chunki Compose har bir xizmatni nomi bo'yicha tarmoqda topiladigan qiladi. Pastdagi volumes bo'limida e'lon qilingan db_data โ bu nomlangan jild bo'lib, MySQL ma'lumotlari konteyner o'chirilganda ham saqlanib qolishini ta'minlaydi. Bu juda muhim, aks holda har safar konteyner qayta yaratilganda baza bo'shab qolar edi.
Asosiy buyruqlar
Compose bilan ishlash bir nechta sodda buyruqqa tayanadi. Butun muhitni ishga tushirish uchun loyiha papkasida turib docker compose up buyrug'i beriladi; -d bayrog'i bilan u fon rejimida ishlaydi va terminalni band qilmaydi. Tizimni to'xtatib, yaratilgan konteyner va tarmoqlarni tozalash uchun docker compose down ishlatiladi. Xizmatlarning ish jarayonini kuzatish va xatolarni topish uchun docker compose logs buyrug'i juda foydali:
docker compose up -d
docker compose logs -f app
docker compose ps
docker compose down
Bu buyruqlar ortida butun bir muhitning hayoti yotadi. Bitta up bilan dasturchi soatlab davom etadigan qo'lda sozlashlardan qutuladi, down esa muhitni izsiz tozalab, tizimni avvalgi holatiga qaytaradi.
Afzalliklar va dev hamda prod farqi
Docker Compose'ning eng katta afzalligi โ butun murakkab muhitni bir buyruq bilan ko'tarish va bir buyruq bilan to'xtatish imkoniyatidir. Yangi dasturchi jamoaga qo'shilganda unga faqat repozitoriyni klonlash va up buyrug'ini berish kifoya; u soatlar emas, daqiqalar ichida ishchi muhitga ega bo'ladi. Kelishuv (konfiguratsiya) fayl ichida yozilganligi sababli, hamma bir xil versiyalardagi xizmatlar bilan ishlaydi va muhitlar orasidagi farqlar yo'qoladi.
Shu bilan birga, ishlab chiqish (dev) va ishlab chiqarish (prod) muhitlari uchun yondashuv biroz farq qiladi. Dev rejimida kodni jonli tahrirlash uchun host jildlarini konteynerga ulash qulay, debug rejimi yoqiladi va parollar oddiy bo'lishi mumkin. Prod rejimida esa xavfsizlik birinchi o'rinda turadi: maxfiy ma'lumotlar muhit o'zgaruvchilari yoki maxsus saqlash orqali himoyalanadi, kodni jonli ulash o'rniga obrazga to'liq joylashtirish afzal ko'riladi va resurs cheklovlari qo'yiladi. sayt.uz serverlarida loyihangizni joylashtirishda aynan shu prod yondashuvni qo'llash barqaror va xavfsiz ishlashni ta'minlaydi. Docker Compose'ni o'rganish bugungi dasturchi va DevOps mutaxassisi uchun zaruriy ko'nikmaga aylangan.