🐳
Хостинг

Docker Compose: кўп контейнерли иловани битта YAML файлда бошқариш

03.01.2026
← Барча мақолалар

Замонавий веб-иловалар деярли ҳеч қачон битта дастурдан иборат бўлмайди. Оддий бир лойиҳа ҳам одатда веб-сервер, маълумотлар базаси ва кеш хизматини бирга талаб қилади. Ана шу компонентларни ҳар бирини алоҳида ўрнатиш, созлаш ва бир-бирига улаш кўп вақт олади ҳамда хатоларга сабаб бўлади. Docker ва Docker Compose айнан шу муаммони ҳал қилиш учун яратилган бўлиб, бутун ишлаш муҳитини битта файл орқали эълон қилиш ва бир буйруқ билан ишга тушириш имконини беради.

Контейнер нима ва нега керак

Docker контейнери — бу иловани унинг барча боғлиқликлари билан бирга ўраб олувчи енгил, изоляция қилинган муҳитдир. Виртуал машинадан фарқли равишда контейнер бутун операцион тизимни эмас, балки фақат илова учун зарур кутубхоналар ва файлларни ўз ичига олади, шунинг учун у тез ишга тушади ва кам ресурс сарфлайди. Бир хил контейнер дастурчининг ноутбукида ҳам, сайт.уз серверида ҳам бир хил тарзда ишлайди, бу эса «менда ишлаяпти-ку» деган классик муаммони бутунлай йўқотади. Контейнер образи (image) — бу контейнерни яратиш учун шаблон бўлиб, ундан исталганча бир хил нусхалар кўтариш мумкин.

Битта контейнер билан ишлаш осон, лекин ҳақиқий лойиҳаларда бир нечта контейнер керак бўлади ва уларни қўлда бошқариш мураккаблашади. Ҳар бир контейнер учун алоҳида тармоқ, порт ва ўзаро боғланишни қўлда ёзиш чарчатади. Айнан шу ерда Docker Compose воситаси ёрдамга келади ва бир нечта контейнерни ягона, изчил тизим сифатида бошқаришни соддалаштиради.

Docker Compose нима қилади

Docker Compose — бу кўп контейнерли иловаларни эълон қилиш ва бошқариш учун мўлжалланган восита. Сиз барча керакли хизматларни, уларнинг образларини, портларини, жилдларини ва ўзаро боғлиқликларини битта docker-compose.yml номли YAML файлда тасвирлайсиз. Шундан сўнг ягона буйруқ билан бутун тизим ишга тушади: Compose керакли образларни юклаб олади, контейнерларни яратади, улар орасида тармоқ ўрнатади ва белгиланган тартибда ишга туширади. Бу ёндашув муҳитни код сифатида сақлаш имконини беради, яъни конфигурация файлини Git'да версиялаш ва жамоа билан улашиш мумкин.

docker-compose.yml тузилмаси

Compose файлининг марказида services бўлими туради — бу ерда ҳар бир контейнер хизмати эълон қилинади. Ҳар бир хизмат учун image орқали қайси образ ишлатилишини, ports орқали ташқи ва ички портларни боғлашни, volumes орқали маълумотларни доимий сақлаш учун жилдларни, environment орқали муҳит ўзгарувчиларини ва depends_on орқали ишга тушиш тартибини белгилайсиз. Қуйидаги мисол асосий майдонларни кўрсатади:

services:
  web:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    environment:
      APP_ENV: production
    depends_on:
      - db
      - cache

Бу ерда ports остидаги «8080:80» ёзуви сервернинг 8080-портини контейнернинг ички 80-портига йўналтиради. volumes эса лойиҳа кодини хост тизимдан контейнерга улайди, шунинг учун кодни ўзгартирганда контейнерни қайта қуриш шарт эмас. depends_on Compose'га web хизматини маълумотлар базаси ва кешдан кейин ишга туширишни айтади.

Амалий мисол: PHP + MySQL + Redis

Энди тўлиқ, реал лойиҳага яқин мисолни кўриб чиқамиз. Бунда веб-илова PHP'да ишлайди, маълумотлар MySQL базасида сақланади, тез-тез сўраладиган маълумотлар эса Redis кешида туради. Қуйидаги конфигурация учта хизматни бир-бирига боғлайди ва уларнинг барчасини ягона тармоқда бирлаштиради:

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:

Эътибор беринг, app хизмати ичидан маълумотлар базасига уланишда хост сифатида оддийгина db номини ишлатиш мумкин, чунки Compose ҳар бир хизматни номи бўйича тармоқда топиладиган қилади. Пастдаги volumes бўлимида эълон қилинган db_data — бу номланган жилд бўлиб, MySQL маълумотлари контейнер ўчирилганда ҳам сақланиб қолишини таъминлайди. Бу жуда муҳим, акс ҳолда ҳар сафар контейнер қайта яратилганда база бўшаб қолар эди.

Асосий буйруқлар

Compose билан ишлаш бир нечта содда буйруққа таянади. Бутун муҳитни ишга тушириш учун лойиҳа папкасида туриб docker compose up буйруғи берилади; -d байроғи билан у фон режимида ишлайди ва терминални банд қилмайди. Тизимни тўхтатиб, яратилган контейнер ва тармоқларни тозалаш учун docker compose down ишлатилади. Хизматларнинг иш жараёнини кузатиш ва хатоларни топиш учун docker compose logs буйруғи жуда фойдали:

docker compose up -d
docker compose logs -f app
docker compose ps
docker compose down

Бу буйруқлар ортида бутун бир муҳитнинг ҳаёти ётади. Битта up билан дастурчи соатлаб давом этадиган қўлда созлашлардан қутулади, down эса муҳитни изсиз тозалаб, тизимни аввалги ҳолатига қайтаради.

Афзалликлар ва dev ҳамда prod фарқи

Docker Compose'нинг энг катта афзаллиги — бутун мураккаб муҳитни бир буйруқ билан кўтариш ва бир буйруқ билан тўхтатиш имкониятидир. Янги дастурчи жамоага қўшилганда унга фақат репозиторийни клонлаш ва up буйруғини бериш кифоя; у соатлар эмас, дақиқалар ичида ишчи муҳитга эга бўлади. Келишув конфигурация файл ичида ёзилганлиги сабабли, ҳамма бир хил версиялардаги хизматлар билан ишлайди ва муҳитлар орасидаги фарқлар йўқолади.

Шу билан бирга, ишлаб чиқиш (dev) ва ишлаб чиқариш (prod) муҳитлари учун ёндашув бироз фарқ қилади. Dev режимида кодни жонли таҳрирлаш учун хост жилдларини контейнерга улаш қулай, debug режими ёқилади ва пароллар оддий бўлиши мумкин. Prod режимида эса хавфсизлик биринчи ўринда туради: махфий маълумотлар муҳит ўзгарувчилари ёки махсус сақлаш орқали ҳимояланади, кодни жонли улаш ўрнига образга тўлиқ жойлаштириш афзал кўрилади ва ресурс чекловлари қўйилади. Сайт.уз серверларида лойиҳангизни жойлаштиришда айнан шу prod ёндашувни қўллаш барқарор ва хавфсиз ишлашни таъминлайди. Docker Compose'ни ўрганиш бугунги дастурчи ва DevOps мутахассиси учун зарурий кўникмага айланган.

Ўхшаш мақолалар

💰 Хостинг нарх таққослаш 📡 Сервер мониторинг воситалари 🌐 Edge computing хостинг 🏢 Colocation сервер
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English