Späť na blog

Ako nasadiť aplikáciu Node.js (Express.js) pomocou Dockeru na Ubuntu 20.04

Ako nasadiť aplikáciu Node.js (Express.js) pomocou Dockeru na Ubuntu 20.04

Úvod

Docker je kontajnerová platforma, ktorá predstavuje ľahké, virtualizované, prenosné, softvérovo definované štandardizované prostredie. Umožňuje softvéru bežať v izolácii od ostatného softvéru bežiaceho na fyzickom hostiteľskom počítači. Docker je definujúcim komponentom aspektu nepretržitého vývoja a integrácie (Continuous Development and Integration) vývoja softvéru. Ponúka ľahkú alternatívu k virtuálnym počítačom a umožňuje vývojárom využívať architektúry distribuovaných aplikácií. Pre dôkladný prehľad ekosystému Docker si pozrite tento článok.

Proces zostavenia aplikácie pomocou nástroja Docker začína tým, že vývojár vytvorí obraz (image) pre svoju aplikáciu. Potom sa tento obraz nasadí do kontajnera. Obraz obsahuje definujúce komponenty aplikácie, ako je kód aplikácie, knižnice, konfiguračné súbory, premenné prostredia a spustiteľné prostredie (runtime). Obraz štandardizuje prostredie vo vnútri kontajnera, čo kontajnerizácii dodáva vlastnosti prenosnosti. Node.js je open-source, multiplatformové backendové spustiteľné prostredie pre JavaScript, ktoré dokáže spúšťať kód JavaScriptu mimo webového prehliadača. Je postavené na V8 JavaScript Engine. Express.js je minimalistický backendový JavaScript framework, ktorý beží na platforme Node.js.

V tomto návode vytvoríme obraz pre webovú stránku, ktorá beží na frameworku Express. Použijeme Bootstrap, čo je frontendová knižnica, aby frontend vyzeral lepšie. Po vytvorení obrazu zostavíme kontajner a odošleme ho do Docker Hub. Docker Hub umožňuje vývojárom hostovať kontajnerizované aplikácie pre jednoduché nasadenie do akéhokoľvek prostredia Docker. Keď bude váš kontajner hostovaný na Docker Hub, stiahneme ho a zostavíme ďalší obraz, ktorý bude skutočne poskytovať našu webovú stránku.

Požiadavky

Toto bude praktický návod. Mali by ste si vytvoriť prostredie, ktoré vám umožní postupovať podľa neho.

Krok 1: Konfigurácia závislostí aplikácie

Pred vytvorením obrazu musíte vytvoriť zdrojový kód aplikácie. Zdrojový kód aplikácie zahŕňa kód, statický obsah a závislosti, ktoré sa skopírujú do kontajnera. Začnite vytvorením adresára pre váš projekt v domovskom adresári používateľa bez oprávnení root. Nazveme ho node_express, ale môžete použiť akýkoľvek názov adresára, ktorý sa vám páči:

Ďalej sa presuňte do tohto adresára:

Toto bude váš koreňový adresár aplikácie. Aplikácia node.js očakáva súbor package.json v koreňovom priečinku. Npm používa tento súbor na určenie toho, aké závislosti vaša aplikácia potrebuje. Zadajte nasledujúci príkaz na vytvorenie tohto súboru:

Potom do súboru pridajte nasledujúci úryvok kódu. Názov, autora, popis a vstupný súbor môžete upraviť podľa vlastného uváženia:

Ako môžete vidieť, tento súbor špecifikuje názov projektu, verziu, autora a licenciu, pod ktorou bude kód aplikácie zdieľaný. Odporúča sa použiť krátky a popisný názov pre váš projekt, aby ste sa vyhli duplicitám v npm registri. Pre projekt sme špecifikovali licenciu ISC, ktorá umožňuje bezplatné kopírovanie, upravovanie alebo distribúciu kódu aplikácie.

Čo je najdôležitejšie, mali by ste si všimnúť nasledujúce direktívy v súbore:

  • main“: táto direktíva špecifikuje vstupný bod aplikácie, ktorý sme nastavili ako index.js. Tento súbor vytvoríme o chvíľu.
  • dependencies“: táto direktíva špecifikuje závislosti aplikácie, ktoré sa stiahnu z registra npm, keď spustíme príkaz npm, v našom prípade chceme Express verzie 4.17.1 a vyššej.

Teraz môžete súbor uložiť stlačením Ctrl + O. Potom súbor zatvorte stlačením Ctrl + X. Ďalej nainštalujeme závislosti spustením nasledujúceho príkazu:

