{"id":415078,"date":"2022-03-12T14:00:29","date_gmt":"2022-03-12T11:00:29","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/"},"modified":"2022-03-12T14:00:29","modified_gmt":"2022-03-12T11:00:29","slug":"how-to-dockerize-a-node-js-web-app-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/","title":{"rendered":"#How to Dockerize a Node.js Web App \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a2f5bc44065d\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a2f5bc44065d\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#%E2%80%9CHow_to_Dockerize_a_Nodejs_Web_App_%E2%80%93_CloudSavvy_IT%E2%80%9D\" >&#8220;How to Dockerize a Node.js Web App \u2013 CloudSavvy IT&#8221;<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Creating_Your_Node_Project\" >Creating Your Node Project<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Writing_a_Dockerfile\" >Writing a Dockerfile<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Installing_Dependencies\" >Installing Dependencies<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Copying_Application_Code\" >Copying Application Code<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Setting_the_Images_Command\" >Setting the Image\u2019s Command<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Building_Your_Image\" >Building Your Image<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Build_Optimization\" >Build Optimization<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Starting_a_Container\" >Starting a Container<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-dockerize-a-node-js-web-app-cloudsavvy-it\/#Summary\" >Summary<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"%E2%80%9CHow_to_Dockerize_a_Nodejs_Web_App_%E2%80%93_CloudSavvy_IT%E2%80%9D\"><\/span>&#8220;How to Dockerize a Node.js Web App \u2013 CloudSavvy IT&#8221;<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-15530\" data-pagespeed-lazy-srcset=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/886260ee.jpeg?width=398&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 400w, https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/886260ee.jpeg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 1200w\" sizes=\"auto, 400w, 1200w\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/886260ee.jpeg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"1202\" height=\"677\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Docker is a containerization platform that simplifies the packaging and execution of <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a>lications. Containers run as isolated processes with their own filesystem but share their host\u2019s kernel. Docker has risen to prominence as a way of implementing reproducible development environments and distributed deployment architectures.<\/p>\n<p>Node.js is the leading JavaScript runtime for backend development. Successfully launching a Node.js web service requires you to have an environment with the runtime installed, your application code available, and a mechanism that handles automatic restarts in case of a crash.<\/p>\n<p>In this guide we\u2019ll use Docker to containerize a simple Node.js app created with the popular <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/expressjs.com\">Express<\/a> web framework. Docker is a good way to deploy Node-based systems as it produces a consistent environment that includes everything you need to run your service. The Docker daemon has integrated support for restarting failed containers when their foreground process crashes, solving one of the challenges of Node.js deployments.<\/p>\n<h2 id=\"creating-your-node-project\"><span class=\"ez-toc-section\" id=\"Creating_Your_Node_Project\"><\/span>Creating Your Node Project<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>We\u2019ll skip the details of implementing your application. Create a directory for your project and add some server code inside it. Here\u2019s a basic <code>app.js<\/code> that listens on port 8080 and responds to every request with a hardcoded response:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"javascript\">\n<pre class=\"de1\"><span class=\"kw1\">const<\/span> express <span class=\"sy0\">=<\/span> require<span class=\"br0\">(<\/span><span class=\"st0\">\"express\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"kw1\">const<\/span> app <span class=\"sy0\">=<\/span> express<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\napp.<span class=\"kw1\">get<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"*\"<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">(<\/span>req<span class=\"sy0\">,<\/span> res<span class=\"br0\">)<\/span> <span class=\"sy0\">=&gt;<\/span> res.<span class=\"me1\">send<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"&lt;p&gt;It works!&lt;\/p&gt;\"<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\napp.<span class=\"me1\">listen<\/span><span class=\"br0\">(<\/span><span class=\"nu0\">8080<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">=&gt;<\/span> console.<span class=\"me1\">log<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Listening on 8080\"<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Add Express to your project using npm:<\/p>\n<pre>npm init&#13;\nnpm install --save express<\/pre>\n<p>Start your app to test it works:<\/p>\n<pre>node app.js<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15539\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/90416d64.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"961\" height=\"103\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>You should be able to visit <code>localhost:8080<\/code> in your browser to see the sample response.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15542\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/1f9ccca5.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"960\" height=\"540\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<h2 id=\"writing-a-dockerfile\"><span class=\"ez-toc-section\" id=\"Writing_a_Dockerfile\"><\/span>Writing a Dockerfile<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Now it\u2019s time to start Dockerizing your project. First you need an image for your application. Images encapsulate your code and dependencies as a single package that you use to start container instances. The instructions in your Dockerfile define the state of your containers\u2019 initial filesystem.<\/p>\n<p>Here\u2019s a Dockerfile that works for the sample application:<\/p>\n<pre>FROM node:16&#13;\nWORKDIR \/app&#13;\n&#13;\nCOPY package.json .&#13;\nCOPY package-lock.json .&#13;\nRUN npm ci&#13;\n&#13;\nCOPY app.js .&#13;\nCMD [\"app.js\"]<\/pre>\n<p>This Dockerfile selects the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/hub.docker.com\/_\/node\">official Node.js Docker image<\/a> as its base via the <code>FROM<\/code> statement. The image inherits everything in the base, then adds additional content via the following instructions.<\/p>\n<p>The working directory is set to <code>\/app<\/code> by the <code>WORKDIR<\/code> line. The following <code>COPY<\/code> statements will deposit files into the <code>\/app<\/code> directory inside the container image.<\/p>\n<h3 id=\"installing-dependencies\"><span class=\"ez-toc-section\" id=\"Installing_Dependencies\"><\/span>Installing Dependencies<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The next stage is to add npm\u2019s <code>package.json<\/code> and run <code>npm ci<\/code>. This will install your project\u2019s npm dependencies \u2013 Express in this case \u2013 within the container\u2019s filesystem.<\/p>\n<p>Don\u2019t use <code>COPY node_modules\/ .<\/code> to copy the existing <code>node_modules<\/code> folder in your project directory \u2013 this would prevent you from reusing the Dockerfile in other build environments. Dockerfiles should let you create consistent builds with just the content of your source control repository. If a file or folder\u2019s in your <code>.gitignore<\/code>, it shouldn\u2019t be referenced in a Dockerfile <code>COPY<\/code> instruction.<\/p>\n<h3 id=\"copying-application-code\"><span class=\"ez-toc-section\" id=\"Copying_Application_Code\"><\/span>Copying Application Code<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>After <code>npm ci<\/code> has run, your app\u2019s code is copied into the image. The placement of this <code>COPY<\/code> instruction after the <code>RUN<\/code>, separating it from the previous copies, is deliberate. Each instruction creates a new layer in your image; Docker\u2019s build process caches each layer to accelerate subsequent builds. Once the content of one layer changes, the cache of all following layers will be invalidated.<\/p>\n<p>This is why application code should be copied in after <code>npm ci<\/code> has been executed. The code will usually change much more frequently than the content of your npm lockfile. Image rebuilds that only involve code changes will effectively skip the <code>RUN npm ci<\/code> stage (and all earlier stages), drastically accelerating the process when you\u2019ve got a lot of dependencies.<\/p>\n<h3 id=\"setting-the-images-command\"><span class=\"ez-toc-section\" id=\"Setting_the_Images_Command\"><\/span>Setting the Image\u2019s Command<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The final Dockerfile stage uses the <code>CMD<\/code> instruction to run your app automatically when the container starts. This works because the Node.js base image is configured to use the <code>node<\/code> process as its entrypoint. The <code>CMD<\/code> is appended to the inherited entrypoint, resulting in <code>node app.js<\/code> being run as the foreground process for your new image.<\/p>\n<h2 id=\"building-your-image\"><span class=\"ez-toc-section\" id=\"Building_Your_Image\"><\/span>Building Your Image<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Next you need to build your image:<\/p>\n<pre>docker build -t node-app:latest .<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15540\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/fcb27414.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"750\" height=\"368\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Docker will take the <code>Dockerfile<\/code> in your working directory, run the instructions within it, and tag the resulting image as <code>node-app:latest<\/code>. The final <code>.<\/code> (period) specifies your working directory as the image build context. This determines the paths that can be referenced by the <code>COPY<\/code> instructions in your Dockerfile.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Build_Optimization\"><\/span>Build Optimization<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>One way to improve build performance is to add a <code>.dockerignore<\/code> file to the root of your project. Give the file the following content:<\/p>\n<pre>node_modules\/<\/pre>\n<p>This file defines paths in your working directory that will <em>not<\/em> be included in the build context. You won\u2019t be able to reference them inside your Dockerfile. In the case of <code>node_modules<\/code>, this directory\u2019s content is irrelevant to the build as we\u2019re installing the dependencies anew via the <code>RUN npm ci<\/code> instruction. Specifically excluding the <code>node_modules<\/code> already present in your working directory saves having to copy all those files into Docker\u2019s temporary build context location. This increases efficiency and reduces the time spent preparing the build.<\/p>\n<h2 id=\"starting-a-container\"><span class=\"ez-toc-section\" id=\"Starting_a_Container\"><\/span>Starting a Container<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>At this point you\u2019re ready to run your application using Docker:<\/p>\n<pre>docker run -d \\&#13;\n    -p 8080:8080 \\&#13;\n    --name my-app \\&#13;\n    --restart on-failure \\&#13;\n    node-app:latest<\/pre>\n<p>The <code>docker run<\/code> command is used to start a new container instance from a specified image. A few extra flags are added to properly configure the container for the intended use case:<\/p>\n<ul>\n<li><code>-d<\/code> \u2013 Detaches your shell from the container\u2019s foreground process, effectively running it as a background server.<\/li>\n<li><code>-p<\/code> \u2013 Binds port 8080 on your host to port 8080 inside the container (which our Express sample app was configured to listen on). This means traffic to <code>localhost:8080<\/code> will be passed through to the corresponding container port. You can change the host post to a different value by modifying the first part of the bind definition, such as <code>8100:8080<\/code> to access your container on <code>localhost:8100<\/code>.<\/li>\n<li><code>--name<\/code> \u2013 Assigns the container a friendly name which you can use to reference it in other Docker CLI commands.<\/li>\n<li><code>--restart<\/code> \u2013 Selects the restart policy to apply to the container. The <code>on-failure<\/code> setting means Docker will automatically restart the container if it exits with a failure code because your application crashed.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15541\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/2310a9b4.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"852\" height=\"99\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>The image built in the previous step is referenced as the final argument to the <code>docker run<\/code> command. The container ID will be emitted to your terminal window; you should be able to access your Node.js app by visiting <code>localhost:8080<\/code> again. This time the server\u2019s running inside the Docker container, instead of using the <code>node<\/code> process installed on your host.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15542\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/1f9ccca5.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"960\" height=\"540\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<h2 id=\"summary\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Docker helps you deploy Node.js web services by containerizing the entire application environment. You can start a container from your image with a single <code>docker run<\/code> command on any host with Docker installed. This removes the complexity of maintaining Node.js versions, installing npm modules, and monitoring for situations where your application process needs to be restarted.<\/p>\n<p>When you\u2019ve made code changes and want to launch your update, rebuild your Docker image and remove your old container with <code>docker rm &lt;container-name&gt;<\/code>. You can then start a replacement instance that uses the revised image.<\/p>\n<p>You might want a slightly different routine in production. Although you can use a regular Docker installation with <code>docker run<\/code>, this tends to be unwieldy for all but the simplest applications. It\u2019s more common to use a tool like Docker Compose or Kubernetes to define container configuration in a file that can be versioned inside your repository.<\/p>\n<p>These mechanisms do away with the need to repeat your <code>docker run<\/code> flags each time you start a new container. They also facilitate container replication to scale your service and provide redundancy. If you\u2019re deploying to a remote host, you\u2019ll also need to push your image to a Docker registry so it can be \u201cpulled\u201d from your production machine.<\/p>\n<p>Another production-specific consideration is how you\u2019ll route traffic to your containers. Port binds can suffice to begin with but eventually you\u2019ll reach a situation where you want multiple containers on one host, each listening on the same port. In this case you can deploy a reverse proxy to route traffic to individual container ports based on request characteristics such as domain name and headers.\n<\/p><\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/15529\/how-to-dockerize-a-node-js-web-app\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;How to Dockerize a Node.js Web App \u2013 CloudSavvy IT&#8221; Docker is a containerization platform that simplifies the packaging and execution of applications. Containers run as isolated processes with their own filesystem but share their host\u2019s kernel. Docker has risen to prominence as a way of implementing reproducible development environments and distributed deployment architectures. Node.js&#8230;<\/p>\n","protected":false},"author":1,"featured_media":415079,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/02\/886260ee.jpeg","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-415078","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/415078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=415078"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/415078\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/415079"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=415078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=415078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=415078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}