Uvod u Docker Compose

1. Pregled

Kada se Docker intenzivno koristi, upravljanje nekoliko različitih spremnika brzo postaje glomazno.

Docker Compose alat je koji nam pomaže prevladati ovaj problem i lako rukovati s više spremnika odjednom.

U ovom ćemo uputstvu pogledati njegove glavne značajke i moćne mehanizme.

2. Objašnjena YAML konfiguracija

Ukratko, Docker Compose djeluje primjenjujući mnoga pravila deklarirana unutar pojedinac docker-compose.yml konfiguracijska datoteka.

Ova YAML pravila, i ljudski čitljiva i strojno optimizirana, pružaju nam učinkovit način da u nekoliko redaka snimimo cijeli projekt s deset tisuća stopa.

Gotovo svako pravilo zamjenjuje određenu Dockerovu naredbu tako da na kraju samo trebamo pokrenuti:

docker-sastaviti

Možemo dobiti na desetke konfiguracija koje je Compose primijenio ispod haube. Ovo će nam uštedjeti gnjavažu s skriptiranjem s Bashom ili nečim drugim.

U ovoj datoteci moramo navesti verzija formata datoteke Compose, barem jedan servis, i po želji svezaka i mrežama:

inačica: "3.7" usluge: ... količine: ... mreže: ... 

Pogledajmo što su zapravo ti elementi.

2.1. Usluge

Kao prvo, usluge pogledajte konfiguraciju spremnika.

Na primjer, uzmimo dockeriziranu web aplikaciju koja se sastoji od prednjeg, stražnjeg dijela i baze podataka: Te bismo komponente vjerojatno podijelili na tri slike i definirali kao tri različite usluge u konfiguraciji:

usluge: frontend: image: my-vue-app ... backend: image: my-springboot-app ... db: image: postgres ... 

Postoji više postavki koje možemo primijeniti na usluge, a kasnije ćemo ih duboko istražiti.

2.2. Sveske i mreže

Svezaka, s druge strane, su fizička područja prostora na disku koja se dijele između hosta i spremnika, ili čak između spremnika. Drugim riječima, volumen je dijeljeni direktorij u hostu, vidljivo iz nekih ili svih spremnika.

Slično tome, mrežama definirati pravila komunikacije između spremnika i između spremnika i hosta. Zajedničke mrežne zone učinit će da usluge kontejnera budu međusobno vidljive, dok će ih privatne zone razdvajati u virtualne pješčanike.

Opet ćemo o njima saznati više u sljedećem odjeljku.

3. Seciranje usluge

Počnimo sada pregledavati glavne postavke usluge.

3.1. Povlačenje slike

Ponekad je slika koja nam je potrebna za našu uslugu već objavljena (mi ili drugi) u Docker Hub-u ili nekom drugom Docker-ovom registru.

Ako je to slučaj, tada se na njega pozivamo s slika atribut, navodeći ime i oznaku slike:

usluge: moja usluga: slika: ubuntu: najnovije ... 

3.2. Izgradnja slike

Umjesto toga, možda ćemo trebati izgraditi sliku iz izvornog koda čitajući je Dockerfile.

Ovaj put koristit ćemo izgraditi , predajući put do Dockerfile kao vrijednost:

usluge: my-custom-app: build: / path / to / dockerfile / ... 

Umjesto puta možemo koristiti i URL:

usluge: my-custom-app: build: //github.com/my-company/my-project.git ... 

Uz to možemo odrediti i slika naziv u vezi s izgraditi atribut, koji će imenovati sliku jednom stvorenu, čineći je dostupnom za upotrebu drugim uslugama:

usluge: my-custom-app: build: //github.com/my-company/my-project.git image: my-project-image ... 

3.3. Konfiguriranje umrežavanja

Dockerovi spremnici međusobno komuniciraju u mrežama koje je, implicitno ili putem konfiguracije, kreirao Docker Compose. Usluga može komunicirati s drugom uslugom na istoj mreži jednostavnim pozivanjem na nju prema nazivu spremnika i priključku (na primjer mreža-primjer-usluga: 80), pod uvjetom da smo luku učinili dostupnom putem izložiti ključna riječ:

usluge: mreža-primjer-usluga: slika: karthequian / helloworld: najnovije izlaganje: - "80" 

U ovom slučaju, usput, to bi također funkcioniralo bez izlaganja, jer izložiti Direktiva je već na slici Dockerfile.

Da biste od domaćina došli do spremnika, luke moraju biti deklarativno izložene kroz luke ključna riječ, koji nam također omogućuje da odaberemo hoćemo li izložiti port drugačije na hostu:

usluge: network-example-service: image: karthequian / helloworld: najnoviji portovi: - "80:80" ... my-custom-app: image: myapp: najnoviji portovi: - "8080: 3000" ... my- custom-app-replica: image: myapp: najnoviji portovi: - "8081: 3000" ... 

Luka 80 sada će biti vidljiva od hosta, dok će port 3000 od druga dva spremnika biti dostupan na vratima 8080 i 8081 u hostu. Ovaj snažni mehanizam omogućuje nam pokretanje različitih spremnika koji izlažu iste priključke bez sudara.

Napokon, možemo definirati dodatne virtualne mreže za odvajanje naših spremnika:

usluge: mreža-primjer-usluga: slika: karthequian / helloworld: najnovije mreže: - moja-zajednička-mreža ... druga-usluga-u-istoj-mreži: slika: alpine: najnovije mreže: - moja-podijeljena- mreža ... druga-u-svojoj-mreži: slika: alpine: najnovije mreže: - moja-privatna-mreža ... mreže: moja-zajednička-mreža: {} moja-privatna-mreža: {} 

U ovom posljednjem primjeru to možemo vidjeti druga usluga u istoj mreži moći će pingati i doći do luke 80 od mreža-primjer-usluga, dok druga usluga u vlastitoj mreži navika.

3.4. Postavljanje svezaka

Postoje tri vrste svezaka: anonimni, imenovan, i domaćin one.

Docker upravlja anonimnim i imenovanim volumenima, automatski ih montirajući u vlastito generirane direktorije u hostu. Iako su anonimni volumeni bili korisni sa starijim verzijama Dockera (pre 1.9), danas su predloženi imenovani. Volumeni hosta također nam omogućuju da odredimo postojeću mapu u hostu.

Volumene hosta možemo konfigurirati na razini usluge i imenovane volumene na vanjskoj razini konfiguracije, kako bi potonji bili vidljivi drugim spremnicima, a ne samo onom kojem pripadaju:

usluge: volume-example-service: image: alpine: najnoviji volumeni: - my-named-global-volume: / my-volumes / named-global-volume - / tmp: / my-volumes / host-volume - / home: / my-volumes / readonly-host-volume: ro ... another-volume-example-service: image: alpine: najnoviji svezak: - my-named-global-volume: / another-path / the-same-named- global-volume ... svezaka: my-named-global-volume: 

Ovdje će oba spremnika imati pristup za čitanje / pisanje na moj-imenovani-globalni-svezak zajedničku mapu, bez obzira na različite putove na koje su je mapirali. Dva sveska hosta, umjesto toga, bit će dostupna samo svezaka-primjer-usluga.

The / tmp mapa datotečnog sustava hosta preslikava se u / my-volume / host-volume mapa spremnika.

Ovaj dio datotečnog sustava može se zapisati, što znači da spremnik ne može samo čitati, već i pisati (i brisati) datoteke u računalu domaćina.

Glasnoću možemo dodati u način samo za čitanje dodavanjem : ro pravilu, kao za /Dom mapu (ne želimo da Docker spremnik greškom briše naše korisnike).

3.5. Proglašavanje ovisnosti

Često moramo stvoriti lanac ovisnosti između naših usluga, tako da se neke usluge učitavaju prije (i iskrcavaju nakon) drugih. Ovaj rezultat možemo postići kroz ovisi o ključna riječ:

usluge: kafka: slika: wurstmeister / kafka: 2.11-0.11.0.3 ovisi_on: - čuvar zoološkog vrta ... čuvar zoološkog vrta: slika: wurstmeister / čuvar zoološkog vrta ... 

Međutim, trebali bismo biti svjesni da Compose neće čekati čuvar zoo vrta uslugu dovršiti učitavanje prije pokretanja kafka usluga: jednostavno će pričekati da započne. Ako nam je potrebna usluga da se u potpunosti učita prije pokretanja druge usluge, moramo dublje kontrolirati redoslijed pokretanja i isključivanja u Compose.

4. Upravljanje varijablama okoline

U Composeu je lako raditi s varijablama okoline. Možemo definirati statičke varijable okruženja, a također i dinamičke varijable pomoću ${} notacija:

usluge: baza podataka: slika: "postgres: $ {POSTGRES_VERSION}" okruženje: DB: mydb KORISNIK: "$ {USER}" 

Postoje različite metode za pružanje tih vrijednosti za sastavljanje.

