{"id":141,"date":"2026-05-15T18:09:07","date_gmt":"2026-05-15T16:09:07","guid":{"rendered":"https:\/\/gorankostic.com\/blog\/?p=141"},"modified":"2026-05-15T18:09:07","modified_gmt":"2026-05-15T16:09:07","slug":"containerized-node-js-apps","status":"publish","type":"post","link":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/","title":{"rendered":"Containerized Node.js Apps"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Containerized Node.js Apps<\/h1>\n\n\n\n<p><strong>Odlomak: <\/strong><br>Containerized Node.js app omogu\u0107ava da se aplikacija pokre\u0107e u kontrolisanom okru\u017eenju, sa jasno definisanim verzijama, dependency-jima, portovima, environment promenljivama i deployment logikom.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Containerized Node.js Apps<\/h2>\n\n\n\n<p>Containerized Node.js app zna\u010di da se Node aplikacija ne oslanja direktno na globalna pode\u0161avanja servera, ve\u0107 radi unutar Docker container-a. Time se smanjuje razlika izme\u0111u lokalnog razvoja, test okru\u017eenja i produkcije.<\/p>\n\n\n\n<p>Jedna od najve\u0107ih prednosti je kontrola verzije Node.js runtime-a. Umesto da server globalno koristi jednu verziju Node-a za sve projekte, svaka aplikacija mo\u017ee imati svoju definisanu verziju kroz Docker image. To smanjuje rizik da update jednog sistema pokvari drugi projekat.<\/p>\n\n\n\n<p>Dependency management je tako\u0111e \u010distiji. <code>package.json<\/code>, lock fajl i Docker build proces jasno defini\u0161u \u0161ta aplikacija koristi. Kada se container izgradi, dependency-ji su deo kontrolisanog procesa, a ne rezultat ru\u010dnih komandi izvr\u0161enih nekada ranije na serveru.<\/p>\n\n\n\n<p>Portovi postaju precizno mapirani. Node aplikacija mo\u017ee slu\u0161ati interni port, na primer <code>3000<\/code>, dok reverse proxy spolja rutira domen ili subdomen ka tom container-u. Tako vi\u0161e Node aplikacija mo\u017ee raditi na istom serveru bez direktnog konflikta.<\/p>\n\n\n\n<p>Environment promenljive su klju\u010dne. API klju\u010devi, database URL-ovi, secret-i, portovi, webhook URL-ovi i production\/dev pode\u0161avanja ne treba da budu hardcode-ovani u aplikaciji. Docker omogu\u0107ava da se ti podaci unesu kroz <code>.env<\/code> fajl ili kroz compose konfiguraciju.<\/p>\n\n\n\n<p>Kod Node aplikacija posebno je va\u017eno pravilno re\u0161iti restart pona\u0161anje. Ako aplikacija pukne zbog gre\u0161ke, container treba da ima definisanu restart politiku. To ne zamenjuje debugging, ali spre\u010dava da servis ostane uga\u0161en zbog kratkotrajnog problema.<\/p>\n\n\n\n<p>Logovi moraju biti dostupni i \u010ditljivi. Docker olak\u0161ava pregled logova po container-u, \u0161to je korisno kada vi\u0161e servisa radi na istom serveru. Kod produkcionih Node aplikacija treba paziti da logovi ne rastu nekontrolisano i da ne zatrpaju disk.<\/p>\n\n\n\n<p>Build proces treba da bude jednostavan i ponovljiv. Idealno je da deployment ne zavisi od niza ru\u010dnih koraka, ve\u0107 od jasne komande koja povu\u010de kod, izgradi image i podigne container. To smanjuje gre\u0161ke i ubrzava odr\u017eavanje.<\/p>\n\n\n\n<p>Ako aplikacija koristi upload-e, cache, generated files ili lokalnu bazu, persistent storage mora biti pa\u017eljivo definisan. Container sam po sebi nije mesto za trajne podatke. Sve \u0161to mora da pre\u017eivi rebuild ili restart treba da bude u volume-u ili eksternom servisu.<\/p>\n\n\n\n<p>Dobro containerizovana Node.js aplikacija je lak\u0161a za deploy, izolovana od ostatka servera i spremnija za stabilan produkcioni rad. Kada su image, environment, portovi, logovi, restart politika i persistent storage pravilno pode\u0161eni, Node app postaje deo pouzdanog web stack-a, a ne ru\u010dno odr\u017eavan servis na serveru.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Containerized Node.js app omogu\u0107ava da se aplikacija pokre\u0107e u kontrolisanom okru\u017eenju, sa jasno definisanim verzijama, dependency-jima, portovima, environment promenljivama i deployment logikom. Containerized Node.js [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,6],"tags":[],"class_list":["post-141","post","type-post","status-publish","format-standard","hentry","category-docker-environments","category-infrastructure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.5 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Containerized Node.js Apps - Goran Kostic Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Containerized Node.js Apps\" \/>\n<meta property=\"og:description\" content=\"Containerized Node.js app omogu\u0107ava da se aplikacija pokre\u0107e u kontrolisanom okru\u017eenju, sa jasno definisanim verzijama, dependency-jima, portovima, environment promenljivama i deployment logikom. Containerized Node.js [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/\" \/>\n<meta property=\"og:site_name\" content=\"Goran Kostic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-15T16:09:07+00:00\" \/>\n<meta name=\"author\" content=\"WebixDesign\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"WebixDesign\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/\"},\"author\":{\"name\":\"WebixDesign\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0f800bfa90359ff9d2204020d58099c8\"},\"headline\":\"Containerized Node.js Apps\",\"datePublished\":\"2026-05-15T16:09:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/\"},\"wordCount\":450,\"commentCount\":0,\"articleSection\":[\"Docker Environments\",\"INFRASTRUCTURE\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/\",\"url\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/\",\"name\":\"Containerized Node.js Apps - Goran Kostic Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-05-15T16:09:07+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0f800bfa90359ff9d2204020d58099c8\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/2026\\\/05\\\/15\\\/containerized-node-js-apps\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Containerized Node.js Apps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/\",\"name\":\"Goran Kostic Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0f800bfa90359ff9d2204020d58099c8\",\"name\":\"WebixDesign\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g\",\"caption\":\"WebixDesign\"},\"sameAs\":[\"https:\\\/\\\/gorankostic.com\\\/blog\"],\"url\":\"https:\\\/\\\/gorankostic.com\\\/blog\\\/author\\\/webixdesign\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Containerized Node.js Apps - Goran Kostic Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/","og_locale":"en_US","og_type":"article","og_title":"Containerized Node.js Apps","og_description":"Containerized Node.js app omogu\u0107ava da se aplikacija pokre\u0107e u kontrolisanom okru\u017eenju, sa jasno definisanim verzijama, dependency-jima, portovima, environment promenljivama i deployment logikom. Containerized Node.js [&hellip;]","og_url":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/","og_site_name":"Goran Kostic Blog","article_published_time":"2026-05-15T16:09:07+00:00","author":"WebixDesign","twitter_card":"summary_large_image","twitter_misc":{"Written by":"WebixDesign","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/#article","isPartOf":{"@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/"},"author":{"name":"WebixDesign","@id":"https:\/\/gorankostic.com\/blog\/#\/schema\/person\/0f800bfa90359ff9d2204020d58099c8"},"headline":"Containerized Node.js Apps","datePublished":"2026-05-15T16:09:07+00:00","mainEntityOfPage":{"@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/"},"wordCount":450,"commentCount":0,"articleSection":["Docker Environments","INFRASTRUCTURE"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/","url":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/","name":"Containerized Node.js Apps - Goran Kostic Blog","isPartOf":{"@id":"https:\/\/gorankostic.com\/blog\/#website"},"datePublished":"2026-05-15T16:09:07+00:00","author":{"@id":"https:\/\/gorankostic.com\/blog\/#\/schema\/person\/0f800bfa90359ff9d2204020d58099c8"},"breadcrumb":{"@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gorankostic.com\/blog\/2026\/05\/15\/containerized-node-js-apps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gorankostic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Containerized Node.js Apps"}]},{"@type":"WebSite","@id":"https:\/\/gorankostic.com\/blog\/#website","url":"https:\/\/gorankostic.com\/blog\/","name":"Goran Kostic Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gorankostic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/gorankostic.com\/blog\/#\/schema\/person\/0f800bfa90359ff9d2204020d58099c8","name":"WebixDesign","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b4c4d73af3b6d4c23d5191555e82cdc78a86604f69eae8d2c3d23e45d3967c5?s=96&d=mm&r=g","caption":"WebixDesign"},"sameAs":["https:\/\/gorankostic.com\/blog"],"url":"https:\/\/gorankostic.com\/blog\/author\/webixdesign\/"}]}},"_links":{"self":[{"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/posts\/141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/comments?post=141"}],"version-history":[{"count":1,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions"}],"predecessor-version":[{"id":142,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions\/142"}],"wp:attachment":[{"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/media?parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/categories?post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gorankostic.com\/blog\/wp-json\/wp\/v2\/tags?post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}