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.

Přehled Dockeru

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 zobrazující příkazy Dockeru

Příkaz Dockeru Popis
docker build Vytvoří obraz kontejneru, tedy instrukce a vrstvy potřebné k tomu, aby Docker nakonec vytvořil z obrazu spuštěný kontejner. 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 stažení image ze sítě, které se uskuteční v Azure. Mějte na paměti, že máte možnost volitelně načíst obrazy místně; to je běžné při vytváření obrazů, které vyžadují závislosti/vrstvy, které vaše aplikace může 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 adresáře, kde chcete klonovat systém pro rezervace letů.

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 Vytvoření souboru 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

Použili jsme příkaz mvn clean install k ilustraci provozních výzev, které nepoužívají sestavení 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ě vytvořit systém pro rezervaci letů pro artefakt webové aplikace pro rezervaci letenek FlightBookingSystemSample-0.0.-SNAPSHOT.war, jak je vidět 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ář v Javě a právě jste vytvořili tuto 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 fungovala, vyžaduje, aby byly servery a virtuální počítače dostupné a nakonfigurované s nezbytnými závislostmi. To je časově náročné a obtížné, zejména při požadavku, když dochází ke zvýšení 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ř FlightBookingSystemSample-0.0.1-SNAPSHOT.war; je to externí závislost potřebná ke spuštění FlightBookingSystemSample-0.0.1-SNAPSHOT.war, naslouchání a zpracování požadavků HTTP, správě 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 do něj. Tito provozní inženýři by také museli zajistit, aby sada JDK používaná na vašem počítači (jaká mvn clean install používala ke kompilaci rozhraní .war) ve skutečnosti odpovídá 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) potřebné k automatickému provedení, čímž zajistíte, že systém rezervace letů pro letecké společnosti obsahuje všechny závislosti potřebné k nasazení do runtimového prostředí 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 znázorňující vrstvy Dockeru

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 se to vyplácí, když začnete přemýšlet o těchto obrázcích cestujících 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á s čistým štítem, odstraní všechny nepotřebné soubory z vrstvy úložiště mezipaměti, které by za normálních okolností mohly být uloženy.

Je nezbytné zajistit, aby aplikace byla postavena stejným JDK odpovídajícím stejnému JRE, které budou izolované v image kontejneru během běhu. V následujícím příkladu budete mít fázi sestavení, která využívá konkrétní verzi Mavenu a konkrétní verzi sady JDK ke kompilaci FlightBookingSystemSample-0.0.1-SNAPSHOT.war. Tato fáze zajišťuje, že jakýkoli runtime Dockeru, který tuto fázi spouští, získá očekávaný generovaný bajtový kód, který určil autor Dockerfile (jinak by provozní technici museli porovnávat jejich runtime Javy a aplikačního serveru s tím od vývojáře). V balíčkovací fázi se pak použije konkrétní verze Tomcat a JRE, které odpovídají 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í.

Stojí také za zmínku, že s tímto vícefázovým sestavením není technicky nutné mít Maven a Javu nainstalované na systém. 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, ve fázi sestavování, se webová aplikace Flight Booking System for Airline Reservations zkompiluje a FlightBookingSystemSample-0.0.1-SNAPSHOT.war se vygeneruje. Tato fáze umožňuje konzistenci verzí Mavenu a Javy používaných ke kompilaci této aplikace. Po vytvoření FlightBookingSystemSample-0.0.1-SNAPSHOT.war je to 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ě nakonfigurujte aplikační server a spusťte aplikaci.

diagram znázorňující sestavení Dockeru s více fázemi

V kořenovém adresáři vašeho projektu, containerize-and-deploy-java-app-to-Azure/Project/Airlines, vytvořte soubor s názvem Dockerfile.

vi Dockerfile

Do souboru Dockerfile přidejte následující obsah, poté uložte a zavřete stisknutím ESC, následně napište :wq! a potvrďte stisknutím 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 tato FlightBookingSystemSample-0.0.1-SNAPSHOT.war sestaví, 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 se používá 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, pom.xml bude 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ého Docketu bude potřebovat složku obsahující závislosti webové aplikace pro rezervace letenek Flight Booking System.
BĚŽET Instrukce RUN mvn clean package slouží ke spuštění libovolného příkazu nad aktuálním obrazem. 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é bude postavena tato image kontejneru. Obrázek kontejneru systému rezervace letů pro letecké společnosti bude obrázek 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ě. Pro účely modulu jsme vybrali a otestovali tomcat:8.5.72-jre11-openjdk-slim. 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 systém pro rezervaci letů leteckých společností pro uživatele (spravované v rámci správy zdrojového kódu pomocí identity Tomcat, což by obvykle bylo v externím systému správy identit) do obrazu kontejneru Tomcat tak, aby byl v obrazu kontejneru přítomen pokaždé, když je obraz kontejneru vytvořen.
ADD ADD target/*.war /usr/local/tomcat/webapps/FlightBookingSystemSample.war zkopíruje Mavenem zkompilovaný FlightBookingSystemSample-0.0.1-SNAPSHOT.war do složky webapps v Tomcat images, aby se zajistilo, že při inicializaci Tomcatu najde FlightBookingSystemSample-0.0.1-SNAPSHOT.war k instalaci na aplikačním serveru.
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ě CMD ["catalina.sh", "run"] dá Dockeru pokyn, aby inicializoval aplikační server Tomcat.

Poznámka

Bez značky verze na řádku FROM tomcat 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í, mohou nastat problémy jako zvýšená šířka pásma, latence, 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é byly otestovány a fungují s FlightBookingSystemSample-0.0.1-SNAPSHOT.war za běhu.

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