Dokiranje proljetne aplikacije za pokretanje

1. Pregled

U ovom ćemo se članku usredotočiti na dockerizaciju a Primjena za proljetno pokretanje da ga pokreće u izoliranom okruženju, a.k.a. kontejner.

Nadalje, pokazat ćemo kako stvoriti sastav spremnika, koji međusobno ovise i međusobno su povezani u virtualnoj privatnoj mreži. Također ćemo vidjeti kako se njima može upravljati zajedno s jednim naredbama.

Počnimo s izradom lagane osnovne slike s omogućenom Java, pokrenutom Alpine Linux.

2. Podrška za Buildpacks u proljetnom pokretanju 2.3

Spring Boot 2.3 dodana je podrška za buildpacks. Pojednostavljeno, umjesto da kreiramo vlastiti Dockerfile i napravimo ga pomoću nečega poput gradnja dockera, sve što moramo je izdati sljedeću naredbu:

$ ./mvnw spring-boot: build-image

Ili u Gradlima:

$ ./gradlew bootBuildImage

Glavna motivacija iza buildpack-a je stvoriti isto iskustvo implementacije koje neko vrijeme pružaju neke poznate usluge u oblaku poput Heroku ili Cloud Foundry. Upravo vodimo graditi-sliku Cilj i sama platforma brine se za izgradnju i raspoređivanje artefakta.

Štoviše, može nam pomoći da učinkovitije promijenimo način na koji gradimo Dockerove slike. Umjesto da primijenimo istu promjenu na puno Dockerfilova u različitim projektima, sve što moramo učiniti je promijeniti ili podesiti graditelj slika buildpacksa.

Osim jednostavnosti upotrebe i boljeg ukupnog iskustva programera, može biti i učinkovitiji. Na primjer, pristup buildpacks će stvoriti slojevitu Dockerovu sliku i koristi eksplodiranu verziju Jar datoteke.

3. Uobičajena osnovna slika

Koristit ćemo Dockerov vlastiti format datoteke gradnje: a Dockerfile.

A Dockerfile u principu je linijska batch datoteka koja sadrži naredbe za izgradnju slike. Nije nužno ove naredbe staviti u datoteku, jer ih možemo proslijediti i u naredbeni redak - datoteka je jednostavno prikladnija.

Pa, napišimo prvo Dockerfile:

FROM alpine: edge MAINTAINER baeldung.com RUN apk add --no-cache openjdk8 COPY files / UnlimitedJCEPolicyJDK8 / * \ /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
  • IZ: Ključna riječ IZ, govori Lučki radnik koristiti danu sliku s njezinom oznakom kao build-base. Ako ove slike nema u lokalnoj knjižnici, uključite mrežno pretraživanje DockerHubili na bilo kojem drugom konfiguriranom udaljenom registru
  • ODRŽAVAČ: A ODRŽAVAČ obično je adresa e-pošte koja identificira autora slike
  • TRČANJE: Uz TRČANJE naredbu, izvršavamo naredbenu liniju ljuske unutar ciljnog sustava. Ovdje koristimo Alpine Linux upravitelj paketa apk instalirati Java 8 OpenJDK
  • KOPIRATI: Posljednja naredba govori Lučki radnik do KOPIRATI nekoliko datoteka iz lokalnog datotečnog sustava, posebno podmapu u direktorij gradnje, na sliku u zadanom putu

ZAHTJEVI: Da biste uspješno pokrenuli vodič, morate preuzeti Datoteke s politikom nadležnosti za neograničenu snagu Java Cryptography Extension (JCE) iz Oracle. Jednostavno izvucite preuzetu arhivu u lokalnu mapu pod nazivom ‘Datoteke’.

Da bismo konačno izgradili sliku i pohranili je u lokalnu knjižnicu, moramo pokrenuti:

gradnja dockera --tag = alpine-java: baza --rm = tačno.

OBAVIJEST: The -označiti opcija će dati slici ime i –Rm = točno uklonit će srednje slike nakon što je uspješno izgrađena. Posljednji znak u ovoj naredbi ljuske je točka koja djeluje kao argument direktorija gradnje.

