Zpět na blog

Jak nasadit aplikaci Node.js (Express.js) pomocí Dockeru na Ubuntu 20.04

Jak nasadit aplikaci Node.js (Express.js) pomocí Dockeru na Ubuntu 20.04

Úvod

Docker je kontejnerová platforma, což je lehké, virtualizované, přenosné, softwarově definované standardizované prostředí. Umožňuje softwaru běžet v izolaci od ostatního softwaru běžícího na fyzickém hostitelském počítači. Docker je klíčovou součástí aspektu Continuous Development and Integration (průběžný vývoj a integrace) ve vývoji softwaru. Nabízí lehkou alternativu k virtuálním počítačům a umožňuje vývojářům využívat distribuované aplikační architektury. Pro podrobný přehled ekosystému Docker se podívejte na tento článek.

Proces sestavení aplikace pomocí Dockeru začíná tím, že vývojář vytvoří obraz (image) pro svou aplikaci. Poté bude tento obraz nasazen uvnitř kontejneru. Obraz obsahuje definující komponenty aplikace, jako je kód aplikace, knihovny, konfigurační soubory, proměnné prostředí a běhové prostředí. Obraz standardizuje prostředí uvnitř kontejneru, což kontejnerizaci dodává vlastnosti přenositelnosti. Node.js je open-source, multiplatformní backendové běhové prostředí pro JavaScript, které dokáže spouštět kód JavaScriptu mimo webový prohlížeč. Je postaveno na V8 JavaScript Engine. Express.js je minimalistický backendový JavaScript framework, který běží nad Node.js.

V tomto návodu vytvoříme obraz pro web, který běží na frameworku Express. Použijeme Bootstrap, což je frontendová knihovna, aby frontend vypadal lépe. Jakmile obraz vytvoříme, sestavíme kontejner a nahrajeme ho na Docker Hub. Docker Hub umožňuje vývojářům hostovat kontejnerizované aplikace pro snadné nasazení do jakéhokoli prostředí Docker. Jakmile bude váš kontejner hostován na Docker Hubu, stáhneme ho a vytvoříme další obraz, který bude skutečně sloužit našemu webu.

Požadavky

Tento návod bude praktický. Měli byste si vytvořit prostředí, které vám umožní postupovat podle kroků.

Krok 1: Konfigurace závislostí aplikace

Před vytvořením obrazu musíte vytvořit zdrojový kód aplikace. Zdrojový kód aplikace zahrnuje kód, statický obsah a závislosti, které se zkopírují do kontejneru. Začněte vytvořením adresáře pro váš projekt v domovském adresáři uživatele bez oprávnění root. Nazveme ho node_express, ale můžete použít jakýkoli název adresáře, který se vám líbí:

Dále se přesuňte do tohoto adresáře:

Toto bude kořenový adresář vaší aplikace. Aplikace node.js očekává package.json v kořenové složce. Npm používá tento soubor k určení, jaké závislosti vaše aplikace potřebuje. Pro vytvoření tohoto souboru zadejte následující příkaz:

Poté do souboru přidejte následující fragment kódu. Název, autora, popis a soubor vstupního bodu můžete upravit podle svého uvážení:

Jak vidíte, tento soubor specifikuje název projektu, verzi, autora a licenci, pod kterou bude kód aplikace sdílen. Doporučuje se použít krátký a popisný název pro váš projekt, abyste se vyhnuli duplicitám v npm registru. Pro projekt jsme specifikovali licenci ISC, která umožňuje bezplatné kopírování, úpravy nebo distribuci kódu aplikace.

Nejdůležitější je, abyste si v souboru všimli následujících direktiv:

  • main“: tato direktiva specifikuje vstupní bod aplikace, který jsme nastavili jako index.js. Tento soubor vytvoříme za chvíli.
  • dependencies“: tato direktiva specifikuje závislosti aplikace, které budou staženy z npm registru, když spustíme příkaz npm, v našem případě chceme Express verze 4.17.1 a vyšší.

Nyní můžete soubor uložit stisknutím Ctrl + O. Poté soubor zavřete stisknutím Ctrl + X. Dále nainstalujeme závislosti spuštěním následujícího příkazu:

