Docker Compose: od vývoja po výrobu

Preklad prepisu podcastu pripravený v očakávaní začiatku kurzu "Správca Linuxu"

Docker Compose: od vývoja po výrobu

Docker Compose je úžasný nástroj na vytváranie diela
prostredie pre zásobník používaný vo vašej aplikácii. Umožňuje vám definovať
každý komponent vašej aplikácie podľa jasnej a jednoduchej syntaxe v YAML-
súbory
.

S príchodom docker compose v3 tieto súbory YAML je možné použiť priamo v produkčnom prostredí pri práci
zhluk Dockerov roj.

Znamená to však, že môžete použiť rovnaký súbor docker-compose v
vývojovom procese a vo výrobnom prostredí? Alebo použite rovnaký súbor pre
inscenácia? Vo všeobecnosti áno, ale pre túto funkciu potrebujeme nasledovné:

  • Interpolácia premenných: použitie premenných prostredia pre niektorých
    hodnoty, ktoré sa menia v každom prostredí.
  • Prepísanie konfigurácie: schopnosť definovať sekundu (alebo ľubovoľnú
    ďalší nasledujúci) súbor docker-compose, ktorý niečo zmení
    najprv a docker compose sa postará o zlúčenie oboch súborov.

Rozdiely medzi vývojovými a produkčnými súbormi

Počas vývoja budete s najväčšou pravdepodobnosťou chcieť skontrolovať zmeny kódu
reálny čas. Na tento účel je zvyčajne pripojený zväzok so zdrojovým kódom
kontajner, ktorý obsahuje runtime pre vašu aplikáciu. Ale pre produkčné prostredie
Táto metóda nie je vhodná.

V produkcii máte klaster s mnohými uzlami a objem je lokálny
vzhľadom na uzol, na ktorom beží váš kontajner (alebo služba), takže nie
môžete pripojiť zdrojový kód bez zložitých operácií, ktoré zahŕňajú
synchronizácia kódu, signály atď.

Namiesto toho zvyčajne chceme vytvoriť obrázok s konkrétnou verziou vášho kódu.
Je obvyklé označiť ho príslušnou značkou (môžete použiť sémantický
verzia alebo iný systém podľa vlastného uváženia).

Prepísanie konfigurácie

Vzhľadom na rozdiely a na to, že vaše závislosti sa môžu v scenároch líšiť
vývoj a výroba, je jasné, že budeme potrebovať rôzne konfiguračné súbory.

Docker compose podporuje zlúčenie rôznych komponovaných súborov
získať konečnú konfiguráciu. Ako to funguje je možné vidieť na príklade:

$ 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

Ako už bolo povedané, docker compose podporuje kombinovanie viacerých kompozícií -
súbory, to vám umožní prepísať rôzne parametre v druhom súbore. Napríklad:

$ 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

Táto syntax nie je príliš vhodná pri vývoji, keď príkaz
bude potrebné vykonať mnohokrát.

Našťastie docker compose automaticky vyhľadá špeciálny súbor s názvom
docker-compose.override.yml prepísať hodnoty prístavný robotník-compose.yml, ak
premenujte druhý súbor, získate rovnaký výsledok, iba pomocou pôvodného príkazu:

$ 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

Dobre, je to ľahšie zapamätateľné.

Interpolácia premenných

Podpora konfiguračných súborov interpolácia
premenné
a predvolené hodnoty. To znamená, že môžete urobiť nasledovné:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

A ak áno zostavenie pomocou docker-compose (alebo push) bez premennej prostredia
$MY_SERVICE_VERSION, použije sa hodnota poslednýale ak nastavíte
hodnotu premennej prostredia pred zostavením, použije sa pri zostavovaní alebo tlačení
do registra súkromný.registr.baňa.

Moje zásady

Prístupy, ktoré fungujú pre mňa, môžu fungovať aj pre vás. riadim sa týmito
jednoduché pravidlá:

  • Všetky moje zásobníky pre produkciu, vývoj (alebo iné prostredia) sú definované prostredníctvom
    docker-compose súbory
  • Konfiguračné súbory potrebné na pokrytie všetkých mojich prostredí v čo najväčšej možnej miere
    vyhnúť sa duplicite.
  • Potrebujem jeden jednoduchý príkaz na prácu v každom prostredí.
  • Hlavná konfigurácia je definovaná v súbore prístavný robotník-compose.yml.
  • Premenné prostredia sa používajú na definovanie značiek obrázkov alebo iných
    premenné, ktoré sa môžu líšiť v závislosti od prostredia (staging, integrácia,
    výroba).
  • Hodnoty výrobných premenných sa používajú ako hodnoty pre
    v predvolenom nastavení sa tým minimalizujú riziká, ak sa zásobník spustí vo výrobe bez
    nastaviť premennú prostredia.
  • Ak chcete spustiť službu v produkčnom prostredí, použite príkaz nasadenie zásobníka dockera - súbor na vytvorenie súboru docker-compose.yml -s-autorizáciou-registra môj názov zásobníka.
  • Pracovné prostredie sa spúšťa pomocou príkazu docker-skladať hore -d.

Pozrime sa na jednoduchý príklad.

# 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
...

môžem použiť docker-compose (docker-compose up)spustiť zásobník
vývojový režim s namontovaným zdrojovým kódom /projekt/src.

Tieto isté súbory môžem použiť vo výrobe! A určite by som mohol použiť
rovnaký súbor prístavný robotník-compose.yml na inscenáciu. Ak chcete toto rozšíriť
výroba, potrebujem len postaviť a poslať obrázok s preddefinovaným tagom
v štádiu CI:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

V produkcii to možno spustiť pomocou nasledujúcich príkazov:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

A ak chcete urobiť to isté na pódiu, stačí definovať
необходимые переменные окружения для работы в среде стейджинга:

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

V dôsledku toho sme použili dva rôzne súbory docker-compose, ktoré bez
Duplicitné konfigurácie je možné použiť pre akékoľvek prostredie, ktoré máte!

Zistite viac o kurze "Správca Linuxu"

Zdroj: hab.com

Pridať komentár