Kontejnerizace aplikace v Javě

Dokončeno

V této lekci kontejnerizujete aplikaci v Javě.

Jak už bylo zmíněno dříve, kontejnery běží přímo nad hostitelským operačním systémem, jádrem a hardwarem jako v podstatě jen další systémový proces. Kontejnery vyžadují méně systémových prostředků, což má za následek menší nároky, menší režii a rychlejší spouštění aplikací. Jedná se o skvělé případy použití škálování na vyžádání.

Existují kontejnery Windows a linuxové kontejnery. V tomto modulu využijete široce používaný modul runtime Dockeru k sestavení image kontejneru Linuxu. Potom nasadíte image kontejneru Linuxu do hostitelského operačního systému místního počítače. Nakonec nasadíte image kontejneru Linuxu do služby Azure Kubernetes Service.

Docker – přehled

Modul runtime Dockeru se používá k sestavení, vyžádání, spuštění a nasdílení imagí kontejneru. Následující obrázek znázorňuje tyto případy použití následované popisem každého příkazu use case nebo Dockeru.

Diagram showing Docker commands.

Příkaz Dockeru Popis
docker build Vytvoří image kontejneru; Instrukce a vrstvy potřebné pro Docker v podstatě vytvoří spuštěný kontejner z image. Výsledkem tohoto příkazu je obrázek.
docker pull Kontejnery se inicializují z imagí, které se načítají z registrů, jako je Azure Container Registry, a to je místo, odkud bude služba Azure Kubernetes Service načítat. Výsledkem tohoto příkazu je načtení image ze sítě, ke které dojde v Azure. Mějte na paměti, že volitelně můžete načíst image místně; to je běžné při vytváření imagí, které vyžadují závislosti/vrstvy, pro které může vaše aplikace potřebovat, například aplikační server.
docker run Spuštěná instance image je kontejner a tento příkaz spustí všechny vrstvy potřebné ke spuštění a interakci se spuštěnou aplikací kontejneru. Výsledkem tohoto příkazu je spuštěný proces aplikace v hostitelském operačním systému.
docker push Služba Azure Container Registry uloží image, aby byly snadno dostupné a blízko sítě pro nasazení a škálování Azure.

Klonování aplikace v Javě

Nejprve naklonujete úložiště Flight Booking System for Airline Reservations a cd do složky projektu webové aplikace Airlines.

Poznámka:

Pokud se vytvoření služby Azure Kubernetes Service na kartě rozhraní příkazového řádku úspěšně dokončilo, použijte tuto kartu. pokud je stále spuštěný, otevřete novou kartu a cd do umístění, kde chcete klonovat letový rezervační systém pro rezervace leteckých společností.

V rozhraní příkazového řádku spusťte následující příkaz:

git clone https://github.com/Azure-Samples/containerize-and-deploy-Java-app-to-Azure.git

V rozhraní příkazového řádku spusťte následující příkaz:

cd containerize-and-deploy-Java-app-to-Azure/Project/Airlines

Poznámka:

Pokud máte nainstalovanou Javu a Maven, můžete v rozhraní příkazového řádku spustit následující příkazy, abyste získali představu o prostředí při vytváření aplikace bez Dockeru. Pokud nemáte nainstalovanou Javu a Maven, můžete bezpečně přejít k další části a vytvořit soubor Dockeru. V této části pomocí Dockeru stáhnete Javu a Maven a spustíte sestavení vaším jménem.

Pokud máte nainstalovaný Maven a sadu JDK (8) nebo novější, můžete v rozhraní příkazového řádku spustit následující příkaz:

mvn clean install

Poznámka:

Tento příkaz jsme použili mvn clean install k ilustraci provozních výzev při nepoužívaných buildech Dockeru s více fázemi, které probereme v dalším kroku. Tento krok je opět volitelný; v obou směrech se můžete bezpečně pohybovat bez provedení příkazu Maven.

Maven by měl úspěšně sestavit systém flight Booking System for Airline Reservations Web Application Archive artifact FlightBookingSystemSample-0.0.-SNAPSHOT.war, jak je znázorněno v následujícím výstupu:

[INFO] Building war: /mnt/c/Users/chtrembl/dev/git/containerize-and-deploy-Java-app-to-Azure/Project/FlightBookingSystemSample/target/FlightBookingSystemSample-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  17.698 s
[INFO] Finished at: 2021-09-28T15:18:07-04:00
[INFO] ------------------------------------------------------------------------

Představte si, že jste vývojář Java a právě jste vytvořili .FlightBookingSystemSample-0.0.1-SNAPSHOT.war Dalším krokem je pravděpodobně spolupráce s provozními inženýry, kteří tento artefakt nasadí na místní server nebo virtuální počítač. Aby se aplikace úspěšně spustila a spustila, vyžaduje, aby byly servery a virtuální počítače dostupné a nakonfigurované s požadovanými závislostmi. To je náročné a časově náročné, zejména na vyžádání, když se zvyšuje zatížení vaší aplikace. U kontejnerů se tyto výzvy zmírňují.

Vytvoření souboru Dockerfile

V tuto chvíli jste připraveni vytvořit soubor Dockerfile. Soubor Dockerfile je textový dokument, který obsahuje všechny příkazy, které by uživatel mohl spustit na příkazovém řádku, aby sestavil image kontejneru, z nichž každá je vrstva (která může být uložena do mezipaměti za účelem efektivity), které se sestavují nad sebou.

Například letový rezervační systém pro rezervace leteckých společností musí být nasazený a spuštěný uvnitř aplikačního serveru. Aplikační server není zabalený uvnitř objektu FlightBookingSystemSample-0.0.1-SNAPSHOT.war; je to externí závislost potřebná ke FlightBookingSystemSample-0.0.1-SNAPSHOT.war spuštění, naslouchání a zpracování požadavků HTTP, správa uživatelských relací a usnadnění rezervací letů. Pokud se jednalo o tradiční nekontenerizované nasazení, inženýři operací nainstalovali a nakonfigurovali aplikační server na některém fyzickém serveru nebo virtuálním počítači před nasazením FlightBookingSystemSample-0.0.1-SNAPSHOT.war . Tito provozní technici by také museli zajistit, aby sada JDK používaná na vašem počítači (co mvn clean install se používalo ke kompilaci .war) ve skutečnosti odpovídala stejnému JRE používanému aplikačním serverem. Správa těchto závislostí je náročná a časově náročná.

Pomocí souboru Dockerfile můžete napsat pokyny (vrstvy), které je potřeba k tomu provést automaticky, tím, že v krocích potřebných k zajištění toho, aby systém rezervace letů pro rezervace leteckých společností obsahuje všechny závislosti potřebné k nasazení do modulu runtime kontejneru Dockeru. To je velmi zajímavé, když začnete přemýšlet o škálování na vyžádání v neplánovaných intervalech. Stojí za zmínku, že každá vrstva využívá mezipaměť Dockeru, která obsahuje stav image kontejneru v každém instrukčním milníku, optimalizaci výpočetního času a opakovaného použití. Pokud se vrstva nemění, použijí se vrstvy uložené v mezipaměti. Běžné případy použití vrstev v mezipaměti jsou například modul runtime Java, aplikační server a/nebo jiné závislosti webové aplikace Flight Booking System for Airline Reservations. Pokud a když se verze změní na dříve uložené vrstvě v mezipaměti, vytvoří se nová položka uložená v mezipaměti.

Následující obrázek znázorňuje vrstvy image kontejneru. Všimněte si, že horní vrstva je systém letových rezervací pro čtení a zápis pro webovou aplikační vrstvu Airline Reservations, která je postavená na předchozích vrstvách jen pro čtení, z nichž všechny jsou výsledkem příkazů v souboru Dockerfile.

Diagram showing the Docker layers.