Tento příkaz nainstaluje závislosti aplikace specifikované v souboru package.json v adresáři node_modules. Ty byly automaticky vytvořeny při prvním spuštění příkazu. S nainstalovanými závislostmi aplikace nyní můžete začít přidávat kód aplikace.

Krok 2: Přidání souborů s kódem aplikace

Vytvoříme jednoduchý web s recepty, s laskavým svolením allrecipes. Hlavním vstupním bodem aplikace je soubor index.js. Přidáme adresář views, který bude obsahovat různé stránky a statické soubory projektu. Web bude mít úvodní stránku, která bude obsahovat úvodní informace a odkazy na některé recepty.

Kód naší úvodní stránky bude umístěn v souboru home.html. Nejprve vytvořte soubor index.js zadáním následujícího příkazu:

Přidejte následující kód, který importuje a vytvoří aplikaci Express. Specifikuje také objekt Router, základní adresář a port, na kterém bude tato aplikace běžet:

require je JavaScriptová funkce, která načítá modul. V tomto případě načítáme modul express. Poté použijeme importovaný modul k vytvoření objektů express a router. Objekt router provádí směrovací funkce aplikace tím, že reaguje na volání HTTP metod, které budeme do tohoto objektu přidávat v průběhu tutoriálu.

Nastavili jsme také path a port. Konstanta path definuje základní adresář pro kód. V našem případě je to podadresář views uvnitř kořenového adresáře projektu. port specifikuje port, na kterém by měla aplikace express naslouchat, v našem příkladu jsme jej nastavili na 8090.

Jakmile máme konstanty, můžeme pro aplikaci specifikovat některé trasy pomocí objektu router. Přidejte následující kód do souboru index.js pro specifikaci tras:

Můžete přidat middleware k trasám pomocí funkce router.use. V tomto případě přidáme funkci, která zaznamenává požadavky routeru před jejich předáním trasám aplikace. Požadavek GET na základní adresu aplikace vrátí home.html stránku. Poté jsme přidali stránky pro tři recepty, které budou také načteny pomocí požadavku GET na konkrétní stránku receptu.

Nakonec přidejte následující kód pro připojení router middlewaru a statických prostředků aplikace. Navíc řekněte aplikaci express, aby naslouchala na portu 8090:

Váš kompletní index.js soubor by měl vypadat takto:

Nyní můžete soubor uložit a zavřít. Dalším krokem je přidání statických webových stránek do adresáře views. Začněte zadáním následujícího příkazu pro vytvoření adresáře:

Zadejte následující příkaz pro otevření souboru úvodní stránky home.html:

Přidejte do souboru následující kód. Kód importuje Bootstrap a nabízí návštěvníkům webu informace o tom, o čem celý web je:

Kromě importu Bootstrapu stránka také přidává základní navigační menu pro snazší přecházení mezi stránkami a návrat na úvodní stránku. Přidali jsme také řádek pro import našeho vlastního CSS souboru:

Tento soubor použijeme k pozdějšímu přidání vlastního stylu do aplikace. Nyní vytvoříme tři stránky pro recepty. Nejprve začneme vytvořením stránky pro lasagne. Otevřete soubor v editoru nano pomocí následujícího příkazu:

Do otevřeného souboru přidejte následující kód. Tento soubor naimportuje Bootstrap, soubor custom.css, definuje navigační menu a nabídne informace o receptu na lasagne:

Pojďme provést stejný postup a vytvořit soubor pro stránku s receptem na guacamole. Otevřete soubor v editoru nano spuštěním následujícího příkazu:

Poté do souboru přidejte tento kód:

Nakonec vytvořme soubor banana_bread.html zadáním příkazu:

Poté do souboru přidejte následující kód HTML:

Nyní jsme vytvořili všechny stránky. Pokud si pamatujete, máme přidat soubor css/custom.css. Pro vytvoření adresáře zadejte následující příkaz:

Poté vytvořte a otevřete soubor v editoru nano pomocí příkazu:

Můžete přidat další CSS kódy pro nastylování vašeho webu podle libosti. Pro stručnost přidejme do souboru následující fragment kódu:

Po dokončení soubor uložte a zavřete.

Nyní můžete aplikaci spustit, protože máme nainstalovaný zdrojový kód aplikace i závislosti projektu.

