- Омогућава вам да дефинишете и управљате сложеним инфраструктурама користећи једну YAML конфигурациону датотеку.
- Олакшава координацију услуга, мрежа и количина података како би се осигурала постојаност и комуникација података.
- Оптимизује локални развојни ток рада тако што вам омогућава да подесите цео технолошки стек једном командом.

Када заронимо у свет модерног развоја, схватимо да готово ниједна професионална апликација не ради сама у једном контејнеру. Нормално је имати екосистем у коме коегзистирају веб сервер, база података, систем за кеширање попут Редиса и можда ред порука. Ручно управљање свим овим, покретањем појединачних команди за сваку компоненту, представља праву главобољу и отворен позив за прављење озбиљних грешака.
Ту долази до изражаја Docker Compose, алат који је спасоносан јер нам омогућава да лако дефинишемо и покрећемо апликације са више контејнера . У суштини, он трансформише Docker из решења за изоловане контејнере у праву платформу за оркестрацију, идеалну за програмере који желе да избегну губљење времена на конфигурисање окружења и да се фокусирају на оно што је важно: писање кода.
Шта је тачно Docker Compose и како функционише?
За разлику од стандардног Докера, који се фокусира на креирање и покретање појединачних слика, Compose координира рад више контејнера заједно. Његова магија лежи у коришћењу YAML конфигурационе датотеке (обично се назива docker-compose.yml или compose.yaml ). Овај документ описује целу архитектуру: које су услуге потребне, како би требало да се повезују једне са другима и где ће се подаци чувати.
Једном командом, алат чита ову датотеку и подешава цео конфигурисани сервисни стек. То је разлика између склапања намештаја део по део пратећи бескрајни приручник и магичног дугмета које поставља сав намештај на тачно место у трен ока.
Docker Compose V2: Шта је ново у тренутном стандарду
Важно је напоменути да је од 2022. године стандард Верзија 2. Ако долазите са старијих туторијала, приметићете кључне промене. Прво, команда је еволуирала: цртица (docker-compose) се више не користи; сада је уграђени Докер додатак, па покрећемо `docker compose` . Такође, линија верзије на почетку датотеке (као што је `version: '3.8')` више није потребна и систем је једноставно игнорише.
Велика предност је што је већ укључен у Docker Desktop за Windows и macOS, као и у модерне Docker Engine инсталације на Linux-у, што елиминише потребу да се инсталира као засебан пакет у већини случајева.
Анатомија конфигурационе датотеке

YAML датотека је хијерархијски организована у три основна дела која морамо савладати како бисмо избегли грешке:
- Услуге: Ово је најважнији део. Овде дефинишемо сваки контејнер апликације. За сваку услугу можемо да одредимо слику коју ћемо користити, Dockerfile за локалну изградњу, портове које желимо да изложимо и променљиве окружења.
- Свеске: Они спречавају нестанак података када се контејнер заустави или обрише. Они омогућавају постојаност података ван животног циклуса контејнера.
- Мреже: Они дефинишу како контејнери комуницирају. Подразумевано, Compose креира дељену мрежу где се налазе сервиси користећи име сервиса као име хоста, чиме се избегава мука око управљања ручним IP адресама.
Напредна подешавања и кључни параметри
Да бисте извукли максимум из алата, постоји неколико параметара које сваки програмер треба да зна. На пример, `depends_on` је од виталног значаја за контролу редоследа покретања; ако вашој апликацији треба да база података буде спремна пре покретања, овај параметар је прави избор. У верзији 2, можемо чак додати и провере исправности тако да сервис чека док база података заиста не буде оперативна, а не само да је „укључена“.
Што се тиче запремина, постоје именоване запремине , којима управља Docker и које су савршене за базе података, и bind mount-ови , који повезују фасциклу на нашем рачунару са једном у контејнеру, што је нешто што је неопходно у развоју како би се промене у коду одмах одразиле без поновног покретања било чега.
Инсталација у складу са оперативним системом
Ако немате Docker Desktop, процес инсталације варира. На Windows-у и macOS-у , најједноставнија опција је инсталирање Docker Desktop-а, који већ укључује све. На Linux-у , процес обично укључује ажурирање менаџера пакета помоћу `sudo apt-get update`, а затим инсталирање званичног додатка помоћу `sudo apt-get install docker-compose-plugin`.
Једном инсталирано, увек је добра идеја да проверите да ли све исправно функционише покретањем команде `docker compose version` у терминалу. Ако врати број верзије, спремни сте да започнете оркестрацију.
Управљање животним циклусом и основне команде
Управљање окружењем је веома интуитивно захваљујући низу основних команди. Да бисмо покренули цео пројекат у позадини, користимо `docker compose up -d` . Ако желимо да зауставимо и очистимо све (контејнере и мреже), команда је `docker compose down`. Ако желимо и да обришемо волумене да бисмо почели испочетка, додајемо заставицу `--volumes`.
За свакодневну употребу, `docker compose logs` је веома користан за праћење шта се дешава унутар контејнера, а `docker compose ps` је користан за преглед тренутног стања сервиса. Поред тога, ако нам је потребан приступ конзоли покренутог контејнера, можемо користити команду `exec`.
Поређење: Docker Compose наспрам Kubernetes-а

Веома је уобичајено да се помешају, али имају различите намене. Docker Compose је алат за локална развојна и тестна окружења због своје једноставности. Не захтева сложену инфраструктуру и невероватно се брзо подешава.
Насупрот томе, Кубернетес је дизајниран за производњу великих размера. Нуди аутоматско скалирање, напредно балансирање оптерећења и управљање кластерима са више чворова. У професионалном сектору, најчешће се користи Compose на машини програмера , а Кубернетес након што је апликација распоређена у производњу.
Практични случај: Креирање стека помоћу Пајтона и ПХП-а
Да бисмо ово боље разумели, замислимо API направљен помоћу Flask-а (Python) који враћа листу воћа и PHP веб локацију која користи тај API. Прво, креирали бисмо API код и одговарајућу Docker датотеку. Затим бисмо креирали PHP код веб локације.
У датотеци compose.yaml, дефинисали бисмо fruit-service (направљен из Python фолдера) и website сервис (користећи званичну PHP слику са Apache-ом). Мапирањем портова (на пример, 5000 за веб локацију и 5001 за API) и успостављањем зависности веб локације од API-ја, осигуравамо да цео екосистем функционише беспрекорно једном командом.
Ова могућност паковања целе инфраструктуре омогућава било ком члану тима да клонира спремиште, покрене команду за покретање и има потпуно исто радно окружење као и ми, елиминишући класичан проблем „ради на мојој машини“.

Имплементација овог алата радикално оптимизује време имплементације и конзистентност у различитим окружењима, омогућавајући управљање услугама, перзистенцију података кроз запремине и изоловану комуникацију путем прилагођених мрежа са једне контролне тачке, поједностављујући прелазак са локалног развоја на производну инфраструктуру.