4. Dockerizirajte samostalnu aplikaciju za proljetno pokretanje

Kao primjer za aplikaciju koju možemo dockerizirati, uzet ćemo spring-cloud-config / poslužitelj iz vodiča za konfiguraciju proljetnog oblaka. Kao korak pripreme, moramo sastaviti jar datoteku koja se može pokrenuti i kopirati je u našu Lučki radnik build-direktorij:

vodiči $> cd spring-cloud-config / server server $> mvn paket spring-boot: prepakiranje poslužitelja $> cp target / server-0.0.1-SNAPSHOT.jar \ ../../spring-boot-docker/files /config-server.jar poslužitelj $> cd ../../spring-boot-docker

Sada ćemo stvoriti Dockerfile imenovan Dockerfile.server sa sljedećim sadržajem:

IZ alpine-jave: baza MAINTAINER baeldung.com KOPIRANJE datoteka / spring-cloud-config-server.jar / opt / spring-cloud / lib / COPY datoteke / spring-cloud-config-server-entrypoint.sh / opt / spring- cloud / bin / ENV SPRING_APPLICATION_JSON = \ '{"spring": {"cloud": {"config": {"server": \ {"git": {"uri": "/ var / lib / spring-cloud / config-repo ", \" clone-on-start ": true}}}}}} 'ENTRYPOINT [" / usr / bin / java "] CMD [" -jar "," / opt / spring-cloud / lib / spring-cloud-config-server.jar "] VOLUMEN / var / lib / spring-cloud / config-repo EXPOSE 8888
  • IZ: Kao osnovu za našu sliku uzet ćemo Java-omogućeno Alpine Linux, stvoren u prethodnom odjeljku
  • KOPIRATI: Dopustili smo Lučki radnik kopirajte našu jar datoteku na sliku
  • ENV: Ova nam naredba omogućuje definiranje nekih varijabli okruženja, koje će aplikacija koja se izvodi u spremniku poštivati. Ovdje definiramo prilagođeno Primjena za proljetno pokretanje konfiguracije, da bi se kasnije predao izvršnoj datoteci jar
  • ULAZNA TOČKA/CMD: Ovo će biti izvršna datoteka koja će se pokrenuti kad se spremnik podiže. Moramo ih definirati kao JSON-Array, jer ćemo koristiti ULAZNA TOČKA u kombinaciji s a CMD za neke argumente aplikacije
  • VOLUMEN: Budući da će se naš spremnik izvoditi u izoliranom okruženju, bez izravnog mrežnog pristupa, moramo definirati mountpoint-placeholder za naše spremište konfiguracije
  • IZLOŽITI: Evo mi kažemo Lučki radnik, na kojoj je luci navedena naša aplikacija. Ovaj će se port objaviti hostu kada se spremnik pokrene

Stvoriti sliku iz našeg Dockerfile, moramo bježati 'Gradnja dockera', kao prije:

$> docker build --file = Dockerfile.server \ --tag = config-server: najnovije --rm = true.

Ali prije nego što pokrenemo spremnik sa naše slike, moramo stvoriti volumen za montiranje:

$> volumen dockera create --name = spring-cloud-config-repo

OBAVIJEST: Dok je spremnik nepromjenjiv, kad nije posvećen slici nakon izlaska aplikacije, podaci pohranjeni u volumenu bit će postojani u nekoliko spremnika.

Napokon, spremnik možemo pokrenuti iz naše slike:

$> pokretanje dockera --name = config-server --publish = 8888: 8888 \ --volume = spring-cloud-config-repo: / var / lib / spring-cloud / config-repo \ config-server: najnovije
  • Prvo, moramo -Ime naš kontejner. Ako nije, automatski će se odabrati
  • Onda, moramo -objaviti naša izložena luka (vidi Dockerfile) do luke na našem domaćinu. Vrijednost je dana u obliku 'Host-port: container-port'. Ako je naveden samo port kontejnera, koristit će se nasumično odabrani port hosta. Ako izostavimo ovu opciju, spremnik će biti potpuno izoliran
  • The -volumen opcija daje pristup bilo direktoriju na hostu (kada se koristi s apsolutnom stazom) ili prethodno stvorenom Lučki radnik glasnoća (kada se koristi s a svezak-naziv). Put nakon dvotačke navodi točka montiranja unutar spremnika
  • Kao argument moramo reći Lučki radnik, koju sliku koristiti. Ovdje moramo dati ime-slike iz prethodnogradnja dockera' korak
  • Još korisnih opcija:
    • -to - omogućiti interaktivni način i dodijeliti a pseudo-tty
    • -d - odvojite se od spremnika nakon dizanja

Ako spremnik pokrenemo u odvojenom načinu, možemo pregledati njegove detalje, zaustaviti ga i ukloniti sljedećim naredbama:

$> docker pregledati config-server $> docker stop config-server $> docker rm config-server

5. Dockerizirajte ovisne aplikacije u kompozitu

Lučki radnik naredbe i Dockerfiles posebno su prikladni za stvaranje pojedinačnih spremnika. Ali ako želite rade na mreži izoliranih aplikacija, upravljanje spremnikom brzo postaje pretrpano.

Da bih to riješio, Lučki radnik pruža alat nazvan Docker Compose. Ovo dolazi s vlastitom datotekom za izgradnju u YAML formatu i prikladniji je za upravljanje više spremnika. Na primjer, može pokrenuti ili zaustaviti kompozit usluga u jednoj naredbi ili spajati izlazni zapis višestrukih usluga zajedno u jednu pseudo-tty.

Izgradimo primjer dviju aplikacija koje se izvode u različitim Docker spremnicima. Oni će međusobno komunicirati i biti predstavljeni kao „jedinstvena jedinica“ glavnom sustavu. Izradit ćemo i kopirati spring-cloud-config / client primjer opisan u vodiču za konfiguraciju proljetnog oblaka za naš datoteke mapu, kao što smo i prije radili s config-poslužitelj.

Ovo će biti naše docker-compose.yml:

verzija: '2' usluge: config-server: ime_kontejnera: config-server build: context:. dockerfile: Dockerfile.server slika: config-server: najnovije izlaganje: - 8888 mreža: - volume-spring-cloud-network: - spring-cloud-config-repo: / var / lib / spring-cloud / config-repo prijava: upravljački program : json-datoteka config-client: ime_kontejnera: config-client build: context:. dockerfile: Dockerfile.client image: config-client: najnovija ulazna točka: /opt/spring-cloud/bin/config-client-entrypoint.sh okruženje: SPRING_APPLICATION_JSON: \ '{"spring": {"cloud": \ {"config ": {" uri ":" // config-server: 8888 "}}}} 'izloži: - 8080 portova: - 8080: 8080 mreža: - proljeće-oblak-mrežne veze: - config-server: config-server zavisi_on : - zapisivanje konfiguracijskog poslužitelja: upravljački program: mreže json-datoteka: mreža proljeća-oblaka: upravljački program: volumen mosta: proljeće-oblak-konfiguracija-repo: vanjski: istinito
  • verzija: Navodi verziju formata koju treba koristiti. Ovo je obavezno polje. Ovdje koristimo noviju verziju, dok naslijeđeni format je "1"
  • usluge: Svaki objekt u ovom ključu definira a servis, a.k.a kontejner. Ovaj je odjeljak obvezan
    • izgraditi: Ako je dato, docker-compose je u stanju izgraditi sliku iz a Dockerfile
      • kontekst: Ako je zadano, on navodi direktorij gradnje, gdje je Dockerfile se traži
      • dockerfile: Ako je dato, postavlja zamjensko ime za Dockerfile
    • slika: Kaže Lučki radnik koje bi ime trebalo dati slici kada se koriste značajke gradnje. Inače, traži ovu sliku u knjižnici ili udaljeni registar
    • mrežama: Ovo je identifikator imenovanih mreža koje će se koristiti. Danosti ime-vrijednost mora biti naveden u mrežama odjeljak
    • svezaka: Ovo identificira imenovane volumene za korištenje i točke montiranja na koje se montiraju volumeni, odvojene dvotočkom. Isto tako u mrežama odjeljak, a svezak-naziv moraju se definirati odvojeno svezaka odjeljak
    • poveznice: Ovo će stvoriti internu mrežnu vezu između ovaj usluga i navedena usluga. Ovaj usluga moći će se povezati s navedenom uslugom, pri čemu dio prije dvotočke navodi a naziv usluge od usluge odjeljak i dio nakon dvotačke određuje ime hosta na kojem usluga sluša na izloženom portu
    • ovisi o: Ovo govori Lučki radnik za pokretanje usluge samo ako su navedene usluge uspješno započele. OBAVIJEST: Ovo radi samo na razini spremnika! Zaobilazno rješenje za pokretanje ovisnog primjena prvo, vidi config-client-entrypoint.sh
    • sječa drva: Ovdje koristimo 'Json-datoteka' upravljački program, koji je zadani. Alternativno 'Syslog' s danom opcijom adrese ili 'Ništa' može se koristiti
  • mrežama: U ovom odjeljku preciziramo mrežama dostupne našim uslugama. U ovom primjeru dopuštamo docker-compose stvoriti imenovani mreža tipa 'most' za nas. Ako je opcija vanjski postavljeno je na pravi, koristit će postojeću s danim imenom
  • svezaka: Ovo je vrlo slično mrežama odjeljak