Nastavili jsme aplikaci tak, aby naslouchala na portu 8090, spusťte následující příkaz, který instruuje firewall, aby povolil provoz přes tento port. Pokud jste zadali jiný port, nahraďte číslo portu v příkazu:

Nyní můžete aplikaci spustit. Nejprve se však ujistěte, že se nacházíte v kořenovém adresáři projektu, spuštěním následujícího příkazu:

Spusťte aplikaci pomocí node index.js. Pokud jste zadali jiný vstupní bod, nahraďte jej svým vstupním bodem:

Pokud ve svém prohlížeči přejdete na http://your_public_server_ip:8090, uvidíte úvodní stránku receptů (Recipes), jak byla definována:

Recipes

 

V navigaci můžete vidět odkazy na různé recepty. Klikněme na některé z nich. Níže máme stránku s receptem na Lasagne:

Node.js app install on Ubuntu 1

A zde máme stránku s receptem na Guacamole:

Guacamole

Do tohoto okamžiku jste vytvořili svou aplikaci a otestovali, že funguje podle očekávání. Server můžete ukončit stisknutím Ctrl + C a přejít k vytvoření Dockerfile. Soubory Dockerfile pomáhají s škálovatelností tím, že umožňují v případě potřeby znovu vytvořit instanci aplikace.

Krok 3: Vytvoření Dockerfile

Docker při vytváření obrazů čte instrukce specifikované v souboru Dockerfile. Určuje běhové prostředí aplikace. Pomáhá tak vývojářům vyhnout se nesrovnalostem se závislostmi nebo měnícími se verzemi běhového prostředí. Pro vytvoření souboru Dockerfile zadejte následující příkaz:

Obraz Dockeru se vytváří pomocí několika vrstev obrazů, které na sebe navazují. Začnete přidáním základního obrazu, který tvoří výchozí bod pro aplikaci.

Vzhledem k tomu, že se očekává, že aplikace poběží v prostředí node.js, začneme přidáním obrazu node:10-alpine pro node.js. V současné době, kdy píšeme tento návod, je to doporučená LTS verze Node.js. Tento konkrétní obraz jsme vybrali, protože je odvozen od projektu Alpine Linux. Pomůže nám to tedy udržet velikost našeho obrazu na minimu. Na stránce obrazů Node na Docker Hubu je k dispozici několik variant obrazů, ze kterých si můžete vybrat podle svých potřeb.

Přidejte následující kód pro nastavení základního obrazu aplikace pomocí direktivy FROM:

Tento obraz obsahuje Node.js a npm. Každý Dockerfile musí začínat direktivou FROM. Obraz Dockeru node standardně obsahuje uživatele node, který nemá oprávnění root a kterého můžete použít ke spuštění kontejneru aplikace namísto uživatele root. Bezpečnostní doporučení pro Docker doporučují nespouštět kontejnery jako root a omezit oprávnění pouze na ta, která jsou vyžadována ke spuštění jeho prostředků.

V takovém případě budeme jako pracovní adresář pro aplikaci i pro uživatele uvnitř kontejneru používat domovský adresář uživatele node. Další informace naleznete v této příručce osvědčených postupů pro obraz Docker Node.

Vytvoříme podadresář node_modules uvnitř /home/node spolu s adresářem aplikace, což pomůže zjednodušit oprávnění pro kód aplikace. Vytvoření těchto adresářů zajistí, že budou mít správná oprávnění, když v kontejnerech lokálně spustíme příkaz npm install. Jakmile adresáře vytvoříte, musíte na ně nastavit vlastnictví pro uživatele node. To provedeme uvnitř souboru Dockerfile přidáním následujícího řádku:

Poté nastavíte pracovní adresář přidáním následujícího řádku:

Je dobré vždy nastavit WORKDIR, aby jej Docker nemusel vytvářet ve výchozím nastavení.

Přidejte následující řádek pro zkopírování souborů package.json a package-lock.json:

Doporučuje se přidat instrukci COPY před spuštěním npm install nebo kopírováním zdrojového kódu aplikace. To vám umožní využít mechanismus cachování Dockeru. Během procesu sestavení Docker kontroluje, zda má pro každou instrukci nacachovanou vrstvu. To znamená, že pokud jste nezměnili soubor package.json, Docker použije existující vrstvu obrazu a vyhne se přeinstalaci node modules, což urychlí proces sestavení.

