Пераклад транскрыпцыі падкасьце падрыхтаваны напярэдадні старту курса
Docker Compose - гэта дзіўная прылада для стварэння працоўнага
акружэння для стэка, які выкарыстоўваецца ў вашым дадатку. Ён дазваляе вам вызначаць
кожны кампанент вашага прыкладання, прытрымліваючыся дакладнаму і простаму сінтаксісу ў
файлах
З з'яўленнем
кластарам
Але ці значыць гэта, што вы можаце выкарыстоўваць адзін і той жа docker-compose файл у
працэсе распрацоўкі і ў прадакшэн асяроддзі? Або выкарыстоўваць гэты ж файл для
стэйджынгу? Ну, у цэлым - так, але для такога функцыяналу нам неабходна наступнае:
- Інтэрпаляцыя зменных: выкарыстанне зменных асяроддзя для некаторых
значэнняў, якія змяняюцца ў кожным асяроддзі. - Пераазначэнне канфігурацыі: магчымасць вызначыць другі (ці любы
іншы наступны) docker-compose файл, які нешта зменіць адносна
першага, і docker compose паклапоціцца аб зліцці абодвух файлаў.
Адрозненні паміж файламі для распрацоўкі і прадакшэну
Падчас распрацоўкі вы, хутчэй за ўсё, захочаце правяраць змены кода ў
рэжыме рэальнага часу. Для гэтага, як правіла, том з зыходным кодам мантуецца ў
кантэйнер, у якім знаходзіцца рантайм для вашага прыкладання. Але для прадакшн-асяроддзя
такі спосаб не падыходзіць.
У прадакшэне ў вас ёсць кластар з мноствам вузлоў, а тым з'яўляецца лакальным па
адносінах да вузла, на якім працуе ваш кантэйнер (або сэрвіс), таму вы не
можаце мантаваць зыходны код без складаных аперацый, якія ўключаюць у сябе
сінхранізацыю кода, сігналы і т. д.
Замест гэтага мы, звычайна, жадаем стварыць выяву з пэўнай версіяй вашага кода.
Яго прынята пазначаць адпаведным тэгам (можна выкарыстоўваць семантычнае
версіяванне або іншую сістэму на ваша меркаванне).
Пераазначэнне канфігурацыі
Улічваючы адрозненні і тое, што вашыя залежнасці могуць адрознівацца ў сцэнарах
распрацоўкі і прадакшэна, ясна, што нам спатрэбяцца розныя канфігурацыйныя файлы.
Docker compose падтрымлівае аб'яднанне розных compose-файлаў для
атрымання канчатковай канфігурацыі. Як гэта працуе можна ўбачыць на прыкладзе:
$ cat docker-compose.yml
version: "3.2"
services:
whale:
image: docker/whalesay
command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ________
whale_1 | < hello! >
whale_1 | --------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Як было сказана, docker compose падтрымлівае аб'яднанне некалькіх compose-
файлаў, гэта дазваляе перавызначаць розныя параметры ў другім файле. Напрыклад:
$ cat docker-compose.second.yml
version: "3.2"
services:
whale:
command: ["cowsay", "bye!"]
$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Такі сінтаксіс не вельмі зручны ў працэсе распрацоўкі, калі каманду
спатрэбіцца выконваць мноства разоў.
На шчасце, docker compose аўтаматычна шукае спецыяльны файл з імем
docker-compose.override.yml для пераазначэння значэнняў докер-compose.yml. Калі
перайменаваць другі файл, то атрымаецца той жа вынік, толькі з дапамогай першапачатковай каманды:
$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Добра, так запомніць прасцей.
Інтэрпаляцыя зменных
Файлы канфігурацыі падтрымліваюць
зменных
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...
І калі вы выконваеце docker-compose build (або push) без зменнай асяроддзя
$MY_SERVICE_VERSION, будзе выкарыстана значэнне апошні, але калі вы ўсталюеце
значэнне зменнай асяроддзі да зборкі, яно будзе выкарыстана пры зборцы або пушы
у рэгістр private.registry.mine.
Мае прынцыпы
Падыходы, якія зручныя для мяне, могуць спатрэбіцца і вам. Я прытрымліваюся гэтым
простым правілам:
- Усе мае стэкі для прадакшэна, распрацоўкі (або іншых асяроддзяў) вызначаюцца праз
файлы docker-compose. - Файлы канфігурацыі, неабходныя для ахопу ўсіх маіх асяроддзяў, максімальна
пазбягаюць дубліравання. - Мне патрэбна адна простая каманда для працы ў кожным асяроддзі.
- Асноўная канфігурацыя вызначаецца ў файле докер-compose.yml.
- Пераменныя асяроддзі выкарыстоўваюцца для вызначэння тэгаў выяў або іншых
зменных, якія могуць мяняцца ад асяроддзя да асяроддзя (стэйджынг, інтэграцыя,
прадакшэн). - Значэнні зменных для прадакшэну выкарыстоўваюцца ў якасці значэнняў па
змаўчанні, гэта мінімізуе рызыкі ў выпадку запуску стэка ў прадакшэне без
устаноўленай зменнай акружэння. - Для запуску сэрвісу ў прадакшэн-асяроддзі выкарыстоўваецца каманда docker stack deploy - compose-file docker-compose.yml -with-registry-auth my-stack-name.
- Працоўнае асяроддзе запускаецца з дапамогай каманды докер-кампанаваць да -d.
Давайце паглядзім на просты прыклад.
# docker-compose.yml
...
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
environment:
API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...
И
# docker-compose.override.yml
...
services:
my-service:
ports: # This is needed for development!
- 80:80
environment:
API_ENDPOINT: https://devel.my-api.com
volumes:
- ./:/project/src
...
Я магу выкарыстоўваць docker-compose (docker-compose up), Каб запусціць стэк у
рэжыме распрацоўкі з зыходным кодам, змантаваным у /project/src.
Я магу выкарыстоўваць гэтыя ж файлы на прадакшэне! І я мог бы выкарыстоўваць дакладна
такі ж файл докер-compose.yml для стэйджынгу. Каб разгарнуць гэта на
прадакшэн, мне проста трэба сабраць і адправіць вобраз з наканаваным тэгам
на этапе CI:
export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push
На прадакшэне гэта можна запусціць з дапамогай наступных каманд:
export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
І калі вы хочаце зрабіць тое ж самае на стэйджы, неабходна проста вызначыць
неабходныя зменныя асяроддзі для працы ў асяроддзі стэйджынгу:
export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
У выніку мы выкарыстоўвалі два розных docker-compose файла, якія без
дубліравання канфігурацый могуць выкарыстоўвацца для любой вашай асяроддзя!
Даведацца падрабязней аб курсе
Крыніца: habr.com