Úvod do Docker Compose

1. Prehľad

Pri rozsiahlom používaní Dockeru sa správa niekoľkých rôznych kontajnerov rýchlo stáva ťažkopádnou.

Docker Compose je nástroj, ktorý nám pomáha prekonať tento problém a ľahko manipulujte s viacerými kontajnermi naraz.

V tomto výučbe sa pozrieme na jeho hlavné funkcie a výkonné mechanizmy.

2. Vysvetlenie konfigurácie YAML

Stručne povedané, Docker Compose funguje pomocou mnohých pravidiel deklarovaných v rámci slobodný docker-compose.yml konfiguračný súbor.

Tieto pravidlá YAML, čitateľné človekom aj optimalizované pre stroj, nám poskytujú efektívny spôsob, ako zachytiť celý projekt z desaťtisíc stôp v niekoľkých riadkoch.

Takmer každé pravidlo nahrádza konkrétny príkaz Dockeru, takže nakoniec stačí spustiť:

ukotviť-zložiť

Pod kapotou môžeme získať desiatky konfigurácií, ktoré aplikuje Compose. To nám ušetrí námahu s ich skriptovaním pomocou Bash alebo iného.

V tomto súbore musíme určiť verzia formátu súboru Compose, aspoň jeden službya voliteľne objemy a sietí:

verzia: „3.7“ služby: ... zväzky: ... siete: ... 

Pozrime sa, čo tieto prvky vlastne sú.

2.1. Služby

Po prvé, služby pozri konfiguráciu kontajnerov.

Napríklad, poďme vziať dockerizovanú webovú aplikáciu pozostávajúcu z klientskeho rozhrania, zadného konca a databázy: Tieto komponenty by sme pravdepodobne rozdelili na tri obrázky a v konfigurácii by sme ich definovali ako tri rôzne služby:

služby: frontend: image: my-vue-app ... backend: image: my-springboot-app ... db: image: postgres ... 

Existuje niekoľko nastavení, ktoré môžeme použiť na služby, a neskôr ich hlbšie preskúmame.

2.2. Zväzky a siete

Zväzkyna druhej strane sú fyzické oblasti diskového priestoru zdieľané medzi hostiteľom a kontajnerom alebo dokonca medzi kontajnermi. Inými slovami, zväzok je zdieľaný adresár v hostiteľovi, viditeľné z niektorých alebo všetkých nádob.

Podobne sietí definovať pravidlá komunikácie medzi kontajnermi a medzi kontajnerom a hostiteľom. Vďaka spoločným sieťovým zónam budú služby kontajnerov navzájom viditeľné, zatiaľ čo súkromné ​​zóny ich budú oddeľovať vo virtuálnych karanténach.

Opäť sa o nich dozvieme viac v nasledujúcej časti.

3. Diskutovanie o službe

Teraz začnime kontrolovať hlavné nastavenia služby.

3.1. Vytiahnutie obrázka

Obrázok, ktorý potrebujeme pre svoju službu, bol niekedy zverejnený (nami alebo inými) v Docker Hub alebo inom registri Docker.

Ak je to tak, odkazujeme na to pomocou obrázok atribút zadaním názvu a značky obrázka:

služby: moja-služba: obrázok: ubuntu: najnovšie ... 

3.2. Budovanie obrazu

Namiesto toho možno budeme musieť vytvoriť obrázok zo zdrojového kódu prečítaním jeho kódu Dockerfile.

Tentokrát použijeme stavať kľúčové slovo, odovzdanie cesty k súboru Docker ako hodnota:

služby: moja-custom-app: build: / cesta / k / dockerfile / ... 

Namiesto cesty môžeme použiť aj adresu URL:

služby: moja-custom-app: build: //github.com/my-company/my-project.git ... 

Ďalej môžeme určiť obrázok názov v spojení s stavať atribút, ktorý po vytvorení pomenuje obrázok a sprístupní ho na použitie inými službami:

služby: moja-custom-app: build: //github.com/my-company/my-project.git image: my-project-image ... 

3.3. Konfigurácia siete

Kontajnery Docker medzi sebou komunikujú v sieťach vytvorených implicitne alebo prostredníctvom konfigurácie pomocou Docker Compose. Služba môže komunikovať s inou službou v tej istej sieti jednoduchým odkazom na ňu podľa názvu kontajnera a portu (napríklad služba príkladu siete: 80), za predpokladu, že sme port sprístupnili cez vystaviť kľúčové slovo:

služby: príklad siete: služba: obrázok: karthequian / helloworld: posledná expozícia: - „80“ 

V tomto prípade, mimochodom, by to fungovalo aj bez odhalenia, pretože vystaviť smernica je už v obraze Dockerfile.

Ak chcete dosiahnuť kontajner od hostiteľa, porty musia byť vystavené deklaratívne cez internet prístavy kľúčové slovo, čo nám tiež umožňuje zvoliť si, či je port v hostiteľovi vystavený inak:

služby: príklad siete: služba: obrázok: karthequian / helloworld: najnovšie porty: - „80:80“ ... moja vlastná aplikácia: obrázok: myapp: najnovšie porty: - „8080: 3000“ ... moje- custom-app-replica: image: myapp: latest ports: - "8081: 3000" ... 

Port 80 bude teraz viditeľný z hostiteľa, zatiaľ čo port 3000 ďalších dvoch kontajnerov bude k dispozícii na portoch 8080 a 8081 v hostiteľovi. Tento výkonný mechanizmus nám umožňuje prevádzkovať rôzne kontajnery vystavujúce rovnaké porty bez kolízií.

Na záver môžeme definovať ďalšie virtuálne siete na oddelenie našich kontajnerov:

služby: príklad siete: služba: obrázok: karthequian / helloworld: najnovšie siete: - moja zdieľaná sieť ... iná služba v tej istej sieti: obrázok: alpská: najnovšie siete: - moja zdieľaná- sieť ... iná služba vo svojej vlastnej sieti: obrázok: alpská: najnovšie siete: - moja-súkromná-sieť ... siete: moja-zdieľaná-sieť: {} moja-súkromná-sieť: {} 

Na tomto poslednom príklade to vidíme iná služba v tej istej sieti bude môcť pingovať a dosiahnuť port 80 z služba príkladu siete, zatiaľ čo iná služba vo svojej vlastnej sieti nebude.

3.4. Nastavenie zväzkov

Existujú tri typy zväzkov: anonymný, menovanýa hostiteľ tie.

Docker spravuje anonymné aj pomenované zväzky, ktoré sa automaticky montujú do samostatne generovaných adresárov v hostiteľovi. Zatiaľ čo anonymné zväzky boli užitočné pre staršie verzie Dockeru (pre 1.9), pomenované sú v dnešnej dobe navrhovaným spôsobom. Zväzky hostiteľa nám tiež umožňujú určiť existujúci priečinok v hostiteľovi.

Môžeme nakonfigurovať hostiteľské zväzky na úrovni služieb a pomenované zväzky na vonkajšej úrovni konfigurácie, aby sme ich zviditeľnili pre ďalšie kontajnery a nielen pre ten, ku ktorému patria:

služby: zväzky-príklad-služba: obrázok: alpský: najnovšie zväzky: - môj-pomenovaný-globálny-zväzok: / moje-zväzky / pomenovaný-globálny-zväzok - / tmp: / moje-zväzky / hostiteľský zväzok - / domov: / my-volumes / readonly-host-volume: ro ... another-volumes-example-service: image: alpine: latest volumes: - my-named-global-volume: / another-path / the-same-named- global-volume ... volumes: my-named-global-volume: 

Tu budú mať oba kontajnery prístup na čítanie a zápis do priečinka my-named-global-volume zdieľaný priečinok, bez ohľadu na to, na aké rôzne cesty ho mapovali. Dva hostiteľské zväzky budú k dispozícii iba pre objem-priklad-sluzba.

The / tmp priečinok súborového systému hostiteľa je namapovaný na / moje-objemy / host-zväzok priečinok kontajnera.

Do tejto časti súborového systému je možné zapisovať, čo znamená, že kontajner môže v hostiteľskom počítači nielen čítať, ale aj zapisovať (a mazať) súbory.

Zväzok môžeme pripojiť v režime iba na čítanie pripojením : ro pravidlu, ako pre /Domov priečinok (nechceme, aby kontajner Docker vymazal našich používateľov omylom).

3.5. Deklarovanie závislostí

Často musíme vytvoriť reťazec závislostí medzi našimi službami, aby sa niektoré služby načítali pred (a uvoľnili sa) po iných službách. Tento výsledok môžeme dosiahnuť prostredníctvom záleží na kľúčové slovo:

služby: kafka: obrázok: wurstmeister / kafka: 2.11-0.11.0.3 záleží_na: - zookeeper ... zookeeper: obrázok: wurstmeister / zookeeper ... 

Mali by sme si však byť vedomí, že Compose nebude čakať na ošetrovateľ v zoo služba dokončí načítanie pred spustením kafka služba: jednoducho počká, kým sa spustí. Ak potrebujeme, aby bola služba úplne načítaná pred spustením inej služby, musíme v Compose získať hlbšiu kontrolu nad poradím spustenia a vypnutia.

4. Správa premenných prostredia

Práca s premennými prostredia je v Compose ľahká. Môžeme definovať premenné statického prostredia a tiež definovať dynamické premenné pomocou ${} notácia:

služby: databáza: obrázok: "postgres: $ {POSTGRES_VERSION}" prostredie: DB: mydb USER: "$ {USER}" 

Existujú rôzne metódy na poskytnutie týchto hodnôt pre Compose.

Napríklad je ich nastavenie do a .env súbor v rovnakom adresári, štruktúrovaný ako a .vlastnosti pilník, kľúč = hodnota:

POSTGRES_VERSION = vysokohorský USER = foo

Inak ich môžeme nastaviť v OS pred vyvolaním príkazu:

export POSTGRES_VERSION = alpský export USER = foo docker-compose up 

Nakoniec by nám mohlo prísť vhod použiť jednoduchú jednoradovú vložku do shellu:

POSTGRES_VERSION = vysokohorský používateľ = foo docker-compose up 

Prístupy môžeme kombinovať, ale nezabúdajme, že program Compose používa nasledujúce poradie priorít, čím prepíše menej dôležité s vyššími:

  1. Zostavte súbor
  2. Premenné prostredia shellu
  3. Súbor životného prostredia
  4. Dockerfile
  5. Premenná nie je definovaná

5. Mierka a repliky

V starších verziách aplikácie Compose sme mali povolené škálovať inštancie kontajnera cez docker-compose scale príkaz. Novšie verzie ju zastarali a nahradili ju mierka možnosť.

Na druhej strane môžeme zneužiť Docker Swarm - zhluk Docker Engines - a autoskálovať naše kontajnery deklaratívne cez repliky atribút nasadiť časť:

služby: pracovník: obraz: dockersamples / examplevotingapp_worker siete: - frontend - backend nasadenie: režim: replikované repliky: 6 zdrojov: limity: cpus: '0,50' pamäť: 50M rezervácie: cpus: '0,25' pamäť: 20M ... 

Pod nasadiť, môžeme určiť aj mnoho ďalších možností, napríklad limity zdrojov. Zostavte však považuje za celok nasadiť oddiel iba pri nasadení na Roj, a inak to ignoruje.

6. Príklad zo skutočného sveta: Tok dát jarného cloudu

Aj keď malé experimenty nám pomáhajú porozumieť jednotlivým rýchlostným stupňom, videnie skutočného kódu v praxi určite odhalí celkový obraz.

Tok dát Spring Cloud je zložitý projekt, ale dosť jednoduchý na to, aby bol zrozumiteľný. Stiahnime si jeho súbor YAML a spustime:

DATAFLOW_VERSION = 2.1.0.RELEASE SKIPPER_VERSION = 2.0.2.RELEASE docker-compose up 

Aplikácia Compose stiahne, nakonfiguruje a spustí všetky komponenty a potom pretínajú protokoly kontajnera do jedného toku v aktuálnom termináli.

Aplikuje tiež jedinečné farby na každú z nich, aby poskytoval skvelý používateľský zážitok:

Pri spustení úplne novej inštalácie Docker Compose sa môže zobraziť nasledujúca chyba:

vyhľadávací register-1.docker.io: žiadny taký hostiteľ

Aj keď existujú rôzne riešenia tohto spoločného úskalia, použitie 8.8.8.8 kedze DNS je asi najjednoduchsi.

7. Správa životného cyklu

Poďme sa konečne bližšie pozrieť na syntax Docker Compose:

docker-compose [-f ...] [možnosti] [COMMAND] [ARGS ...] 

Aj keď je k dispozícii veľa možností a príkazov, potrebujeme aspoň poznať tie, ktoré správne aktivujú a deaktivujú celý systém.

7.1. Začiatok

Videli sme, že môžeme vytvárať a spúšťať kontajnery, siete a zväzky definované v konfigurácii pomocou hore:

ukotviť-zložiť

Po prvýkrát však môžeme jednoducho použiť začať na spustenie služieb:

docker-compose start

V prípade, že má náš súbor iný názov ako predvolený (docker-compose.yml), môžeme využiť -f a spis príznaky na určenie alternatívneho názvu súboru:

docker-compose -f custom-compose-file.yml start

Keď je program Compose spustený pomocou programu, môže tiež bežať na pozadí ako démon -d možnosť:

ukotviť-zložiť hore -d

7.2. Vypnúť

Na bezpečné zastavenie aktívnych služieb môžeme použiť zastav, ktorá zachová kontajnery, zväzky a siete spolu so všetkými zmenami, ktoré sa v nich vykonajú:

docker-compose stop

Namiesto toho jednoducho resetujeme stav nášho projektu dole, ktorý zničí všetko iba s výnimkou externých zväzkov:

ukotviť-zložiť

8. Záver

V tomto tutoriáli sme sa dozvedeli o Docker Compose a o tom, ako to funguje.

Ako obvykle, môžeme nájsť zdroj docker-compose.yml súbor na GitHub spolu s užitočnou batériou testov, ktoré sú okamžite k dispozícii na nasledujúcom obrázku:


$config[zx-auto] not found$config[zx-overlay] not found