Před spuštěním npm install, přidejte následující řádek pro přepnutí uživatele na node , abyste zajistili, že všechny soubory aplikace a adresář node_modules budou vlastněny uživatelem node, který nemá oprávnění root:

Náš kontejner je nyní připraven ke spuštění příkazu npm install. Přidejte do souboru Dockerfile následující řádek:

Jakmile jsou node_modules nainstalovány, přidejte následující řádek, který Dockeru řekne, aby zkopíroval kód aplikace do adresáře aplikace v kontejneru se správnými oprávněními a vlastnictvím, tj. pro uživatele node bez oprávnění root:

Posledním krokem je vystavení portu 8090 na kontejneru, jak jsme definovali v našem vstupním souboru index.js:

EXPOSE určuje, které porty na kontejneru budou otevřené za běhu. CMD spustí příkaz pro spuštění aplikace, v tomto případě node index.js.

V Dockerfile byste měli mít pouze jeden příkaz CMD, protože se uplatní pouze ten poslední. Podívejte se prosím na referenční dokumentaci k Dockerfile, kde najdete seznam věcí, které můžete s Dockerfile dělat.

Váš kompletní Dockerfile by měl vypadat takto:

Nyní můžete soubor uložit a zavřít.

Další věcí, kterou uděláte, je přidání souboru .dockerignore. Stejně jako soubor .gitignore, soubor .dockerignore určuje, které soubory a adresáře v adresáři projektu by se neměly kopírovat do kontejneru.

Otevřete soubor v editoru nano:

Do souboru přidejte následující řádky:

Pokud pracujete s git repozitářem, měli byste také přidat adresář .git a soubor .gitignore. Soubor uložte a zavřete.

Pokud vše proběhlo v pořádku, je čas sestavit obraz aplikace pomocí příkazu docker build. K příkazu –t můžete přidat příznak docker build, abyste obraz označili snadno zapamatovatelným názvem namísto náhodného řetězce, který docker nastavuje ve výchozím nastavení. Obraz budeme také nahrávat na Docker Hub, takže je nejlepší do značky zahrnout vaše uživatelské jméno pro Docker Hub.

Jako název značky použijeme nodejs-express-image. Můžete si vybrat libovolný název značky, který se vám líbí. Zde je příkaz pro sestavení obrazu:

Nezapomeňte nahradit your_dockerhub_username vaším skutečným uživatelským jménem pro Docker Hub. Tečka (.) na konci určuje, že kontextem sestavení je aktuální adresář.

Proces sestavení trvá minutu nebo dvě. Jakmile je hotovo, zadejte příkaz pro kontrolu vašich obrazů:

Měli byste vidět něco takového:

sudo docker images

Nezapomeňte, že jsme nahradili your_dockerhub_username skutečným uživatelským jménem.

Po potvrzení, že byl váš obraz sestaven, můžete nyní vytvořit kontejner s tímto obrazem pomocí docker run. Budou zahrnuty následující příznaky:

  • -p: publikuje port na kontejneru a mapuje jej na port na hostitelském systému. Pro demonstrační účely použijeme port 80 na hostitelském systému. Pokud však na tomto portu běží jiný proces, můžete jej podle potřeby upravit. Další informace o vázání portů naleznete v dokumentaci k Dockeru.
  • -d: pro odpojený režim (detached mode). Umožňuje kontejneru pokračovat v běhu na pozadí.
  • --name: můžete použít k nastavení snadno zapamatovatelného názvu namísto toho, aby Docker přiřadil náhodný řetězec.

Příkaz pro sestavení kontejneru je následující. Nahraďte své uživatelské jméno pro Docker Hub odpovídajícím způsobem:

Počkejte, až se kontejner sestaví a spustí. Pomocí tohoto příkazu můžete zkontrolovat všechny běžící kontejnery:

Měli byste vidět výstup podobný následujícímu:

Node.js app install on Ubuntu 3

Jak je vidět ve výstupu, kontejner nyní běží. Můžete si jej prohlédnout v prohlížeči, pokud navštívíte veřejnou IP adresu vašeho serveru bez portu. Načte se vaše domovská stránka:

awesome recipe

 

Úspěšně jste nasadili statický web Node Express pomocí Dockeru. Podívejme se, jak můžeme tento obraz nahrát na Docker Hub pro budoucí použití a účely škálování.

Krok 4: Práce s repozitáři obrazů Docker

Své obrazy můžete nahrát do registrů obrazů, jako je Docker Hub, a uložit je pro budoucí použití, sdílet je s ostatními vývojáři nebo umožnit škálování kontejnerů. Vytvořený obraz můžeme nahrát na Docker Hub a použít jej k opětovnému vytvoření kontejneru.

Pro přihlášení k účtu Docker Hub použijte následující příkaz. Nahraďte jej svým skutečným uživatelským jménem pro Docker Hub:

Po vyzvání zadejte své heslo. Po přihlášení se vytvoří soubor ~/.docker/config.json v domovském adresáři vašeho uživatele, který obsahuje vaše přihlašovací údaje k Docker Hubu.

S tímto nastavením zadejte následující příkaz pro nahrání obrazu na Docker Hub, přičemž uveďte tag, který jste nastavili při dřívějším sestavení obrazu:

Tento příkaz nahraje docker obraz na váš účet Docker Hub. Pokud navštívíte svůj účet, uvidíte svůj nedávno nahraný obraz:

Docker Hub

Užitečnost repozitáře obrazů můžeme otestovat tak, že zničíme aktuální kontejner aplikace a znovu jej sestavíme pomocí obrazu v repozitáři.

Zadejte příkaz pro výpis aktuálních kontejnerů:

Měli byste vidět výstup podobný tomuto:

Docker Hub

Poznamenejte si CONTAINER ID uvedené ve vašem výstupu, zkopírujte jej a použijte jej k zastavení kontejneru pomocí příkazu, přičemž nahraďte ID svým vlastním:

Zadejte následující příkaz pro výpis všech docker obrazů dostupných ve vašem systému:

Výstup zobrazí název vašeho obrazu, obraz node.js a další obrazy z procesu sestavení.

Zadejte následující příkaz pro odstranění obrazů, včetně nepoužívaných nebo osiřelých obrazů:

Napište y pro potvrzení. Tím se odstraní zastavené kontejnery a obrazy. Pokud je vypíšete, uvidíte ve výstupu prázdný seznam:

output

Nanyi jste odstranili jak kontejner, v němž aplikace běžela, tak samotný obraz. Další informace o odstraňování Docker kontejnerů, obrazů a svazků naleznete v našem návodu.

Nyní můžeme celý proces zopakovat tak, že nejprve stáhneme obraz z Docker Hubu pomocí následujícího příkazu. Podle potřeby nahraďte své uživatelské jméno pro Docker Hub:

Znovu vypište své Docker obrazy pomocí příkazu:

Ve výstupu byste měli vidět daný obraz:

sudo docker

Nyní můžete svůj kontejner znovu sestavit pomocí příkazu z Step 3. Samozřejmě podle potřeby nahraďte své uživatelské jméno pro Docker Hub:

Vypište své kontejnery, abyste potvrdili, že byl znovu sestaven:

Měli byste vidět podobný výstup:

V prohlížeči přejděte na veřejnou IP adresu svého serveru a měli byste vidět, že vaše aplikace běží.

Závěr

Pokud jste postupovali podle návodu až do tohoto bodu, máte nyní statický web vytvořený pomocí Expressu a Bootstrapu a nasazený pomocí Dockeru. Použili jste soubory statického webu k sestavení Docker obrazu a tento obraz jste použili k vytvoření kontejneru. Poté jste obraz nahráli do registru Docker obrazů, Docker Hub, čímž jste jej zpřístupnili pro budoucí použití nebo škálování. Chcete-li otestovat použití registru obrazů, zničili jste obrazy a kontejnery, stáhli obrazy z registru a kontejnery znovu sestavili.

Tento návod vysvětlil, jak nasadit aplikaci Node.js. Pokud byste se chtěli dozvědět, jak používat jiný stack pro vývoj webu, máme pro vás návod na Nasazení aplikace Laravel s Docker Compose na Nginx.

Další zdroje týkající se využití Dockeru naleznete v následujících návodech:

Příjemnou práci s počítačem!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.