<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nikhil mhatre</title>
    <description>The latest articles on Forem by Nikhil mhatre (@nikhilmhatre4757).</description>
    <link>https://forem.com/nikhilmhatre4757</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3714208%2F9786b4db-1215-425d-995c-93aae8b42cf5.png</url>
      <title>Forem: Nikhil mhatre</title>
      <link>https://forem.com/nikhilmhatre4757</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nikhilmhatre4757"/>
    <language>en</language>
    <item>
      <title>Docker &amp; Containers Explained: A Beginner-Friendly Guide to How Docker Works</title>
      <dc:creator>Nikhil mhatre</dc:creator>
      <pubDate>Fri, 16 Jan 2026 10:43:32 +0000</pubDate>
      <link>https://forem.com/nikhilmhatre4757/docker-containers-explained-a-beginner-friendly-guide-to-how-docker-works-5041</link>
      <guid>https://forem.com/nikhilmhatre4757/docker-containers-explained-a-beginner-friendly-guide-to-how-docker-works-5041</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It works on my machine."&lt;/em&gt; — if you’ve ever said or heard this, containers exist because of you 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modern software development is no longer just about writing code. It’s also about &lt;strong&gt;running that code reliably everywhere&lt;/strong&gt; — on your laptop, in testing, and in production. This is where &lt;strong&gt;containerization&lt;/strong&gt; and &lt;strong&gt;Docker&lt;/strong&gt; come in.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll break down &lt;strong&gt;what containers are, why Docker was created, and how Docker works internally&lt;/strong&gt; — in a way that’s easy to understand, even if you’re completely new.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introduction to Containers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem Containers Were Created to Solve
&lt;/h3&gt;

&lt;p&gt;Before containers, applications were usually deployed directly on servers or virtual machines. This caused several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different environments (dev, test, prod) behaved differently&lt;/li&gt;
&lt;li&gt;Dependency conflicts between applications&lt;/li&gt;
&lt;li&gt;Difficult deployments and rollbacks&lt;/li&gt;
&lt;li&gt;Poor scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers needed a way to &lt;strong&gt;package an application along with everything it needs to run&lt;/strong&gt;, and run it the same way everywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87efblpy040vtz4wnsbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87efblpy040vtz4wnsbm.png" alt="Problem Containers Were Created to Solve" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Are Containers?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;container&lt;/strong&gt; is a lightweight, portable unit that packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application code&lt;/li&gt;
&lt;li&gt;Runtime (Node, Python, Java, etc.)&lt;/li&gt;
&lt;li&gt;Libraries and dependencies&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Containers share the &lt;strong&gt;host operating system kernel&lt;/strong&gt; but run in isolated user spaces, making them fast and efficient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtz51xgqxirdx7af7cez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtz51xgqxirdx7af7cez.png" alt="What Are Containers" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Think of a container as a &lt;strong&gt;shipping container&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The contents inside don’t matter to the ship&lt;/li&gt;
&lt;li&gt;The container can move between ships, trucks, or ports&lt;/li&gt;
&lt;li&gt;Everything inside stays the same&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Containers vs Virtual Machines (VMs)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Virtual Machines&lt;/th&gt;
&lt;th&gt;Containers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Full guest OS per VM&lt;/td&gt;
&lt;td&gt;Share host OS kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup Time&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Seconds or milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Usage&lt;/td&gt;
&lt;td&gt;Heavy&lt;/td&gt;
&lt;td&gt;Lightweight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Process-level isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Very high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VMs&lt;/strong&gt; are like renting a full house for each guest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers&lt;/strong&gt; are like renting rooms in the same building&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63ohwmg77vrj3d3jknx5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63ohwmg77vrj3d3jknx5.png" alt="Containers vs Virtual Machines" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Challenges of Non-Containerized Applications
&lt;/h2&gt;

&lt;p&gt;Before containers became popular, applications were usually installed directly on servers or VMs. This worked — but it came with many headaches.&lt;/p&gt;
&lt;h3&gt;
  
  
  Common Problems (Explained Simply)
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Dependency Conflicts
&lt;/h4&gt;

&lt;p&gt;One application might need &lt;strong&gt;Node 16&lt;/strong&gt;, another needs &lt;strong&gt;Node 18&lt;/strong&gt;.&lt;br&gt;
Installing both on the same machine often breaks something.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Result: upgrading one app accidentally breaks another.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  2. Environment Inconsistency ("Works on my machine")
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;App works on a developer laptop&lt;/li&gt;
&lt;li&gt;Fails on QA&lt;/li&gt;
&lt;li&gt;Breaks in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Different OS versions, libraries, configs, or runtime versions.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Difficult Scaling
&lt;/h4&gt;

&lt;p&gt;To handle more traffic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You clone the server or VM&lt;/li&gt;
&lt;li&gt;Configure everything again&lt;/li&gt;
&lt;li&gt;Takes time and effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scaling is slow and expensive.&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Painful Deployments &amp;amp; Rollbacks
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Manual deployment steps&lt;/li&gt;
&lt;li&gt;Long release windows&lt;/li&gt;
&lt;li&gt;Rolling back means reconfiguring servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mistakes often lead to downtime.&lt;/p&gt;
&lt;h3&gt;
  
  
  How Containerization Fixes These Problems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each app runs with &lt;strong&gt;its own dependencies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Same container runs everywhere&lt;/li&gt;
&lt;li&gt;Scale by running more containers&lt;/li&gt;
&lt;li&gt;Roll back by switching container versions&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3. Introduction to Docker
&lt;/h2&gt;

&lt;p&gt;Now that we understand &lt;strong&gt;why containers are needed&lt;/strong&gt;, let’s talk about the tool that made containers popular and easy to use — &lt;strong&gt;Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Is Docker? (In Simple Words)
&lt;/h3&gt;

&lt;p&gt;Docker is a tool that helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package your application&lt;/li&gt;
&lt;li&gt;Include everything it needs to run&lt;/li&gt;
&lt;li&gt;Run it the same way on any machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker lets developers say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Build my app once, and run it anywhere.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of manually setting up environments, Docker automates this using containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnij3nnswh9s32hev2cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnij3nnswh9s32hev2cg.png" alt="Docker" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Why Was Docker Created?
&lt;/h3&gt;

&lt;p&gt;Before Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containers existed, but were hard to use&lt;/li&gt;
&lt;li&gt;Each company had its own custom tooling&lt;/li&gt;
&lt;li&gt;Developers struggled with setup and consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker solved this by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;standard format&lt;/strong&gt; (Dockerfile &amp;amp; images)&lt;/li&gt;
&lt;li&gt;Simple commands (&lt;code&gt;docker build&lt;/code&gt;, &lt;code&gt;docker run&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Easy image sharing via registries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker made containers &lt;strong&gt;developer-friendly&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  How Docker Solves Real Problems
&lt;/h3&gt;

&lt;p&gt;Let’s connect Docker to the problems we discussed earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependency conflicts&lt;/strong&gt; → Each app has its own container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment mismatch&lt;/strong&gt; → Same image runs everywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow deployments&lt;/strong&gt; → Start containers in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficult rollbacks&lt;/strong&gt; → Switch image versions easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker doesn’t remove complexity — it &lt;strong&gt;packages it neatly&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Where Docker Fits in Modern Development
&lt;/h3&gt;

&lt;p&gt;Docker is used in almost every modern software workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local development&lt;/strong&gt; – same setup for all developers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; – predictable builds and tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt; – each service runs in its own container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud &amp;amp; Kubernetes&lt;/strong&gt; – Docker images are the standard unit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker is often the &lt;strong&gt;first step&lt;/strong&gt; toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;DevOps&lt;/li&gt;
&lt;li&gt;Cloud-native architectures&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. How Docker Works Internally
&lt;/h2&gt;

&lt;p&gt;Let's keep this simple. Think of Docker as a small system that helps you package apps and run them the same way everywhere. Below are the few, friendly building blocks you need to know.&lt;/p&gt;
&lt;h3&gt;
  
  
  The two sides: Client and Daemon
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Client&lt;/strong&gt; — what you type (&lt;code&gt;docker build&lt;/code&gt;, &lt;code&gt;docker run&lt;/code&gt;) or what a GUI calls. It sends requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Daemon (&lt;code&gt;dockerd&lt;/code&gt;)&lt;/strong&gt; — the background service that actually builds images and runs containers. The client talks to the daemon.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Quick analogy: the client is the remote control, the daemon is the TV doing the work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  The runtimes (containerd &amp;amp; runc)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;containerd&lt;/strong&gt; and &lt;strong&gt;runc&lt;/strong&gt; are the low-level helpers the daemon uses. They turn an image into a running process on your machine. You don’t need to memorize them — just know Docker delegates the actual process creation to small, focused tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Images vs Containers (simple)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt; — a frozen snapshot, like a recipe or blueprint. It’s read-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; — a running instance of that image. It adds a thin writable layer so the app can run and change files while it’s alive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Dockerfile — the recipe
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Dockerfile&lt;/strong&gt; is a simple text file with instructions to build an image (what base to use, what to copy, what commands to run). &lt;code&gt;docker build&lt;/code&gt; reads it and creates the image.&lt;/p&gt;
&lt;h3&gt;
  
  
  Registry — where images live
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;registry&lt;/strong&gt; (Docker Hub, GitHub Container Registry, private registries) stores images so you can &lt;code&gt;docker push&lt;/code&gt; and &lt;code&gt;docker pull&lt;/code&gt; them from anywhere.&lt;/p&gt;
&lt;h3&gt;
  
  
  How Docker isolates and controls resources (very simple)
&lt;/h3&gt;

&lt;p&gt;Docker uses two kernel features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Namespaces&lt;/strong&gt; — give containers their own view (processes, network, filesystem). Think of a namespace as a private room: you can’t see other rooms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cgroups (control groups)&lt;/strong&gt; — limit how much CPU, memory, or disk a container can use. Think of cgroups as the room’s power limiter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together they make containers feel like little isolated environments without the overhead of a full OS.&lt;/p&gt;
&lt;h3&gt;
  
  
  Image layers &amp;amp; cache (why builds are fast)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each Dockerfile step produces a layer. Layers are reused (cached) if they haven’t changed. This is why ordering your Dockerfile sensibly makes builds faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Networking &amp;amp; storage (short)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Networking:&lt;/strong&gt; Docker gives each container a network interface and lets you map host ports (&lt;code&gt;-p host:container&lt;/code&gt;) so services are reachable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volumes:&lt;/strong&gt; For data that must survive container restarts, use &lt;strong&gt;volumes&lt;/strong&gt;. They keep data outside the container’s temporary writable layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4b6ypvixymcvlvrqxyzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4b6ypvixymcvlvrqxyzw.png" alt="Docker Internal Working" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Typical simple workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Write a &lt;strong&gt;Dockerfile&lt;/strong&gt; (describe app environment).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker build -t my-app .&lt;/code&gt; — build an image locally.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker run -p 3000:3000 my-app&lt;/code&gt; — run it as a container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker push username/my-app&lt;/code&gt; — upload to a registry.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker pull username/my-app&lt;/code&gt; on another machine to run the same image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc43ynk7tkksmxy7zphl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc43ynk7tkksmxy7zphl.png" alt="Typical simple workflow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Practical Example: Simple Web App (Hands-On)
&lt;/h2&gt;

&lt;p&gt;In this section, you’ll &lt;strong&gt;actually run a containerized app&lt;/strong&gt; by copy-pasting commands. No prior Docker experience required.&lt;/p&gt;

&lt;p&gt;We’ll containerize a very simple &lt;strong&gt;Node.js web server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5kmcu3rbin164mtfu6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5kmcu3rbin164mtfu6a.png" alt="Simple Web App " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 0: Prerequisites
&lt;/h3&gt;

&lt;p&gt;Make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker installed (&lt;code&gt;docker --version&lt;/code&gt; should work)&lt;/li&gt;
&lt;li&gt;Any OS (Windows / macOS / Linux)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Step 1: Create a Project Folder
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;simple-docker-app
&lt;span class="nb"&gt;cd &lt;/span&gt;simple-docker-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create a Simple Web App
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;index.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Docker Container!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Create &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"simple-docker-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 4: Create a Dockerfile
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;Dockerfile&lt;/code&gt; (no extension):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use an official Node.js runtime&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18&lt;/span&gt;

&lt;span class="c"&gt;# Set working directory inside container&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copy package files first (for caching)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Copy application source code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Expose application port&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="c"&gt;# Start the application&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 5: Build the Docker Image
&lt;/h3&gt;

&lt;p&gt;Run this command in the same folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; simple-web-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a Docker &lt;strong&gt;image&lt;/strong&gt; called &lt;code&gt;simple-web-app&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Run the Container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 simple-web-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open your browser and visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello from Docker Container!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  What Just Happened (In Simple Words)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker packaged your app + Node.js + config into an image&lt;/li&gt;
&lt;li&gt;A container was created from that image&lt;/li&gt;
&lt;li&gt;Port &lt;code&gt;3000&lt;/code&gt; inside the container was mapped to your machine&lt;/li&gt;
&lt;li&gt;The app runs the same way everywhere&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;Now this app can run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On any developer laptop&lt;/li&gt;
&lt;li&gt;Inside CI/CD pipelines&lt;/li&gt;
&lt;li&gt;On cloud servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No environment setup required — just Docker.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Docker is not just a tool — it’s a &lt;strong&gt;fundamental shift in how software is built and shipped&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By using containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You eliminate environment issues&lt;/li&gt;
&lt;li&gt;You simplify deployments&lt;/li&gt;
&lt;li&gt;You scale with confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What containers are&lt;/li&gt;
&lt;li&gt;Why Docker exists&lt;/li&gt;
&lt;li&gt;How Docker works internally&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>container</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