Docker má také koncept vícefázových sestavení, což je funkce, která umožňuje vytvořit menší image kontejneru s lepším ukládáním do mezipaměti a menšími nároky na zabezpečení, což umožňuje v průběhu času zvýšit optimalizaci a údržbu souboru Dockerfile; Například pokyny, které můžete použít k provedení kompilace aplikace (FlightBookingSystemSample-0.0.1-SNAPSHOT.war) i sestavení samotné image kontejneru, ponechání zbytků FlightBookingSystemSample-0.0.1-SNAPSHOT.war kompilace za sebou, což vede k menšímu využití. V dlouhodobém horizontu to platí dividendy, když začnete přemýšlet o těchto obrázcích cest po síti. S vícefázovými sestaveními použijete v souboru Dockerfile několik příkazů FROM. Každá instrukce FROM může používat jinou základnu a každý z těchto příkazů začíná čistou slate a odebere všechny nepotřebné soubory ve vrstvě ukládání do mezipaměti, které by mohly být normálně uloženy do mezipaměti.

Je nezbytné zajistit, aby aplikace byla vytvořena stejnou JDK odpovídající stejnému JRE, která bude izolovaná v imagi kontejneru za běhu. V následujícím příkladu budete mít fázi sestavení, která ke kompilaci FlightBookingSystemSample-0.0.1-SNAPSHOT.warsady JDK využívá konkrétní verzi Mavenu a konkrétní verzi sady JDK. Tato fáze zajišťuje, že jakýkoli modul runtime Dockeru, který tuto fázi spouští, získá očekávaný generovaný bajtový kód, který určil autor souboru Dockerfile (jinak by provozní technici museli křížově odkazovat na modul runtime Javy a aplikačního serveru s vývojáři). Fáze balíčku pak použije konkrétní verzi Tomcat a JRE odpovídající JDK ve fázi sestavení. Opět se to provádí, aby se zajistilo, že všechny závislosti (Java Development Kit JDK, Java Runtime Environment JRE, aplikační server) jsou řízené a izolované, aby se zajistilo očekávané chování všech počítačů, na kterých se tato image spustí.

Je také vhodné poznamenat, že s tímto vícefázovým sestavením není technicky nutné, aby se Maven a Java nainstalovaly do systému. Docker je stáhne pro použití s sestavením aplikace i modulem runtime aplikace, aby nedocházelo ke konfliktům potenciálních verzí a neočekávanému chování; pokud samozřejmě kompilujete kód a vytváříte artefakty mimo Docker.

Následující obrázek znázorňuje vícefázové sestavení a to, co se děje v jednotlivých fázích na základě příkazů zadaných v souboru Dockerfile. Ve fázi 0 se zkompiluje webová aplikace Flight Booking System for Airline Reservations a FlightBookingSystemSample-0.0.1-SNAPSHOT.war vygeneruje se. Tato fáze umožňuje konzistenci verzí Mavenu a Javy používaných ke kompilaci této aplikace. Po vytvoření je to FlightBookingSystemSample-0.0.1-SNAPSHOT.war jediná vrstva potřebná pro fázi 1 (fáze modulu runtime) a všechny předchozí vrstvy je možné zahodit. Docker pak použije tuto FlightBookingSystemSample-0.0.1-SNAPSHOT.war vrstvu z fáze 0 k vytvoření zbývajících vrstev potřebných pro modul runtime. V tomto případě nakonfiguruje aplikační server a spustí aplikaci.

Diagram showing the Docker multistage build.

V kořenovém adresáři projektu vytvořte soubor s názvem Dockerfile a kontejnerize-and-deploy-java-app-to-Azure/Project/Airlines:

vi Dockerfile

Do souboru Dockerfile přidejte následující obsah, pak stisknutím klávesy ESC uložte a ukončete ho, zadejte :wq! a stiskněte Enter:

#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
WORKDIR /build
COPY pom.xml .
COPY src ./src
COPY web ./web
RUN mvn clean package

#
# Package stage
#
FROM tomcat:8.5.72-jre11-openjdk-slim
COPY tomcat-users.xml /usr/local/tomcat/conf
COPY --from=build /build/target/*.war /usr/local/tomcat/webapps/FlightBookingSystemSample.war
EXPOSE 8080
CMD ["catalina.sh", "run"]

Poznámka:

Volitelně Dockerfile_Solution v kořenovém adresáři projektu obsahuje potřebný obsah.

Tato fáze sestavení souboru Dockerfile má šest pokynů:

Příkaz Dockeru Popis
FROM FROM maven bude základní vrstva, ze které se sestaví FlightBookingSystemSample-0.0.1-SNAPSHOT.war , konkrétní verze Mavenu a konkrétní verze sady JDK, aby se zajistila stejná kompilace bajtového kódu na všech počítačích, na kterých běží tento build.
WORKDIR WORKDIR slouží k definování pracovního adresáře kontejneru v daném okamžiku; v tomto případě se budou nacházet kompilované artefakty.
COPY COPY přidá soubory z aktuálního adresáře klienta Dockeru. Nastavení souborů potřebných ke kompilaci Mavenu bude pom.xml potřebovat kontext Dockeru.
COPY Nastaví soubory potřebné ke kompilaci Mavenu. Kontext Dockeru bude potřebovat složku src obsahující webovou aplikaci Flight Booking System for Airline Reservations.
COPY Nastaví soubory potřebné ke kompilaci Mavenu. Kontext webové docket bude potřebovat složku obsahující závislosti webové aplikace Flight Booking System for Airline Reservations.
RUN Instrukce RUN mvn clean package slouží ke spuštění libovolného příkazu nad aktuální imagí. V tomto případě se run používá ke spuštění sestavení Maven, který zkompiluje FlightBookingSystemSample-0.0.1-SNAPSHOT.war.

Tato fáze balíčku souborů Dockeru má pět pokynů:

Příkaz Dockeru Popis
FROM FROM tomcat bude základní vrstvou, na které se vytvoří image kontejneru. Image kontejneru Flight Booking System for Airline Reservations bude image postavená na obrázku tomcat. Modul runtime Dockeru se pokusí vyhledat image tomcat místně. Pokud tuto verzi nemá, stáhne ji z registru. Pokud jste prozkoumali image tomcat, na kterou tady odkazujete, zjistíte, že je sestavená pomocí mnoha dalších vrstev, z nichž všechny umožňují opakované použití jako jedna zabalená image kontejneru aplikačního serveru pro celý svět, aby se použila při nasazování aplikace v Javě. Vybrali jsme a otestovali tomcat:8.5.72-jre11-openjdk-slim pro účely modulu. Všimněte si, že všechny předchozí vrstvy z první fáze sestavení jsou pryč, jakmile Docker rozpozná tuto druhou instrukci FROM.
COPY COPY tomcat-users.xml zkopíruje soubor tomcat-users.xml, který spravuje uživatele flight Booking System for Airline Reservations (spravované v rámci správy zdrojového kódu pomocí identity Tomcat, obvykle by to byl v externím systému správy identit) do image kontejneru tomcat, aby se v imagi kontejneru vždy a kdykoli předtím vytvořila image kontejneru.
ADD ADD target/*.war /usr/local/tomcat/webapps/FlightBookingSystemSample.war zkopíruje maven zkompilovaný FlightBookingSystemSample-0.0.1-SNAPSHOT.war do složky webapps obrázků tomcat, aby se zajistilo, že při inicializaci Tomcat zjistí, že FlightBookingSystemSample-0.0.1-SNAPSHOT.war se má nainstalovat na aplikační server.
EXPOSE EXPOSE 8080 je potřeba, protože Tomcat je nakonfigurovaný tak, aby naslouchal provozu na portu 8080. Tím se zajistí, že proces Dockeru naslouchá na tomto portu.
CMD Instrukce CMD nastaví příkaz, který se má spustit při spuštění kontejneru. V tomto případě dá Dockeru pokyn, CMD ["catalina.sh", "run"] aby inicializoval aplikační server Tomcat.

Poznámka:

Bez značky verze na FROM tomcat řádku se použije nejnovější verze. Obecně platí, že budete chtít využít značku verze (nezapomeňte, že se používá ukládání do mezipaměti, takže pokud se vrstvy konzistentně mění, budete mít šířku pásma, latenci, výpočetní čas a/nebo vedlejší účinky neotestovaných sestavení/vrstev). Pro účely tohoto modulu jsme předem vybrali konkrétní značky Maven, Tomcat a Java JRE/JDK, které se testují pro práci s modulem FlightBookingSystemSample-0.0.1-SNAPSHOT.war runtime.

Další informace o konstrukci souboru Dockerfile naleznete v tématu Referenční informace k souboru Dockerfile