Prije nego što nastavimo, provjerit ćemo u datoteci izrade sintaksnih pogrešaka:

$> docker-compose config

Ovo će biti naše Dockerfile.client za izgradnju config-client slika iz. Razlikuje se od Dockerfile.server u to dodatno instaliramo OpenBSD netcat (što je potrebno u sljedećem koraku) i napravite ulazna točka izvršna:

IZ alpine-jave: osnovni ODRŽAVAČ baeldung.com RUN apk --no-cache dodaj netcat-openbsd COPY datoteke / config-client.jar / opt / spring-cloud / lib / COPY files / config-client-entrypoint.sh / opt / spring-cloud / bin / RUN chmod 755 /opt/spring-cloud/bin/config-client-entrypoint.sh

I ovo će biti prilagođeno ulazna točka za naše usluga config-client. Ovdje koristimo netcat u petlji provjeriti je li naš config-poslužitelj je spremna. Morate primijetiti da možemo doći do svojih config-poslužitelj svojim ime veze, umjesto IP adrese:

#! / bin / sh dok! nc -z config-server 8888; učiniti odjek "Čekajući nadolazeći Config Server" sleep 2 done java -jar /opt/spring-cloud/lib/config-client.jar

Napokon, možemo izgraditi svoje slike, stvoriti definirane spremnike i pokrenuti je u jednoj naredbi:

$> docker-compose up --build

Da biste zaustavili spremnike, izvadite ga iz Lučki radnik i uklonite spojeni mrežama i svezaka od nje možemo koristiti suprotnu naredbu:

$> docker-compose down

Lijepa značajka docker-compose je sposobnost skaliranja usluga. Na primjer, možemo reći Lučki radnik pokrenuti jedan spremnik za config-poslužitelj i tri spremnika za config-client.

Ali da bi ovo ispravno funkcioniralo, moramo ukloniti ime_kontejnera od našeg docker-compose.yml, za iznajmljivanje Lučki radnik odaberite jedan, a mi moramo promijeniti izložena konfiguracija porta, kako bi se izbjegli sukobi.

Nakon toga smo u mogućnosti svoje usluge prilagoditi ovako:

$> docker-compose build $> docker-compose up -d $> docker-compose scale config-server = 1 config-client = 3

6. Zaključak

Kao što smo vidjeli, sada smo u mogućnosti izraditi običaj Lučki radnik slike, pokretanje a Primjena za proljetno pokretanje kao Lučki radnik spremnik i stvaranje ovisnih spremnika pomoću docker-compose.

Za daljnje čitanje o datotekama gradnje, pozivamo se na službene osobe Referenca Dockerfile i docker-compose.yml referenca.

Kao i obično, izvorni kodovi za ovaj vodič mogu se pronaći na Githubu.