Tento príkaz nainštaluje závislosti aplikácie špecifikované v súbore package.json v adresári node_modules. Tie sa automaticky vytvorili pri prvom spustení príkazu. Po nainštalovaní závislostí našej aplikácie môžete začať pridávať kód aplikácie.

Krok 2: Pridanie súborov s kódom vašej aplikácie

Vytvoríme jednoduchú webovú stránku s receptami, vďaka allrecipes. Hlavným vstupným bodom pre aplikáciu je súbor index.js. Pridáme adresár views, ktorý bude obsahovať rôzne stránky a statické súbory projektu. Webová stránka bude mať úvodnú stránku (landing page), ktorá bude obsahovať úvodné informácie a odkazy na niektoré recepty.

Kód našej úvodnej stránky bude umiestnený v súbore home.html. Najprv vytvorte súbor index.js zadaním nasledujúceho príkazu:

Pridajte nasledujúci kód, ktorý importuje a vytvorí aplikáciu Express. Špecifikuje tiež objekt Router, základný adresár a port, na ktorom bude táto aplikácia bežať:

require je funkcia JavaScriptu, ktorá načítava modul. V tomto prípade načítavame modul express. Potom použijeme importovaný modul na vytvorenie objektov express a router. Objekt router vykonáva funkcie smerovania (routing) aplikácie tým, že reaguje na volania metód HTTP, ktoré budeme do tohto objektu pridávať v priebehu návodu.

Nastavili sme tiež path a port. Konštanta path definuje základný adresár pre kód. V našom prípade je to podadresár views vo vnútri koreňového adresára projektu. port špecifikuje port, na ktorom by mala aplikácia express počúvať, v našom príklade sme ho nastavili na 8090.

Keď máme konštanty, môžeme pre aplikáciu špecifikovať niektoré trasy (routes) pomocou objektu router. Pridajte nasledujúci kód do súboru index.js na špecifikovanie trás:

Môžete pridať middleware k trasám pomocou funkcie router.use. V tomto prípade pridáme funkciu, ktorá zaznamenáva požiadavky smerovača (routera) pred ich odovzdaním trasám aplikácie. Požiadavka GET na základňu aplikácie vráti home.html stránku. Potom sme pridali stránky pre tri recepty, ktoré sa tiež načítajú pomocou požiadavky GET na konkrétnu stránku receptu.

Nakoniec pridajte nasledujúci kód na pripojenie router middlewaru a statických prostriedkov aplikácie. Okrem toho povedzte aplikácii express, aby počúvala na porte 8090:

Váš kompletný súbor index.js by mal vyzerať takto:

Teraz môžete súbor uložiť a zatvoriť. Ďalším krokom je pridanie statických webových stránok do adresára views . Začnite zadaním nasledujúceho príkazu na vytvorenie adresára:

Zadaním nasledujúceho príkazu otvorte súbor úvodnej stránky home.html:

Do súboru pridajte nasledujúci kód. Kód importuje Bootstrap a ponúka návštevníkom webu informácie o tom, o čom celý web je:

Okrem importovania Bootstrapu stránka pridáva aj základné navigačné menu ktoré nám pomôže prechádzať stránkami a vrátiť sa späť na úvodnú stránku. Pridali sme tiež riadok na import nášho vlastného CSS súboru:

Tento súbor použijeme na neskoršie pridanie vlastného štýlu do aplikácie. Teraz vytvorme tri stránky pre recepty. Najprv začneme vytvorením stránky pre lasagne. Otvorte súbor v editore nano pomocou nasledujúceho príkazu:

Do otvoreného súboru pridajte nasledujúci kód. Tento súbor naimportuje Bootstrap, súbor custom.css, špecifikuje navigačné menu a ponúkne informácie o recepte na lasagne:

Poďme postupovať rovnako a vytvoriť súbor pre stránku s receptom na guacamole. Otvorte súbor pomocou nano spustením nasledujúceho príkazu:

Potom do súboru pridajte tento kód:

Na záver vytvorme súbor banana_bread.html zadaním príkazu:

Potom do súboru pridajte nasledujúci HTML kód:

Teraz sme vytvorili všetky stránky. Ak si pamätáte, máme pridať súbor css/custom.css. Na vytvorenie adresára zadajte nasledujúci príkaz:

Potom vytvorte a otvorte súbor v editore nano pomocou príkazu:

Môžete pridať ďalšie CSS kódy na úpravu štýlu vašej webstránky podľa vlastného uváženia. Pre stručnosť pridajme do súboru nasledujúci úryvok kódu:

Po dokončení súbor uložte a zatvorte.

Môžete spustiť aplikáciu, keďže teraz máme nainštalovaný zdrojový kód aplikácie a závislosti projektu.

We had set the app to listen on a port 8090, spustite nasledujúci príkaz, ktorým inštruujete firewall, aby povolil prevádzku cez tento port. Ak ste špecifikovali iný port, nahraďte číslo portu v príkaze:

Teraz môžete spustiť aplikáciu. Najprv sa však uistite, že sa nachádzate v koreňovom adresári projektu spustením nasledujúceho príkazu:

Spustite aplikáciu pomocou node index.js. Ak ste špecifikovali iný vstupný bod, nahraďte ho svojím vstupným bodom:

Ak vo svojom prehliadači prejdete na http://your_public_server_ip:8090, uvidíte úvodnú stránku receptov (Recipes), ako je definovaná:

Recipes

 

V navigácii môžete vidieť odkazy na rôzne recepty. Kliknime na niektoré. Nižšie máme stránku pre recept na Lasagne:

Node.js app install on Ubuntu 1

A tu máme stránku pre recept na Guacamole:

Guacamole

Do tohto bodu ste vytvorili svoju aplikáciu a otestovali, že funguje podľa očakávania. Server môžete ukončiť stlačením Ctrl + C a prejsť na vytvorenie Dockerfile. Súbory Dockerfile pomáhajú pri škálovateľnosti tým, že umožňujú v prípade potreby znova vytvoriť inštanciu aplikácie.

Krok 3: Vytvorenie súboru Dockerfile

Docker číta inštrukcie špecifikované v súbore Dockerfile pri zostavovaní obrazov. Špecifikuje runtime prostredie aplikácie. Vďaka tomu pomáha vývojárom vyhnúť sa nezrovnalostiam so závislosťami alebo meniacimi sa verziami runtime. Zadajte nasledujúci príkaz na vytvorenie súboru Dockerfile:

Docker obraz sa vytvára pomocou niekoľkých vrstiev obrazov, ktoré na seba nadväzujú. Začnete pridaním základného obrazu, ktorý tvorí východiskový bod pre aplikáciu.

Keďže aplikácia očakáva spustenie v prostredí node.js, začneme pridaním obrazu node:10-alpine pre node.js. V súčasnosti, keď píšeme tento návod, je to odporúčaná LTS verzia Node.js. Tento konkrétny obraz sme vybrali preto, že je odvodený od projektu Alpine Linux. Vďaka tomu pomôže udržať veľkosť nášho obrazu na minime. Na stránke Docker Hub Node images je k dispozícii niekoľko variantov obrazov, z ktorých si môžete vybrať podľa svojich potrieb.

Pridaním nasledujúceho kódu nastavte základný obraz aplikácie pomocou inštrukcie FROM:

Tento obraz obsahuje Node.js a npm. Každý Dockerfile musí začínať inštrukciou FROM. Docker obraz node predvolene obsahuje iného používateľa ako root s názvom node, ktorého môžete použiť na spustenie kontajnera aplikácie namiesto roota. Bezpečnostné odporúčania pre Docker odporúčajú nespúšťať kontajnery ako root a obmedziť privilégiá len na tie, ktoré sú potrebné na spustenie jeho prostriedkov.

V takom prípade budeme používať domovský adresár používateľa node ako pracovný adresár pre aplikáciu, ako aj samotného používateľa vo vnútri kontajnera. Viac informácií nájdete v tejto príručke najlepších postupov pre Docker Node obraz.

Vytvoríme podadresár node_modules v adresári /home/node spolu s adresárom app, čo pomôže zjednodušiť oprávnenia pre kód aplikácie. Vytvorenie týchto adresárov zabezpečí, že budú mať správne oprávnenia, keď vnútri kontajnerov lokálne spustíme príkaz npm install. Po vytvorení adresárov im musíte nastaviť vlastníctvo pre používateľa node. Urobíme to vo vnútri súboru Dockerfile pridaním nasledujúceho riadku:

Potom nastavíte pracovný adresár pridaním nasledujúceho riadku:

Je dobrým zvykom vždy nastaviť WORKDIR, aby ho Docker nemusel vytvárať predvolene.

Pridajte nasledujúci riadok na skopírovanie súborov package.json a package-lock.json:

Odporúča sa pridať inštrukciu COPY pred spustením npm install alebo kopírovaním zdrojového kódu aplikácie. To vám umožní využiť mechanizmus ukladania do vyrovnávacej pamäte (cache) Dockeru. Počas procesu zostavovania Docker kontroluje, či má pre každú inštrukciu uloženú vrstvu v cache. To znamená, že ak ste nezmenili súbor package.json, Docker použije existujúcu vrstvu obrazu a vyhne sa opätovnej inštalácii node modulov, čo urýchli proces zostavovania.

Pred spustením npm install, pridajte nasledujúci riadok na prepnutie používateľa na node, aby ste zabezpečili, že všetky súbory aplikácie a adresár node_modules budú vlastnené používateľom node (ktorý nie je root):

Náš kontajner je teraz pripravený na spustenie príkazu npm install. Pridajte do súboru Dockerfile nasledujúci riadok:

Po nainštalovaní node_modules pridajte nasledujúci riadok, ktorý povie Dockeru, aby skopíroval kód aplikácie do adresára aplikácie v kontajneri so správnymi oprávneniami a vlastníctvom, t. j. pre používateľa node (ktorý nie je root):

Posledným krokom je vystavenie portu 8090 na kontajneri, ako sme definovali v našom vstupnom súbore index.js:

EXPOSE určuje, ktoré porty na kontajneri budú otvorené počas behu. CMD spúšťa príkaz na spustenie aplikácie, v tomto prípade node index.js.

V Dockerfile by ste mali mať iba jeden príkaz CMD, pretože platnosť má iba ten posledný. Pozrite si referenčnú dokumentáciu k Dockerfile pre zoznam vecí, ktoré môžete s Dockerfile robiť.

Váš kompletný Dockerfile by mal vyzerať takto:

Teraz môžete súbor uložiť a zatvoriť.

Ďalšia vec, ktorú urobíte, je pridanie súboru .dockerignore. Podobne ako súbor .gitignore, aj .dockerignore určuje, ktoré súbory a adresáre v adresári projektu by sa nemali kopírovať do kontajnera.

Otvorte súbor v editore nano:

Do súboru pridajte nasledujúce riadky:

Ak pracujete s git repozitárom, mali by ste pridať aj adresár .git a súbor .gitignore. Súbor uložte a zatvorte.

Ak všetko prebehlo v poriadku, je čas zostaviť obraz aplikácie pomocou príkazu docker build. K príkazu –t môžete pridať príznak docker build, aby ste obraz označili ľahko zapamätateľným názvom namiesto náhodného reťazca, ktorý docker nastavuje predvolene. Obraz budeme tiež odosielať na Docker Hub, takže je najlepšie do značky zahrnúť vaše používateľské meno pre Docker Hub.

Ako názov značky použijeme nodejs-express-image as the tag name. You are free to choose a tag name that you like. Here is the command to build the image:

Nezabudnite nahradiť your_dockerhub_username vaším skutočným používateľským menom pre Docker Hub. Bodka (.) na konci určuje, že kontext zostavenia je aktuálny adresár.

Proces zostavenia trvá minútu alebo dve. Po dokončení zadajte príkaz na kontrolu vašich obrazov:

Mali by ste vidieť niečo takéto:

sudo docker images

Nezabudnite, že sme nahradili your_dockerhub_username skutočným používateľským menom.

Po potvrdení, že váš obraz bol zostavený, môžete teraz vytvoriť kontajner s týmto obrazom pomocou docker run. Zahrnuté budú nasledujúce príznaky:

  • -p: zverejní port na kontajneri a namapuje ho na port na hostiteľskom systéme. Na demonštračné účely použijeme port 80 na hostiteľskom systéme. Ak však na tomto porte beží iný proces, môžete to podľa potreby upraviť. Prečítajte si viac o väzbe portov v dokumentácii k Dockeru.
  • -d: pre odpojený režim (detached mode). Umožňuje kontajneru pokračovať v behu na pozadí.
  • --name: môžete použiť na nastavenie ľahko zapamätateľného názvu namiesto toho, aby Docker priradil náhodný reťazec.

Príkaz na zostavenie kontajnera je nasledujúci. Príslušne nahraďte svoje používateľské meno pre Docker Hub:

Počkajte, kým sa kontajner zostaví a spustí. Na kontrolu všetkých spustených kontajnerov môžete použiť tento príkaz:

Mali by ste vidieť výstup podobný nasledujúcemu:

Node.js app install on Ubuntu 3

Ako vidno na výstupe, kontajner teraz beží. Môžete si ho zobraziť v prehliadači, ak v prehliadači navštívite verejnú IP adresu vášho servera bez portu. Načíta sa vaša domovská stránka:

awesome recipe

 

Úspešne ste nasadili statickú webovú stránku Node Express pomocou Dockeru. Pozrime sa, ako môžeme tento obraz odoslať na Docker Hub pre budúce použitie a účely škálovania.

Krok 4: Práca s repozitármi obrazov Docker

Svoje obrazy môžete odoslať do registrov obrazov, ako je Docker Hub, a uložiť ich na budúce použitie, zdieľať ich s ostatnými vývojármi alebo umožniť škálovanie vašich kontajnerov. Obraz, ktorý sme vytvorili, môžeme odoslať do Docker Hubu a použiť ho na opätovné vytvorenie kontajnera.

Na prihlásenie do svojho účtu Docker Hub použite nasledujúci príkaz. Nahraďte ho svojím skutočným používateľským menom Docker Hub:

Po zobrazení výzvy zadajte svoje heslo. Po prihlásení sa vytvorí súbor ~/.docker/config.json v domovskom adresári vášho používateľa, ktorý obsahuje vaše prihlasovacie údaje pre Docker Hub.

Keď je to nastavené, zadajte nasledujúci príkaz na odoslanie obrazu do Docker Hubu, pričom uveďte značku (tag), ktorú ste nastavili pri zostavovaní obrazu predtým:

Tento príkaz odošle docker obraz do vášho účtu Docker Hub. Ak navštívite svoj účet, uvidíte svoj nedávno odoslaný obraz:

Docker Hub

Užitočnosť repozitára obrazov môžeme otestovať tak, že zničíme aktuálny kontajner aplikácie a znova ho zostavíme pomocou obrazu v repozitári.

Zoznam vašich aktuálnych kontajnerov zobrazíte zadaním príkazu:

Mali by ste vidieť výstup podobný tomuto:

Docker Hub

Poznačte si CONTAINER ID uvedené vo vašom výstupe, skopírujte ho a použite ho na zastavenie kontajnera pomocou príkazu, pričom nahraďte ID svojím vlastným:

Zadaním nasledujúceho príkazu zobrazíte zoznam všetkých docker obrazov dostupných vo vašom systéme:

Výstup zobrazí názov vášho obrazu, obraz node.js a ďalšie obrazy z procesu zostavovania.

Zadaním nasledujúceho príkazu odstránite obrazy, vrátane nepoužívaných alebo visiacich (dangling) obrazov:

Napíšte y na potvrdenie. Týmto sa odstránia zastavené kontajnery a obrazy. Ak ich vypíšete, vo výstupe uvidíte prázdny zoznam:

output

Teraz ste odstránili kontajner, v ktorom beží aplikácia, aj samotný obraz. Prečítajte si viac o odstraňovaní Docker kontajnerov, obrazov a zväzkov v našom návode.

Celý proces teraz môžeme zopakovať tak, že najprv stiahneme obraz z Docker Hubu pomocou nasledujúceho príkazu. Nahraďte svoje používateľské meno Docker Hub príslušným spôsobom:

Znova vypíšte svoje Docker obrazy pomocou príkazu:

Vo výstupe by ste mali vidieť obraz:

sudo docker

Teraz môžete znova zostaviť svoj kontajner pomocou príkazu z Kroku 3. Samozrejme, nahraďte svoje používateľské meno Docker Hub tam, kde je to potrebné:

Vypíšte svoje kontajnery, aby ste potvrdili, že bol znova zostavený:

Mali by ste vidieť podobný výstup:

Vo svojom prehliadači prejdite na verejnú IP adresu vášho servera a mali by ste vidieť spustenú aplikáciu.

Záver

Ak ste postupovali podľa návodu až do tohto bodu, teraz máte statickú webovú stránku vytvorenú pomocou Express a Bootstrap a nasadenú pomocou Dockeru. Súbory statickej webovej stránky ste použili na zostavenie Docker obrazu a tento obraz ste použili na vytvorenie kontajnera. Potom ste obraz odoslali do registra Docker obrazov, Docker Hub, vďaka čomu je k dispozícii na budúce použitie alebo škálovanie. Aby ste otestovali použitie registra obrazov, zničili ste obrazy a kontajnery, stiahli obrazy z registra a znova zostavili kontajnery.

Tento návod vysvetlil, ako nasadiť aplikáciu Node.js. Ak by ste sa chceli dozvedieť, ako používať iný balík pre vývoj webových aplikácií, máme návod na Nasadenie aplikácie Laravel pomocou Docker Compose na Nginx.

Ďalšie zdroje o využití Dockeru nájdete v nasledujúcich návodoch:

Príjemnú prácu s počítačom!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.