Ú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.
- Mali by ste mať nainštalované Ubuntu 20.04 ako vaše počiatočné operačné prostredie a vytvoriť používateľa bez oprávnení root s privilégiami sudo. Prihláste sa ako používateľ bez oprávnení root a pokračujte nasledujúcimi krokmi.
- Musíte si nainštalovať Docker. Postupujte podľa krokov 1, 2, 3 a 4 v našom návode na ako nainštalovať a prevádzkovať Docker na Ubuntu. Toto by malo fungovať pre akúkoľvek distribúciu Ubuntu.
- Vytvorte si účet na Docker Hub, ak ho ešte nemáte. Môžete použiť tento odkaz na Rýchly sprievodca pre Docker Hub.
- Nainštalujte Node.js a NPM. NPM je správca balíkov pre JavaScript. Môžete postupovať podľa týchto pokynov na inštaláciu Node a npm.
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:
|
1 |
mkdir node_express |
Ďalej sa presuňte do tohto adresára:
|
1 |
cd node_express |
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:
|
1 |
nano package.json |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "name": "node-express-docker-image", "version": "1.0.0", "description": "Nodejs Express Docker Image Example", "author": "hackins", "main": "index.js", "license": "ISC", "keywords": [ "nodejs", "express", "bootstrap" ], "dependencies": { "express": "^4.17.1" } } |
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íkaznpm, 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:
|
1 |
npm install |
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:
|
1 |
nano index.js |
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ť:
|
1 2 3 4 5 6 |
const express = require('express'); const app = express(); const router = express.Router(); const path = __dirname + '/views/'; const port = 8090; |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
router.use(function (req,res,next) { console.log('/' + req.method); next(); }); router.get('/', function(req,res){ res.sendFile(path + 'home.html'); }); router.get('/lasagna', function(req,res){ res.sendFile(path + 'lasagna.html'); }); router.get('/guacamole', function(req,res){ res.sendFile(path + 'guacamole.html'); }); router.get('/banana-bread', function(req,res){ res.sendFile(path + 'banana_bread.html'); }); |
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:
|
1 2 3 4 5 6 |
app.use(express.static(path)); app.use('/', router); app.listen(port, function () { console.log('Nodejs Express Example App listening on port ' + port) }) |
Váš kompletný súbor index.js by mal vyzerať takto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const express = require('express'); const app = express(); const router = express.Router(); const path = __dirname + '/views/'; const port = 8090; router.use(function (req,res,next) { console.log('/' + req.method); next(); }); router.get('/', function(req,res){ res.sendFile(path + 'home.html'); }); router.get('/lasagna', function(req,res){ res.sendFile(path + 'lasagna.html'); }); router.get('/guacamole', function(req,res){ res.sendFile(path + 'guacamole.html'); }); router.get('/banana-bread', function(req,res){ res.sendFile(path + 'banana_bread.html'); }); app.use(express.static(path)); app.use('/', router); app.listen(port, function () { console.log('Nodejs Express Example App listening on port ' + port) }) |
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:
|
1 |
mkdir views |
Zadaním nasledujúceho príkazu otvorte súbor úvodnej stránky home.html:
|
1 |
nano views/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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<!DOCTYPE html> <html lang="sk"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton a prispievatelia Bootstrap"> <meta name="generator" content="Hugo 0.80.0"> <title>Skvelé recepty</title> <!-- Základný CSS pre Bootstrap --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Prepnúť navigáciu</span> </button> <a class="navbar-brand" href="#">Skvelé recepty</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Domov</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lasagne</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Banánový chlebík</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">Úžasný recept</h1> <p class="lead text-muted"> Nájdite a zdieľajte každodennú inšpiráciu na varenie z týchto úžasných receptov. Objavte recepty, kuchárov, videá a návody na základe jedla, ktoré milujete, a priateľov, ktorých sledujete. <br /> <em>(Nič vážne, toto je len pre našu demo aplikáciu node-express-docker)</em> </p> </div> </div> </section> </main> </body> </html> |
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:
|
1 |
<link href="css/custom.css" rel="stylesheet"> |
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:
|
1 |
nano views/lasagna.html |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<!DOCTYPE html> <html lang="sk"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton a prispievatelia Bootstrap"> <meta name="generator" content="Hugo 0.80.0"> <title>Recept na lasagne</title> <!-- Hlavný CSS pre Bootstrap --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Prepnúť navigáciu</span> </button> <a class="navbar-brand" href="#">Úžasné recepty</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Domov</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lasagne</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Banánový chlebík</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">Najlepší recept na lasagne</h1> <p class="lead text-muted"> Toto sú tie najlepšie lasagne, aké kedy pripravíte. <br /> <em>(Nič vážne, toto je len pre našu ukážkovú aplikáciu s obrazom node-express-docker)</em> </p> <h3>Ingrediencie</h3> <ul class="list-group"> <li class="list-group-item">1 libra sladkej talianskej klobásy</li> <li class="list-group-item">¾ libry chudého mletého hovädzieho mäsa</li> <li class="list-group-item">½ hrnčeka nadrobno nakrájanej cibule</li> <li class="list-group-item">2 strúčiky cesnaku, pretlačené</li> <li class="list-group-item">1 (28-uncová) konzerva drvených paradajok</li> <li class="list-group-item">2 (6-uncové) konzervy paradajkového pretlaku</li> <li class="list-group-item">2 (6,5-uncové) konzervy paradajkovej omáčky</li> <li class="list-group-item">½ hrnčeka vody</li> <li class="list-group-item">2 polievkové lyžice bieleho cukru</li> <li class="list-group-item">1 ½ čajovej lyžičky sušených lístkov bazalky</li> <li class="list-group-item">½ čajovej lyžičky feniklových semienok</li> <li class="list-group-item">1 čajová lyžička talianskeho korenia</li> <li class="list-group-item">1 ½ čajovej lyžičky soli, rozdelenej, alebo podľa chuti</li> <li class="list-group-item">¼ čajovej lyžičky mletého čierneho korenia</li> <li class="list-group-item">4 polievkové lyžice nasekanej čerstvej petržlenovej vňate</li> <li class="list-group-item">12 plátkov lasagní</li> <li class="list-group-item">16 uncí syra ricotta</li> <li class="list-group-item">1 vajce</li> <li class="list-group-item">¾ libry syra mozzarella, nakrájaného na plátky</li> <li class="list-group-item">¾ hrnčeka nastrúhaného parmezánu</li> </ul> </div> </div> </section> </main> </body> </html> |
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:
|
1 |
nano views/guacamole.html |
Potom do súboru pridajte tento kód:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<!DOCTYPE html> <html lang="sk"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Hugo 0.80.0"> <title>Recept na guacamole</title> <!-- Hlavné CSS pre Bootstrap --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Prepnúť navigáciu</span> </button> <a class="navbar-brand" href="#">Skvelé recepty</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Domov</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lasagne</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Banánový chlebík</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">Najlepší recept na guacamole</h1> <p class="lead text-muted"> Tento avokádový šalát môžete pripraviť hladký alebo s kúskami, v závislosti od vašej chuti. <br /> <em>(Nič vážne, toto je len pre našu demo aplikáciu s node-express-docker obrazom)</em> </p> <h3>Ingrediencie</h3> <ul class="list-group"> <li class="list-group-item">3 avokáda – ošúpané, odkôstkované a roztlačené</li> <li class="list-group-item">1 limetka, odšťavená</li> <li class="list-group-item">1 čajová lyžička soli</li> <li class="list-group-item">½ hrnčeka nadrobno nakrájanej cibule</li> <li class="list-group-item">3 polievkové lyžice nasekaného čerstvého koriandra</li> <li class="list-group-item">2 paradajky roma (slivkové), nakrájané na kocky</li> <li class="list-group-item">1 čajová lyžička prelisovaného cesnaku</li> <li class="list-group-item">1 štipka mletého kajenského korenia (voliteľné)</li> </ul> </div> </div> </section> </main> </body> </html> |
Na záver vytvorme súbor banana_bread.html zadaním príkazu:
|
1 |
nano views/banana_bread.html |
Potom do súboru pridajte nasledujúci HTML kód:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<!DOCTYPE html> <html lang="sk"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Hugo 0.80.0"> <title>Recept na banánový chlebík</title> <!-- Hlavné CSS pre Bootstrap --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Prepnúť navigáciu</span> </button> <a class="navbar-brand" href="#">Úžasné recepty</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Domov</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lasagne</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Banánový chlebík</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">Najlepší recept na banánový chlebík</h1> <p class="lead text-muted"> Prečo robiť kompromisy v banánovej chuti? Tento banánový chlebík je vláčny a lahodný s množstvom banánovej chuti! Priatelia a rodina milujú môj recept a hovoria, že je zaručene najlepší! Je úžasný opečený!! Dobrú chuť! <br /> <em>(Nič vážne, toto je len pre našu demo aplikáciu s node-express-docker obrazom)</em> </p> <h3>Ingrediencie</h3> <ul class="list-group"> <li class="list-group-item">2 hrnčeky hladkej múky</li> <li class="list-group-item">1 čajová lyžička sódy bikarbóny</li> <li class="list-group-item">¼ čajovej lyžičky soli</li> <li class="list-group-item">½ hrnčeka masla</li> <li class="list-group-item">¾ hrnčeka hnedého cukru</li> <li class="list-group-item">2 rozšľahané vajcia</li> <li class="list-group-item">2⅓ hrnčeka roztlačených prezretých banánov</li> </ul> </div> </div> </section> </main> </body> </html> |
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:
|
1 |
mkdir views/css |
Potom vytvorte a otvorte súbor v editore nano pomocou príkazu:
|
1 |
nano views/css/custom.css |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.bd-placeholder-img { font-size: 1.125rem; text-anchor: middle; -webkit-user-select: none; -moz-user-select: none; user-select: none; } @media (min-width: 768px) { .bd-placeholder-img-lg { font-size: 3.5rem; } } |
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:
|
1 |
sudo ufw allow 8090 |
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:
|
1 |
cd ~/node_express |
Spustite aplikáciu pomocou node index.js. Ak ste špecifikovali iný vstupný bod, nahraďte ho svojím vstupným bodom:
|
1 |
node index.js |
Ak vo svojom prehliadači prejdete na http://your_public_server_ip:8090, uvidíte úvodnú stránku receptov (Recipes), ako je definovaná:
V navigácii môžete vidieť odkazy na rôzne recepty. Kliknime na niektoré. Nižšie máme stránku pre recept na Lasagne:
A tu máme stránku pre recept na 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:
|
1 |
nano 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:
|
1 |
FROM node:10-alpine |
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:
|
1 |
mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app |
Potom nastavíte pracovný adresár pridaním nasledujúceho riadku:
|
1 |
WORKDIR /home/node/app |
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:
|
1 |
COPY package*.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):
|
1 |
USER node |
Náš kontajner je teraz pripravený na spustenie príkazu npm install. Pridajte do súboru Dockerfile nasledujúci riadok:
|
1 |
RUN npm install |
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):
|
1 |
COPY --chown=node:node . . |
Posledným krokom je vystavenie portu 8090 na kontajneri, ako sme definovali v našom vstupnom súbore index.js:
|
1 2 |
EXPOSE 8090 CMD [ "node", "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:
|
1 2 3 4 5 6 7 8 9 |
FROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ USER node RUN npm install COPY --chown=node:node . . EXPOSE 8090 CMD [ "node", "index.js" ] |
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:
|
1 |
nano .dockerignore |
Do súboru pridajte nasledujúce riadky:
|
1 2 3 4 |
node_modules npm-debug.log Dockerfile .dockerignore |
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:
|
1 |
sudo docker build -t your_dockerhub_username/nodejs-express-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:
|
1 |
sudo docker images |
Mali by ste vidieť niečo takéto:
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:
|
1 |
sudo docker run --name nodejs-express-image -p 80:8090 -d your_dockerhub_username/nodejs-express-image |
Počkajte, kým sa kontajner zostaví a spustí. Na kontrolu všetkých spustených kontajnerov môžete použiť tento príkaz:
|
1 |
sudo docker ps |
Mali by ste vidieť výstup podobný nasledujúcemu:
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:
Ú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:
|
1 |
sudo docker login -u your_dockerhub_username |
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:
|
1 |
sudo docker push your_dockerhub_username/nodejs-express-image |
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:
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:
|
1 |
sudo docker ps |
Mali by ste vidieť výstup podobný tomuto:
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:
|
1 |
sudo docker stop 1bb2d65279bb |
Zadaním nasledujúceho príkazu zobrazíte zoznam všetkých docker obrazov dostupných vo vašom systéme:
|
1 |
sudo docker images –a |
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:
|
1 |
sudo docker system prune |
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:
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:
|
1 |
sudo docker pull your_dockerhub_username/nodejs-express-image |
Znova vypíšte svoje Docker obrazy pomocou príkazu:
|
1 |
sudo docker images |
Vo výstupe by ste mali vidieť obraz:
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é:
|
1 |
sudo docker run --name nodejs-express-image -p 80:8090 -d your_dockerhub_username/nodejs-express-image |
Vypíšte svoje kontajnery, aby ste potvrdili, že bol znova zostavený:
|
1 |
sudo docker ps |
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:
- Ako nainštalovať a nakonfigurovať Docker Compose na Ubuntu 20.04
- Ako zdieľať dáta medzi Docker kontajnerom a hostiteľom
- Inštalácia a nastavenie Docker na CentOS 7
Príjemnú prácu s počítačom!











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