Ukotvenie aplikácie Spring Boot

1. Prehľad

V tomto článku sa zameriame na to, ako ukotviť a Aplikácia Spring Boot spustiť ho v izolovanom prostredí, a.k.a. kontajner.

Ďalej si ukážeme, ako vytvoriť zloženie kontajnerov, ktoré závisia jeden od druhého a sú navzájom spojené vo virtuálnej súkromnej sieti. Uvidíme tiež, ako sa dajú spravovať spolu s jednotlivými príkazmi.

Začnime tým, že vytvoríme ľahký základný obraz s podporou Java, ktorý bude bežať Alpine Linux.

2. Podpora Buildpacks v Spring Boot 2.3

Spring Boot 2.3 pridal podporu pre buildpacky. Zjednodušene povedané, namiesto vytvárania vlastného súboru Docker a jeho zostavovania pomocou niečoho podobného docker build, musíme iba vydať nasledujúci príkaz:

$ ./mvnw spring-boot: build-image

Alebo v Gradle:

$ ./gradlew bootBuildImage

Hlavnou motiváciou buildpackov je vytvorenie rovnakého zážitku z nasadenia, aký na chvíľu poskytujú niektoré známe cloudové služby ako Heroku alebo Cloud Foundry.. Práve sme spustili build-image cieľ a samotná platforma sa stará o stavbu a nasadenie artefaktu.

Okrem toho nám môže pomôcť zmeniť spôsob, akým efektívnejšie vytvárame obrázky Dockeru. Namiesto použitia rovnakej zmeny na veľa súborov Dockerfiles v rôznych projektoch, všetko, čo musíme urobiť, je zmeniť alebo vyladiť vytvárač obrázkov buildpacks.

Okrem ľahkého použitia a lepšej celkovej skúsenosti vývojárov môže byť aj efektívnejšia. Napríklad prístup buildpacks vytvorí vrstvený obraz Dockeru a použije rozloženú verziu súboru Jar.

3. Spoločný základný obrázok

Budeme používať Docker vlastný formát zostaveného súboru: a Dockerfile.

A Dockerfile je v zásade dávkový súbor po riadkoch, obsahujúci príkazy na vytvorenie obrázka. Nie je absolútne nevyhnutné vkladať tieto príkazy do súboru, pretože ich môžeme odovzdať aj do príkazového riadku - súbor je jednoducho pohodlnejší.

Poďme teda napísať prvý Dockerfile:

FROM alpine: edge MAINTAINER baeldung.com RUN apk add --no-cache openjdk8 COPY súbory / UnlimitedJCEPolicyJDK8 / * \ /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
  • ZO: Kľúčové slovo ZO, povie Docker použiť daný obrázok so značkou ako základňu. Ak sa tento obrázok nenachádza v miestnej knižnici, vyhľadajte online DockerHubalebo na akomkoľvek inom nakonfigurovanom vzdialenom registri
  • MAINTAINER: A MAINTAINER je zvyčajne e-mailová adresa identifikujúca autora obrázka
  • BEH: S BEH príkaz, vykonáme príkazový riadok shellu v cieľovom systéme. Tu využívame Systém Alpine Linux správca balíkov apk nainštalovať Java 8 OpenJDK
  • KÓPIA: Hovorí posledný príkaz Docker do KÓPIA niekoľko súborov z lokálneho súborového systému, konkrétne podpriečinok do adresára zostavenia, do obrázka v danej ceste

POŽIADAVKY: Ak chcete výukový program úspešne spustiť, musíte si stiahnuť Java Cryptography Extension (JCE) Súbory s politikou neobmedzenej sily od Oracle. Stiahnutý archív jednoducho rozbaľte do lokálneho priečinka s názvom „Súbory“.

Aby sme konečne vytvorili obraz a uložili ho do miestnej knižnice, musíme spustiť:

docker build --tag = alpine-java: base --rm = true.

UPOZORNENIE: The –Tag Táto možnosť dá obrázku názov a –Rm = pravda po úspešnom vytvorení odstráni prechodné obrázky. Posledným znakom v tomto príkaze shellu je bodka, ktorá slúži ako argument zostavenia adresára.

4. Dockerizujte samostatnú aplikáciu Spring Boot

Ako príklad aplikácie, ktorú môžeme ukotviť, si vezmeme spring-cloud-config / server z výučby konfigurácie cloudu na jar. Ako prípravný krok musíme zhromaždiť spustiteľný súbor jar a skopírovať ho do nášho Docker build-adresár:

tutoriály $> server cd spring-cloud-config / server $> balíček mvn spring-boot: prebaliť server $> cp target / server-0.0.1-SNAPSHOT.jar \ ../../spring-boot-docker/files /config-server.jar server $> cd ../../spring-boot-docker

Teraz vytvoríme Dockerfile menovaný Dockerfile.server s nasledujúcim obsahom:

Z alpine-java: base MAINTAINER baeldung.com KOPÍROVAŤ súbory / spring-cloud-config-server.jar / opt / spring-cloud / lib / COPY súbory / 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 "] OBJEM / var / lib / spring-cloud / config-repo EXPOSE 8888
  • ZO: Ako základ pre náš imidž si vezmeme Java- povolené Alpine Linux, vytvorené v predchádzajúcej časti
  • KÓPIA: Nechali sme Docker skopírujte náš súbor jar do obrázka
  • ENV: Tento príkaz umožňuje definovať niektoré premenné prostredia, ktoré bude aplikácia spustená v kontajneri rešpektovať. Tu definujeme prispôsobené Aplikácia Spring Boot konfigurácie, aby sa neskôr odovzdal do spustiteľného súboru jar
  • VSTUPNÝ BOD/CMD: Toto bude spustiteľný súbor, ktorý sa spustí pri zavedení systému. Musíme ich definovať ako JSON-pole, pretože použijeme VSTUPNÝ BOD v kombinácii s a CMD pre niektoré argumenty aplikácie
  • OBJEM: Pretože náš kontajner bude bežať v izolovanom prostredí bez priameho prístupu do siete, musíme pre naše úložisko konfigurácií definovať zástupný bod prípojného bodu.
  • EXPOZÍCIA: Tu hovoríme Docker, na ktorom porte je naša aplikácia uvedená. Tento port bude zverejnený hostiteľovi pri zavedení systému

Na vytvorenie obrazu z našej Dockerfile, musíme bežať „Docker build“, ako predtým:

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

Ale predtým, ako spustíme kontajner z nášho obrázka, musíme vytvoriť zväzok na upevnenie:

$> docker volume create --name = spring-cloud-config-repo

UPOZORNENIE: Aj keď je kontajner nemenný, ak nie je po ukončení aplikácie potvrdený pre obrázok, dáta uložené v zväzku budú trvalé v niekoľkých kontajneroch.

Nakoniec sme schopní spustiť kontajner z nášho obrázka:

$> docker run --name = config-server --publish = 8888: 8888 \ --volume = spring-cloud-config-repo: / var / lib / spring-cloud / config-repo \ config-server: najnovšie
  • Najprv musíme -názov náš kontajner. Ak nie, bude automaticky vybraný
  • Potom musíme –Publikovať náš vystavený prístav (pozri Dockerfile) do portu na našom hostiteľovi. Hodnota je uvedená vo formulári „Host-port: container-port“. Ak je uvedený iba kontajnerový port, použije sa náhodne vybraný hostiteľský port. Ak túto možnosť vynecháme, kontajner bude úplne izolovaný
  • The –Objem Táto voľba umožňuje prístup k adresáru na hostiteľovi (ak sa používa s absolútnou cestou) alebo k predtým vytvorenému Docker objem (pri použití s ​​a názov zväzku). Cesta za dvojbodkou určuje prípojný bod v kontajneri
  • Ako argument musíme povedať Docker, ktorý obrázok sa má použiť. Tu musíme dať meno-obrázka z predtým „docker build‘Krok
  • Niektoré užitočnejšie možnosti:
    • -to - povoliť interaktívny režim a prideliť a pseudo-tty
    • -d - po naštartovaní sa odpojiť od kontajnera

Ak spustíme kontajner v odpojenom režime, môžeme skontrolovať jeho podrobnosti, zastaviť ho a odstrániť pomocou nasledujúcich príkazov:

$> docker skontrolovať konfiguračný server $> docker zastaviť konfiguračný server $> docker rm config-server

5. Ukotvte závislé aplikácie v zloženom stave

Docker príkazy a Dockerfiles sú zvlášť vhodné na vytváranie jednotlivých nádob. Ale ak chcete pracujú na sieti izolovaných aplikácií, správa kontajnerov bude rýchlo preplnená.

Aby sme to vyriešili, Docker poskytuje nástroj s názvom Docker Compose. Toto je dodávané s vlastným zabudovaným súborom YAML formáte a je vhodnejšia na správu viacerých kontajnerov. Napríklad je schopný spustiť alebo zastaviť zloženú službu v jednom príkaze alebo zlúčiť výstup protokolovania viacerých služieb do jedného. pseudo-tty.

Vytvorme si príklad dvoch aplikácií bežiacich v rôznych kontajneroch Docker. Budú spolu komunikovať a budú hostiteľskému systému predstavovaní ako „samostatná jednotka“. Postavíme a skopírujeme spring-cloud-config / klient príklad popísaný v tutoriáli konfigurácie jarnej oblačnosti pre náš súbory priečinok, ako sme to už robili predtým s priečinkom konfiguračný server.

Toto bude naše docker-compose.yml:

verzia: „2“ služby: config-server: container_name: konfigurácia servera: kontext:. dockerfile: Dockerfile.server obrázok: config-server: najnovšie vystavenie: - 8888 sietí: - spring-cloud-network objemy: - spring-cloud-config-repo: / var / lib / spring-cloud / config-repo logovanie: driver : json-file config-client: container_name: config-client build: context:. dockerfile: Dockerfile.client obrázok: config-client: posledný vstupný bod: /opt/spring-cloud/bin/config-client-entrypoint.sh prostredie: SPRING_APPLICATION_JSON: \ '{"spring": {"cloud": \ {"config ": {" uri ":" // config-server: 8888 "}}}} 'vystaviť: - 8080 portov: - 8080: 8080 sietí: - spring-cloud-network links: - config-server: config-server depends_on : - protokolovanie konfiguračného servera: ovládač: súbory json: siete: spring-cloud-network: ovládač: mostné zväzky: spring-cloud-config-repo: externé: true
  • verzia: Určuje, ktorá verzia formátu sa má použiť. Toto je povinné pole. Tu používame novšiu verziu, zatiaľ čo starší formát je „1“
  • služby: Každý objekt v tomto kľúči definuje a služby, a.k.a kontajner. Táto časť je povinná
    • stavať: Ak je uvedený, ukotviť-zložiť je schopný vytvoriť obraz z a Dockerfile
      • kontext: Ak je zadaný, určuje adresár zostavenia, kde Dockerfile je vyhľadaný
      • dockerfile: Ak je zadaný, nastaví alternatívny názov pre a Dockerfile
    • obrázok: Hovorí Docker aký názov by mal dať obrázku, keď sa použijú funkcie zostavenia. V opačnom prípade vyhľadáva tento obrázok v knižnici alebo vzdialený register
    • sietí: Toto je identifikátor pomenovaných sietí, ktoré sa majú použiť. Daný meno-hodnota musí byť uvedený v zozname sietí oddiel
    • objemy: Toto identifikuje pomenované zväzky, ktoré sa majú použiť, a prípojné body, ku ktorým sa majú zväzky pripojiť, oddelené dvojbodkou. Rovnako tak v sietí oddiel, a názov zväzku musia byť definované osobitne objemy oddiel
    • odkazy: Týmto sa vytvorí interné sieťové spojenie medzi toto služba a uvedená služba. Toto služba sa bude môcť pripojiť k uvedenej službe, pričom časť pred dvojbodkou určuje a názov služby z služby oddiel a časť za dvojbodkou určuje názov hostiteľa, na ktorom služba na exponovanom porte počúva
    • záleží na: Toto hovorí Docker spustiť službu, iba ak sa uvedené služby úspešne spustili. UPOZORNENIE: Funguje to iba na úrovni kontajnera! Ako riešenie začať závislou osobou žiadosť najskôr, viď config-client-entrypoint.sh
    • ťažba dreva: Tu používame „Súbor json“ ovládač, ktorý je predvolený. Prípadne „Syslog“ s danou možnosťou adresy alebo „Žiadny“ môže byť použité
  • sietí: V tejto časti špecifikujeme sietí dostupné našim službám. V tomto príklade necháme ukotviť-zložiť vytvoriť pomenovaný sieť typu 'Most' pre nás. Ak je možnosť externý je nastavený na pravda, použije existujúci s daným menom
  • objemy: Toto je veľmi podobné sietí oddiel

Než budeme pokračovať, skontrolujeme syntaktické chyby v našom zostavovacom súbore:

$> konfigurácia docker-compose

Toto bude naše Dockerfile.client postaviť konfiguračný klient obrázok z. Líši sa od Dockerfile.server v tom dodatočne inštalujeme OpenBSD netcat (čo je potrebné v ďalšom kroku) a urobte vstupný bod spustiteľný:

FROM alpine-java: base MAINTAINER baeldung.com RUN apk --no-cache add netcat-openbsd COPY files / 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

A toto bude prispôsobené vstupný bod pre naše služba config-client. Tu používame netcat v slučke skontrolovať, či je náš konfiguračný server je hotový. Musíte si všimnúť, že sa môžeme dostať k nášmu konfiguračný server jeho meno-odkazu, namiesto IP adresy:

#! / bin / sh while! nc -z konfiguračný server 8888; do echo "Čakanie na nadchádzajúci server konfigurácie" spánok 2 hotové java -jar /opt/spring-cloud/lib/config-client.jar

Nakoniec môžeme vytvoriť naše obrázky, vytvoriť definované kontajnery a spustiť ich jedným príkazom:

$> docker-compose up --build

Ak chcete nádoby zastaviť, vyberte ich z Docker a odstráňte pripojené sietí a objemy z neho môžeme použiť opačný príkaz:

$> docker-compose down

Príjemná vlastnosť ukotviť-zložiť je schopnosť škálovať služby. Môžeme napríklad povedať Docker spustiť jeden kontajner pre konfiguračný server a tri kontajnery na konfiguračný klient.

Aby to však fungovalo správne, musíme odstrániť container_name z našej docker-compose.yml, za prenájom Docker vyberte jednu a musíme zmeniť vystavená konfigurácia portu, aby sa zabránilo stretom.

Potom sme schopní rozšíriť naše služby takto:

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

6. Záver

Ako sme videli, teraz sme schopní vytvoriť si vlastné riešenie Docker obrázky, spustené a Aplikácia Spring Boot ako Docker kontajner a vytváranie závislých kontajnerov s ukotviť-zložiť.

Ďalšie informácie o súboroch buildu nájdete v oficiálnej časti Referencia dockerfile a odkaz docker-compose.yml.

Ako obvykle je možné nájsť zdrojové kódy tohto tutoriálu na Githube.