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é
- stavať: Ak je uvedený, ukotviť-zložiť je schopný vytvoriť obraz z a Dockerfile
- 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.