Na primjer, jedan ih postavlja u a .env datoteku u istom direktoriju, strukturiranu poput .Svojstva datoteka, ključ = vrijednost:

POSTGRES_VERSION = alpski USER = foo

Inače ih možemo postaviti u OS prije pozivanja naredbe:

izvoz POSTGRES_VERSION = alpski izvoz KORISNIK = foo docker-compose up 

Konačno, mogli bismo vam dobro doći koristeći jednostavnu jednostruku oblogu u ljusci:

POSTGRES_VERSION = alpski USER = foo docker-compose up 

Pristupe možemo kombinirati, ali imajmo na umu da Compose koristi sljedeći redoslijed prioriteta, prepisujući manje važno s višim:

  1. Sastavi datoteku
  2. Varijable okruženja ljuske
  3. Datoteka o okolišu
  4. Dockerfile
  5. Varijabla nije definirana

5. Skaliranje i replike

U starijim verzijama Compose dopušteno nam je skalirati instance spremnika kroz skala docker-compose naredba. Novije verzije su ga zastarile i zamijenile s ljestvica opcija.

S druge strane, možemo iskoristiti Docker Swarm - skup Docker motora - i automatski skalirati naše spremnike deklarativno kroz replike atribut rasporediti odjeljak:

usluge: worker: image: dockersamples / examplevotingapp_worker network: - frontend - backend deploy: mode: replicirane replike: 6 resursa: ograničenja: cpus: '0.50' memorija: 50M rezervacije: cpus: '0.25' memory: 20M ... 

Pod, ispod rasporediti, možemo odrediti i mnoge druge opcije, poput pragova resursa. Sastavi, međutim, razmatra cjelinu rasporediti odjeljak samo kada se raspoređuje u Swarm, a inače ga ignorira.

6. Primjer iz stvarnog svijeta: proljetni protok podataka u oblaku

Iako nam mali eksperimenti pomažu u razumijevanju pojedinih stupnjeva prijenosa, gledanje stvarnog koda na djelu definitivno će otkriti veliku sliku.

Spring Cloud Data Flow složen je projekt, ali dovoljno jednostavan da bude razumljiv. Preuzmimo njegovu YAML datoteku i pokrenimo:

DATAFLOW_VERSION = 2.1.0.OPUSTITE SKIPPER_VERSION = 2.0.2.RELEASE docker-sastavi 

Nova poruka će preuzeti, konfigurirati i pokrenuti svaku komponentu, a zatim presijecati zapisnike spremnika u jedan tok na trenutnom terminalu.

Također će primijeniti jedinstvene boje na svaku od njih za izvrsno korisničko iskustvo:

Mogli bismo dobiti sljedeću pogrešku prilikom pokretanja potpuno nove instalacije Docker Compose:

lookup registry-1.docker.io: nema takvog hosta

Iako postoje različita rješenja za ovu uobičajenu zamku, koristeći 8.8.8.8 jer je DNS vjerojatno najjednostavniji.

7. Upravljanje životnim ciklusom

Pogledajmo napokon pobliže sintaksu Docker Compose:

docker-compose [-f ...] [opcije] [ZAPOVIJED] [ARGS ...] 

Iako je dostupno mnogo opcija i naredbi, trebamo barem znati one za pravilno aktiviranje i deaktiviranje cijelog sustava.

7.1. Pokretanje

Vidjeli smo da možemo stvoriti i pokrenuti spremnike, mreže i volumene definirane u konfiguraciji s gore:

docker-sastaviti

Međutim, nakon prvog puta možemo jednostavno koristiti početak za pokretanje usluga:

docker-compose start

U slučaju da naša datoteka ima drugačije ime od zadanog (docker-compose.yml), možemo iskoristiti -f i datoteka zastavice za specificiranje zamjenskog naziva datoteke:

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

Nova poruka može se izvoditi i u pozadini kao demon kada se pokreće s -d opcija:

docker-compose up -d

7.2. Ugasiti

Možemo koristiti za sigurno zaustavljanje aktivnih usluga Stop, koji će sačuvati spremnike, količine i mreže, zajedno sa svakom njihovom izmjenom:

docker-compose stop

Umjesto toga, da bismo resetirali status našeg projekta, jednostavno pokrećemo dolje, koji će uništiti sve samo uz iznimku vanjskih volumena:

docker-komponirati dolje

8. Zaključak

U ovom uputstvu naučili smo o Docker Compose i kako to radi.

Kao i obično, možemo pronaći izvor docker-compose.yml datoteku na GitHubu, zajedno s korisnom baterijom testova koja je odmah dostupna na sljedećoj slici: