<?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>DEV Community: Darshan Vasani</title>
    <description>The latest articles on DEV Community by Darshan Vasani (@dpvasani56).</description>
    <link>https://dev.to/dpvasani56</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%2F1109293%2Ffd69f3e3-bb82-4274-b825-9036b663061a.png</url>
      <title>DEV Community: Darshan Vasani</title>
      <link>https://dev.to/dpvasani56</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dpvasani56"/>
    <language>en</language>
    <item>
      <title>🐳 Docker Multi-Stage Build - Complete Documentation</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sat, 26 Jul 2025 07:59:22 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-multi-stage-build-complete-documentation-4990</link>
      <guid>https://dev.to/dpvasani56/docker-multi-stage-build-complete-documentation-4990</guid>
      <description>&lt;h1&gt;
  
  
  🐳 Docker Multi-Stage Build - Complete Documentation
&lt;/h1&gt;

&lt;h2&gt;
  
  
  📋 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎯 What is Docker Multi-Stage Build?&lt;/li&gt;
&lt;li&gt;🚀 Why Use Multi-Stage Builds?&lt;/li&gt;
&lt;li&gt;🏗️ How Multi-Stage Builds Work&lt;/li&gt;
&lt;li&gt;📦 Step-by-Step Tutorial&lt;/li&gt;
&lt;li&gt;🔄 Multi-Stage Build Workflow&lt;/li&gt;
&lt;li&gt;📊 Architecture Diagrams&lt;/li&gt;
&lt;li&gt;🛠️ Commands and Best Practices&lt;/li&gt;
&lt;li&gt;⚡ Performance Comparison&lt;/li&gt;
&lt;li&gt;🔧 Debugging and Troubleshooting&lt;/li&gt;
&lt;li&gt;✨ Best Practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 What is Docker Multi-Stage Build?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Multi-Stage Build&lt;/strong&gt; is a powerful feature that allows you to use multiple &lt;code&gt;FROM&lt;/code&gt; statements in a single Dockerfile[1]. Each &lt;code&gt;FROM&lt;/code&gt; instruction creates a new stage in the build process, enabling you to &lt;strong&gt;optimize image size&lt;/strong&gt; and &lt;strong&gt;improve security&lt;/strong&gt; by separating build dependencies from runtime requirements[2].&lt;/p&gt;

&lt;h3&gt;
  
  
  🔤 Key Concepts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🏗️ &lt;strong&gt;Multiple Stages&lt;/strong&gt;: Each stage has its own base image and purpose&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Selective Copying&lt;/strong&gt;: Copy only necessary artifacts between stages&lt;/li&gt;
&lt;li&gt;🗑️ &lt;strong&gt;Artifact Exclusion&lt;/strong&gt;: Build tools and dependencies are left behind&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Production-Ready&lt;/strong&gt;: Final image contains only runtime requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Why Use Multi-Stage Builds?
&lt;/h2&gt;

&lt;p&gt;Multi-stage builds solve several critical problems in containerized application development[3]:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🎯 Benefit&lt;/th&gt;
&lt;th&gt;📋 Description&lt;/th&gt;
&lt;th&gt;💡 Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📉 Smaller Image Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excludes build tools and dependencies from final image&lt;/td&gt;
&lt;td&gt;🚀 &lt;strong&gt;Faster deployments&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔒 Enhanced Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduces attack surface by removing unnecessary components&lt;/td&gt;
&lt;td&gt;🛡️ &lt;strong&gt;Lower vulnerability risk&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⚡ Better Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lighter images load and start faster&lt;/td&gt;
&lt;td&gt;🏃 &lt;strong&gt;Improved runtime speed&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🧹 Cleaner Workflow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single Dockerfile for entire build process&lt;/td&gt;
&lt;td&gt;🛠️ &lt;strong&gt;Simplified maintenance&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;💰 Cost Optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduced storage and bandwidth usage&lt;/td&gt;
&lt;td&gt;💵 &lt;strong&gt;Lower infrastructure costs&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🏗️ How Multi-Stage Builds Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Single-Stage vs Multi-Stage Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB
    subgraph "❌ Single-Stage Build Problems"
        SINGLE[📦 Single Stage]
        SINGLE --&amp;gt; BUILD_TOOLS[🔧 Build Tools]
        SINGLE --&amp;gt; SOURCE[📄 Source Code]
        SINGLE --&amp;gt; DEPS[📚 All Dependencies]
        SINGLE --&amp;gt; ARTIFACTS[⚡ Build Artifacts]
        SINGLE --&amp;gt; FINAL1[📦 Final Image: 200MB+]
    end

    subgraph "✅ Multi-Stage Build Solution"
        STAGE1[🏗️ Build Stage]
        STAGE2[🚀 Runtime Stage]

        STAGE1 --&amp;gt; BUILD_TOOLS2[🔧 Build Tools]
        STAGE1 --&amp;gt; SOURCE2[📄 Source Code]  
        STAGE1 --&amp;gt; BUILD_DEPS[📚 Build Dependencies]
        STAGE1 --&amp;gt; COMPILE[⚙️ Compile/Build]

        STAGE2 --&amp;gt; RUNTIME_BASE[🏃 Runtime Base Image]
        STAGE2 --&amp;gt; COPY_ARTIFACTS[📋 Copy Build Artifacts]
        STAGE2 --&amp;gt; FINAL2[📦 Final Image: 50MB]

        COMPILE -.-&amp;gt;|Copy Only Artifacts| COPY_ARTIFACTS
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔄 Build Process Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant User as 👤 Developer
    participant Docker as 🐳 Docker Engine
    participant Stage1 as 🏗️ Build Stage (installer)
    participant Stage2 as 🚀 Runtime Stage (deployer)
    participant Registry as 📦 Image Registry

    User-&amp;gt;&amp;gt;Docker: docker build -t multistage .
    Docker-&amp;gt;&amp;gt;Stage1: FROM node:18-alpine AS installer
    Stage1-&amp;gt;&amp;gt;Stage1: WORKDIR /app
    Stage1-&amp;gt;&amp;gt;Stage1: COPY package*.json ./
    Stage1-&amp;gt;&amp;gt;Stage1: RUN npm install
    Stage1-&amp;gt;&amp;gt;Stage1: COPY . .
    Stage1-&amp;gt;&amp;gt;Stage1: RUN npm run build

    Docker-&amp;gt;&amp;gt;Stage2: FROM nginx:latest AS deployer
    Stage2-&amp;gt;&amp;gt;Stage1: COPY --from=installer /app/build /usr/share/nginx/html

    Docker-&amp;gt;&amp;gt;User: 📦 Optimized Image Ready (50MB)
    User-&amp;gt;&amp;gt;Registry: docker push multistage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 Step-by-Step Tutorial
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ Project Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Clone the Application&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone 
&lt;span class="nb"&gt;cd &lt;/span&gt;react-app-docker
&lt;span class="nb"&gt;ls&lt;/span&gt;  &lt;span class="c"&gt;# Check project structure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Project Structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;react-app-docker/
├── src/
├── public/
├── package.json
├── package-lock.json
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Creating Multi-Stage Dockerfile
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2. Create Dockerfile&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile
vi Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Multi-Stage Dockerfile Content&lt;/strong&gt;&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;# 🏗️ Stage 1: Build Stage (installer)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer&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 for dependency installation&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 all dependencies (including devDependencies)&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 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;# Build the application&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# 🚀 Stage 2: Runtime Stage (deployer)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:latest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;

&lt;span class="c"&gt;# Copy only build artifacts from previous stage&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=installer /app/build /usr/share/nginx/html&lt;/span&gt;

&lt;span class="c"&gt;# Nginx will serve the static files&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔧 Build Process
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;4. Build the Multi-Stage Image&lt;/strong&gt;&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; multistage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📊 Build Output Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
    subgraph "🏗️ Build Stage Process"
        A[📄 package.json] --&amp;gt; B[📦 npm install]
        C[📁 Source Code] --&amp;gt; B
        B --&amp;gt; D[⚙️ npm run build]
        D --&amp;gt; E[📁 /app/build]
    end

    subgraph "🚀 Runtime Stage Process"
        F[🌐 nginx:latest] --&amp;gt; G[📋 Copy build artifacts]
        E -.-&amp;gt;|COPY --from=installer| G
        G --&amp;gt; H[🎯 Final Image]
    end

    style E fill:#90EE90
    style H fill:#87CEEB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 Multi-Stage Build Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Complete Workflow Diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    START([🚀 Start Build Process]) --&amp;gt; STAGE1{🏗️ Build Stage}

    STAGE1 --&amp;gt; NODE[📦 FROM node:18-alpine AS installer]
    NODE --&amp;gt; WORKDIR[📁 WORKDIR /app]
    WORKDIR --&amp;gt; COPY_PKG[📋 COPY package*.json ./]
    COPY_PKG --&amp;gt; NPM_INSTALL[⬇️ RUN npm install]
    NPM_INSTALL --&amp;gt; COPY_SRC[📄 COPY . .]
    COPY_SRC --&amp;gt; NPM_BUILD[⚙️ RUN npm run build]

    NPM_BUILD --&amp;gt; STAGE2{🚀 Runtime Stage}

    STAGE2 --&amp;gt; NGINX[🌐 FROM nginx:latest AS deployer]
    NGINX --&amp;gt; COPY_BUILD[📋 COPY --from=installer /app/build /usr/share/nginx/html]
    COPY_BUILD --&amp;gt; FINAL[✨ Optimized Final Image]

    FINAL --&amp;gt; SIZE_CHECK{📏 Size Check}
    SIZE_CHECK --&amp;gt;|Before: 200MB+| BEFORE[❌ Single Stage: Bloated]
    SIZE_CHECK --&amp;gt;|After: ~50MB| AFTER[✅ Multi-Stage: Optimized]

    style STAGE1 fill:#FFE4B5
    style STAGE2 fill:#E0FFFF
    style FINAL fill:#90EE90
    style AFTER fill:#98FB98
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Stage Dependency Graph
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB
    subgraph "📦 Base Images"
        NODE18[🟢 node:18-alpine]
        NGINX[🔵 nginx:latest]
    end

    subgraph "🏗️ Build Stage (installer)"
        INSTALLER[installer stage]
        BUILD_DEPS[📚 Build Dependencies]
        SOURCE_CODE[📄 Source Code]
        BUILD_ARTIFACTS[⚡ Build Artifacts]

        NODE18 --&amp;gt; INSTALLER
        INSTALLER --&amp;gt; BUILD_DEPS
        INSTALLER --&amp;gt; SOURCE_CODE
        BUILD_DEPS --&amp;gt; BUILD_ARTIFACTS
        SOURCE_CODE --&amp;gt; BUILD_ARTIFACTS
    end

    subgraph "🚀 Runtime Stage (deployer)"
        DEPLOYER[deployer stage]
        STATIC_FILES[📁 Static Files Only]

        NGINX --&amp;gt; DEPLOYER
        BUILD_ARTIFACTS -.-&amp;gt;|COPY --from=installer| DEPLOYER
        DEPLOYER --&amp;gt; STATIC_FILES
    end

    subgraph "🗑️ Excluded from Final Image"
        EXCLUDED[❌ node_modules❌ Source code❌ Build tools❌ Dev dependencies]
    end

    style BUILD_ARTIFACTS fill:#90EE90
    style STATIC_FILES fill:#87CEEB
    style EXCLUDED fill:#FFB6C1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Commands and Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 Essential Docker Commands
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Build Commands&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build multi-stage image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; multistage &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Build with specific target stage&lt;/span&gt;
docker build &lt;span class="nt"&gt;--target&lt;/span&gt; installer &lt;span class="nt"&gt;-t&lt;/span&gt; build-stage &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Build with build arguments&lt;/span&gt;
docker build &lt;span class="nt"&gt;--build-arg&lt;/span&gt; &lt;span class="nv"&gt;NODE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;18 &lt;span class="nt"&gt;-t&lt;/span&gt; multistage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Image Management&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all images&lt;/span&gt;
docker images

&lt;span class="c"&gt;# Remove specific image&lt;/span&gt;
docker image &lt;span class="nb"&gt;rm &lt;/span&gt;multistage

&lt;span class="c"&gt;# Remove dangling images&lt;/span&gt;
docker image prune

&lt;span class="c"&gt;# Check image size&lt;/span&gt;
docker images &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s2"&gt;"table {{.Repository}}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;{{.Tag}}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;{{.Size}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Container Operations&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run container&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:80 &lt;span class="nt"&gt;--name&lt;/span&gt; app-container multistage

&lt;span class="c"&gt;# Check running containers&lt;/span&gt;
docker ps

&lt;span class="c"&gt;# View container logs&lt;/span&gt;
docker logs 

&lt;span class="c"&gt;# Execute commands in container&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt;  /bin/sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Debugging and Inspection Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Inspect container configuration&lt;/span&gt;
docker inspect 

&lt;span class="c"&gt;# Check container filesystem&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt;  &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/share/nginx/html

&lt;span class="c"&gt;# Monitor container resource usage&lt;/span&gt;
docker stats 

&lt;span class="c"&gt;# View container port mappings&lt;/span&gt;
docker port 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Performance Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📏 Size Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
    subgraph "📊 Image Size Comparison"
        SINGLE[❌ Single-Stage200MB+]
        MULTI[✅ Multi-Stage~50MB]

        SINGLE --&amp;gt; REDUCTION[75% Size Reduction]
        REDUCTION --&amp;gt; MULTI
    end

    subgraph "⚡ Performance Impact"
        FASTER[🚀 3x Faster Pull]
        SECURE[🔒 Lower Attack Surface]
        COST[💰 Reduced Storage Cost]
    end

    MULTI --&amp;gt; FASTER
    MULTI --&amp;gt; SECURE
    MULTI --&amp;gt; COST

    style SINGLE fill:#FFB6C1
    style MULTI fill:#90EE90
    style REDUCTION fill:#FFD700
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📈 Benefits Breakdown
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;📊 Metric&lt;/th&gt;
&lt;th&gt;🔴 Single-Stage&lt;/th&gt;
&lt;th&gt;🟢 Multi-Stage&lt;/th&gt;
&lt;th&gt;📈 Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📦 Image Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;200MB+&lt;/td&gt;
&lt;td&gt;~50MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75% reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⬇️ Pull Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;td&gt;10 seconds&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3x faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🚀 Startup Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15 seconds&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2x faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔒 Security Vulnerabilities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60% fewer&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;💾 Storage Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75% savings&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔧 Debugging and Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Container Investigation Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check container logs&lt;/span&gt;
docker logs 

&lt;span class="c"&gt;# Access container shell&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt;  /bin/sh

&lt;span class="c"&gt;# Inspect container details&lt;/span&gt;
docker inspect 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🕵️ Inside Container Exploration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB
    CONTAINER[🐳 Running Container]

    subgraph "📁 Container Filesystem"
        ROOT[/ (root directory)]
        USR[/usr]
        SHARE[/usr/share]
        NGINX[/usr/share/nginx]
        HTML[/usr/share/nginx/html]
        FILES[📄 Static Files]

        ROOT --&amp;gt; USR
        USR --&amp;gt; SHARE
        SHARE --&amp;gt; NGINX
        NGINX --&amp;gt; HTML
        HTML --&amp;gt; FILES
    end

    subgraph "🔍 Inspection Commands"
        LS[ls -la]
        CAT[cat index.html]
        PS[ps aux]
        TOP[top]
    end

    CONTAINER --&amp;gt; ROOT
    FILES --&amp;gt; LS
    FILES --&amp;gt; CAT

    style FILES fill:#90EE90
    style HTML fill:#87CEEB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚨 Common Issues and Solutions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Problem&lt;/th&gt;
&lt;th&gt;🔍 Symptom&lt;/th&gt;
&lt;th&gt;✅ Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build fails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unknown instruction WORKDIR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check Dockerfile syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Large image size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Image still 200MB+&lt;/td&gt;
&lt;td&gt;Verify multi-stage is working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container won't start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exit code 125&lt;/td&gt;
&lt;td&gt;Check port conflicts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Files not found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;404 errors&lt;/td&gt;
&lt;td&gt;Verify COPY paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission issues&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Access denied&lt;/td&gt;
&lt;td&gt;Use non-root user&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ✨ Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Multi-Stage Build Best Practices
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. 🏷️ Use Named Stages&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Named stages&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:latest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;

&lt;span class="c"&gt;# ❌ Bad: Unnamed stages&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. 📦 Choose Optimal Base Images&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Lightweight base images&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer    # Small Alpine-based&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer       # Lightweight nginx&lt;/span&gt;

&lt;span class="c"&gt;# ❌ Bad: Heavy base images  &lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer           # Ubuntu-based (larger)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:latest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer       # Full nginx image&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. 🎯 Copy Only What's Needed&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Selective copying&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=installer /app/build /usr/share/nginx/html&lt;/span&gt;

&lt;span class="c"&gt;# ❌ Bad: Copying everything&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=installer /app /usr/share/nginx/html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;4. 📋 Optimize Layer Caching&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Copy package files first&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="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&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;# ❌ Bad: Copy everything first&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔒 Security Best Practices
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;5. 👤 Use Non-Root User&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Non-root user&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1001 &lt;span class="nt"&gt;-S&lt;/span&gt; nodejs
&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;-S&lt;/span&gt; nextjs &lt;span class="nt"&gt;-u&lt;/span&gt; 1001
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nextjs&lt;/span&gt;

&lt;span class="c"&gt;# ❌ Bad: Running as root (default)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;
&lt;span class="c"&gt;# No user specified - runs as root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;6. 🗑️ Remove Unnecessary Packages&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ✅ Good: Clean up after installation&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    package1 &lt;span class="se"&gt;\
&lt;/span&gt;    package2 &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# ❌ Bad: Leave package cache&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; package1 package2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Performance Best Practices
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;7. 🎯 Use Specific Targets&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build only specific stage for testing&lt;/span&gt;
docker build &lt;span class="nt"&gt;--target&lt;/span&gt; installer &lt;span class="nt"&gt;-t&lt;/span&gt; build-stage &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Build final production image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; production-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;8. 📦 Multi-Architecture Support&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Support multiple architectures&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;--platform=$BUILDPLATFORM node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer&lt;/span&gt;
&lt;span class="c"&gt;# Build process...&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;--platform=$TARGETPLATFORM nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;
&lt;span class="c"&gt;# Runtime setup...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔄 Advanced Multi-Stage Patterns
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;9. 🧪 Testing Stage&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&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="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Test stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;installer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;tester&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Production stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployer&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=installer /app/build /usr/share/nginx/html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;10. 🔀 Parallel Builds&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Base dependencies&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&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="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Frontend build&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;frontend&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; frontend/ ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build:frontend

&lt;span class="c"&gt;# Backend build  &lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;backend&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; backend/ ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build:backend

&lt;span class="c"&gt;# Final stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;final&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=frontend /app/dist /usr/share/nginx/html&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=backend /app/build /app/api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📊 Additional Best Practices
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mindmap
  root((🎯 Multi-StageBest Practices))
    🏗️ Build Optimization
      📦 Use Alpine images
      🎯 Named stages
      📋 Layer caching
      🗂️ .dockerignore file
    🔒 Security
      👤 Non-root user
      🧹 Clean package cache
      🔍 Minimal attack surface
      🚫 No secrets in layers
    ⚡ Performance
      🔄 Parallel builds
      📏 Smaller final image
      🚀 Faster deployments
      💾 Reduced storage
    🛠️ Maintenance
      📝 Clear documentation
      🏷️ Consistent naming
      🧪 Testing stages
      🔄 CI/CD integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎓 Summary
&lt;/h2&gt;

&lt;p&gt;Docker Multi-Stage Builds are a &lt;strong&gt;game-changing feature&lt;/strong&gt; that revolutionizes container image optimization[1][2]. By separating build and runtime environments, you can achieve:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑 Key Achievements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;📉 75% smaller images&lt;/strong&gt; - From 200MB+ to ~50MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Enhanced security&lt;/strong&gt; - Reduced attack surface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Faster deployments&lt;/strong&gt; - 3x faster pull times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 Cost savings&lt;/strong&gt; - Lower storage and bandwidth costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧹 Cleaner workflow&lt;/strong&gt; - Single Dockerfile for entire process&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Implementation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🏗️ Design stages&lt;/strong&gt; - Separate build and runtime concerns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Choose base images&lt;/strong&gt; - Use lightweight Alpine variants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Copy selectively&lt;/strong&gt; - Only production artifacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Apply security&lt;/strong&gt; - Non-root users, clean packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Monitor results&lt;/strong&gt; - Measure size and performance improvements&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Multi-stage builds represent a &lt;strong&gt;fundamental shift&lt;/strong&gt; from monolithic container images to &lt;strong&gt;optimized, production-ready deployments&lt;/strong&gt;. They embody the principle of "build fat, ship thin" - using all necessary tools during build time while delivering minimal, secure runtime images[3].&lt;/p&gt;

&lt;p&gt;Start implementing multi-stage builds in your projects today to unlock &lt;strong&gt;significant performance gains&lt;/strong&gt; and &lt;strong&gt;security improvements&lt;/strong&gt; in your containerized applications! 🚀&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://docs.docker.com/build/building/multi-stage/" rel="noopener noreferrer"&gt;https://docs.docker.com/build/building/multi-stage/&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://docs.docker.com/get-started/docker-concepts/building-images/multi-stage-builds/" rel="noopener noreferrer"&gt;https://docs.docker.com/get-started/docker-concepts/building-images/multi-stage-builds/&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://docs.docker.com/build/building/best-practices/" rel="noopener noreferrer"&gt;https://docs.docker.com/build/building/best-practices/&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://docs.docker.com/guides/cpp/multistage/" rel="noopener noreferrer"&gt;https://docs.docker.com/guides/cpp/multistage/&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://dev.to/raunakgurud09/mastering-docker-multistage-builds-1e0m"&gt;https://dev.to/raunakgurud09/mastering-docker-multistage-builds-1e0m&lt;/a&gt;&lt;br&gt;
[6] &lt;a href="https://dev.to/abhay_yt_52a8e72b213be229/streamline-your-docker-images-with-multi-stage-builds-340c"&gt;https://dev.to/abhay_yt_52a8e72b213be229/streamline-your-docker-images-with-multi-stage-builds-340c&lt;/a&gt;&lt;br&gt;
[7] &lt;a href="https://depot.dev/blog/docker-multi-stage-builds" rel="noopener noreferrer"&gt;https://depot.dev/blog/docker-multi-stage-builds&lt;/a&gt;&lt;br&gt;
[8] &lt;a href="https://dev.to/citrux-digital/understanding-docker-multistage-builds-3fm7"&gt;https://dev.to/citrux-digital/understanding-docker-multistage-builds-3fm7&lt;/a&gt;&lt;br&gt;
[9] &lt;a href="https://labs.iximiuz.com/tutorials/docker-multi-stage-builds" rel="noopener noreferrer"&gt;https://labs.iximiuz.com/tutorials/docker-multi-stage-builds&lt;/a&gt;&lt;br&gt;
[10] &lt;a href="https://dev.to/kalkwst/multi-stage-dockerfiles-3e90"&gt;https://dev.to/kalkwst/multi-stage-dockerfiles-3e90&lt;/a&gt;&lt;br&gt;
[11] &lt;a href="https://ruan.dev/blog/2022/07/31/docker-multistage-builds-for-hugo" rel="noopener noreferrer"&gt;https://ruan.dev/blog/2022/07/31/docker-multistage-builds-for-hugo&lt;/a&gt;&lt;br&gt;
[12] &lt;a href="https://www.cherryservers.com/blog/docker-multistage-build" rel="noopener noreferrer"&gt;https://www.cherryservers.com/blog/docker-multistage-build&lt;/a&gt;&lt;br&gt;
[13] &lt;a href="https://github.com/patrickhoefler/dockerfilegraph" rel="noopener noreferrer"&gt;https://github.com/patrickhoefler/dockerfilegraph&lt;/a&gt;&lt;br&gt;
[14] &lt;a href="https://docs.docker.com/build/building/multi-platform/" rel="noopener noreferrer"&gt;https://docs.docker.com/build/building/multi-platform/&lt;/a&gt;&lt;br&gt;
[15] &lt;a href="https://overcast.blog/building-efficient-multi-stage-dockerfiles-for-production-055f34c4baed" rel="noopener noreferrer"&gt;https://overcast.blog/building-efficient-multi-stage-dockerfiles-for-production-055f34c4baed&lt;/a&gt;&lt;br&gt;
[16] &lt;a href="https://learn.microsoft.com/en-us/dotnet/architecture/microservices/docker-application-development-process/docker-app-development-workflow" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/dotnet/architecture/microservices/docker-application-development-process/docker-app-development-workflow&lt;/a&gt;&lt;br&gt;
[17] &lt;a href="https://docs.docker.com/get-started/docker-concepts/building-images/writing-a-dockerfile/" rel="noopener noreferrer"&gt;https://docs.docker.com/get-started/docker-concepts/building-images/writing-a-dockerfile/&lt;/a&gt;&lt;br&gt;
[18] &lt;a href="https://earthly.dev/blog/docker-multistage/" rel="noopener noreferrer"&gt;https://earthly.dev/blog/docker-multistage/&lt;/a&gt;&lt;br&gt;
[19] &lt;a href="https://blog.devgenius.io/docker-multi-stage-build-in-detail-3d7da2948797?gi=265baab36942" rel="noopener noreferrer"&gt;https://blog.devgenius.io/docker-multi-stage-build-in-detail-3d7da2948797?gi=265baab36942&lt;/a&gt;&lt;br&gt;
[20] &lt;a href="https://www.youtube.com/watch?v=ajetvJmBvFo" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ajetvJmBvFo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>aws</category>
    </item>
    <item>
      <title>Notes &amp; Cheatsheet: “Dockerizing an App – CKA Series #2”</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sat, 26 Jul 2025 07:58:11 +0000</pubDate>
      <link>https://dev.to/dpvasani56/notes-cheatsheet-dockerizing-an-app-cka-series-2-mo6</link>
      <guid>https://dev.to/dpvasani56/notes-cheatsheet-dockerizing-an-app-cka-series-2-mo6</guid>
      <description>&lt;h1&gt;
  
  
  Notes &amp;amp; Cheatsheet: “Dockerizing an App – CKA Series #2”
&lt;/h1&gt;

&lt;p&gt;🎯 Goal of the video  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show, &lt;strong&gt;from scratch&lt;/strong&gt;, how to containerise (“dockerise”) a sample Node.js app, push it to Docker Hub and run it anywhere.
&lt;/li&gt;
&lt;li&gt;Lays foundation for later CKA topics (pods, images, registries, best-practices).
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1  Prerequisites &amp;amp; Sandbox options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Local install: &lt;strong&gt;Docker Desktop&lt;/strong&gt; (Mac, Windows, Linux).
&lt;/li&gt;
&lt;li&gt;Zero-install alternative: &lt;strong&gt;Play-with-Docker&lt;/strong&gt; (Docker-provided 4-hour sandbox).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  labs.play-with-docker.com  →  Start  →  Add new instance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2  Clone sample project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create workspace&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;day02_code &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;day02_code      

&lt;span class="c"&gt;# pull sample “getting-started” todo app&lt;/span&gt;
git clone https://github.com/docker/getting-started.git
&lt;span class="nb"&gt;cd &lt;/span&gt;getting-started/app        &lt;span class="c"&gt;# contains package.json, src/, etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3  Write the Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ─── 1. Base image ───────────────────────────────────────────────&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine                              # tiny Linux + Node.js&lt;/span&gt;

&lt;span class="c"&gt;# ─── 2. Set workdir 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;# ─── 3. Copy source code into image ──────────────────────────────&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;# ─── 4. Install prod deps only ───────────────────────────────────&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--production&lt;/span&gt;

&lt;span class="c"&gt;# ─── 5. Expose port app listens on ───────────────────────────────&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;# ─── 6. Container start-up command ───────────────────────────────&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node","src/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Flow diagram&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host FS ─► docker build
          │
          ▼
      Dockerfile  ──►  Layered Image (base → code → deps) ──► Registry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4  Build image locally
&lt;/h2&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; day02-todo:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Image is now visible via: &lt;code&gt;docker images&lt;/code&gt; or Docker-Desktop &amp;gt; Images.&lt;/p&gt;

&lt;h2&gt;
  
  
  5  Push to Docker Hub
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. create repo on hub:  /test-repo  (public is fine)&lt;/span&gt;

&lt;span class="c"&gt;# 2. tag local image for hub&lt;/span&gt;
docker tag day02-todo:latest  /test-repo:latest

&lt;span class="c"&gt;# 3. login and push&lt;/span&gt;
docker login
docker push /test-repo:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6  Run the container anywhere
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# pull (if on fresh machine)&lt;/span&gt;
docker pull /test-repo:latest

&lt;span class="c"&gt;# run detached, publish host:3000 → container:3000&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;--name&lt;/span&gt; todoapp /test-repo:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; 📝✅.&lt;/p&gt;

&lt;h2&gt;
  
  
  7  Troubleshoot inside the container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# open an interactive shell (Alpine uses sh)&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; todoapp sh
&lt;span class="c"&gt;# inspect files, logs, env, etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8  Key Docker CLI quick-ref
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List images&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List running containers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop &amp;amp; remove&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker stop  &amp;amp;&amp;amp; docker rm&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker rmi&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean dangling layers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker system prune&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  9  Next-step teaser 🐣
&lt;/h2&gt;

&lt;p&gt;Image weighs 217 MB—too big for a tiny todo app!&lt;br&gt;&lt;br&gt;
Hint for next video: &lt;strong&gt;multi-stage builds&lt;/strong&gt; and other best practices shrink it dramatically.  &lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dockerfile = deterministic recipe&lt;/strong&gt; → identical runtime everywhere.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layered cache&lt;/strong&gt; speeds builds &amp;amp; transfers.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry push/pull&lt;/strong&gt; workflow mirrors real CI/CD pipelines.
&lt;/li&gt;
&lt;li&gt;Knowing basic &lt;code&gt;docker build/run/exec&lt;/code&gt; is a must before jumping into Kubernetes objects (pods, deployments, etc.). 🎓&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>cka</category>
    </item>
    <item>
      <title>🚀 Step-by-Step: Setup + GET Method in FastAPI</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Thu, 24 Jul 2025 16:51:42 +0000</pubDate>
      <link>https://dev.to/dpvasani56/step-by-step-setup-get-method-in-fastapi-2bb6</link>
      <guid>https://dev.to/dpvasani56/step-by-step-setup-get-method-in-fastapi-2bb6</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Step-by-Step: Setup + GET Method in FastAPI
&lt;/h2&gt;




&lt;h3&gt;
  
  
  🧪 1. Set up Virtual Environment (Windows/Linux/Mac)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install virtualenv (if not already installed)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;virtualenv

&lt;span class="c"&gt;# Create virtual environment&lt;/span&gt;
virtualenv venv

&lt;span class="c"&gt;# Activate virtual environment&lt;/span&gt;
&lt;span class="c"&gt;# Windows&lt;/span&gt;
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate

&lt;span class="c"&gt;# macOS/Linux&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📦 2. Install FastAPI and Uvicorn
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📁 3. Create Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi_project/
│
├── main.py
├── requirements.txt
└── venv/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save dependencies for later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 4. Create &lt;code&gt;main.py&lt;/code&gt; with GET Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Using &lt;strong&gt;Path Parameters&lt;/strong&gt;, &lt;strong&gt;Predefined Values&lt;/strong&gt;, and &lt;strong&gt;Query Parameters&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 🧩 Predefined Path Parameter using Enum
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;alexnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alexnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;resnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;lenet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lenet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Basic GET Method with Path Parameter
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Path Parameter with Predefined Values
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/models/{model_name}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;alexnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deep Learning FTW!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lenet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LeNet is classic!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ResNet Rocks!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ With Query Parameters (Optional + Defaults)
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fetching products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ▶️ 5. Run the Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--reload&lt;/code&gt; allows auto-reload during development&lt;/li&gt;
&lt;li&gt;Visit: &lt;a href="http://127.0.0.1:8000" rel="noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📘 6. Explore Interactive Docs (Swagger)
&lt;/h3&gt;

&lt;p&gt;Open in browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8000/docs  # Swagger UI
http://127.0.0.1:8000/redoc # ReDoc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Usage Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /items/42&lt;/code&gt; → &lt;code&gt;{"item_id": 42}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /models/alexnet&lt;/code&gt; → Returns custom message&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /products/?skip=5&amp;amp;limit=2&amp;amp;category=shoes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Summary Notes
&lt;/h2&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;Example&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Path Param&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/items/{id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL-based dynamic value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enum Param&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/models/{model_name}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restrict value to predefined set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query Param&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/products/?skip=0&amp;amp;limit=10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Additional filters, optional/default values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swagger UI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive API documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtualenv&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;venv\Scripts\activate&lt;/code&gt; / &lt;code&gt;source venv&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Isolate project dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Absolutely! Here's a well-structured and beginner-to-advanced &lt;strong&gt;note on FastAPI Routers&lt;/strong&gt; including why &lt;strong&gt;routers are important&lt;/strong&gt;, how &lt;strong&gt;validation works behind the scenes using Pydantic&lt;/strong&gt;, and how all of it comes together.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ 1. &lt;strong&gt;Why Use Routers in FastAPI?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Routers are used to &lt;strong&gt;modularize your FastAPI app&lt;/strong&gt; — just like how controllers work in other frameworks (like Express.js, Django, Laravel).&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Benefits:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🔗 Separation of concerns: Separate logic by features (e.g., &lt;code&gt;/products&lt;/code&gt;, &lt;code&gt;/users&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;📦 Scalability: Easier to manage larger codebases&lt;/li&gt;
&lt;li&gt;♻️ Reusability: Routers can be reused and nested&lt;/li&gt;
&lt;li&gt;🧪 Testability: Each router can be tested independently&lt;/li&gt;
&lt;li&gt;🧼 Clean Code: Keeps your &lt;code&gt;main.py&lt;/code&gt; small and readable&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧩 2. &lt;strong&gt;What Is a Router in FastAPI?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;router&lt;/code&gt; is an instance of &lt;code&gt;APIRouter&lt;/code&gt;, where you can define endpoints just like &lt;code&gt;@app.get()&lt;/code&gt; but independently.&lt;/p&gt;

&lt;h4&gt;
  
  
  💡 Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# routers/products.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;msg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ⚙️ 3. &lt;strong&gt;How to Register a Router&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You register routers in your main app like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/main.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.routers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 This will expose the route: &lt;code&gt;/api/v1/products&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 4. &lt;strong&gt;Behind the Scenes: Validation Using Pydantic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;FastAPI uses &lt;strong&gt;Pydantic&lt;/strong&gt; to validate:&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Path Parameters
&lt;/h4&gt;

&lt;p&gt;✅ Query Parameters&lt;br&gt;
✅ Request Body (JSON/Post Data)&lt;/p&gt;
&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;min_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Behind the scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a request hits the endpoint, FastAPI automatically parses and validates the incoming JSON into a &lt;code&gt;Product&lt;/code&gt; object.&lt;/li&gt;
&lt;li&gt;If data is &lt;strong&gt;invalid&lt;/strong&gt;, FastAPI &lt;strong&gt;auto-generates a 422 error response&lt;/strong&gt; with all validation issues.&lt;/li&gt;
&lt;li&gt;You never have to manually &lt;code&gt;try/except&lt;/code&gt; invalid input. Pydantic does it for you.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📦 5. &lt;strong&gt;Using Pydantic with Routers&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# routers/products.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.models.product&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;🧠 When someone sends a POST request with JSON body, it’s &lt;strong&gt;automatically parsed and validated&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;FastAPI converts it into a Python object (&lt;code&gt;Product&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;If fields are missing or invalid, it returns a structured error.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🧾 6. Validation Error Response Format (Auto-generated):
&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;"detail"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"loc"&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="s2"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"field required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value_error.missing"&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;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;
  
  
  🔍 7. FastAPI Dependency Injection with Routers (Advanced)
&lt;/h3&gt;

&lt;p&gt;You can pass &lt;code&gt;dependencies&lt;/code&gt; into routers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth middleware&lt;/li&gt;
&lt;li&gt;DB connection injection&lt;/li&gt;
&lt;li&gt;Role-based access
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_dependency&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;h2&gt;
  
  
  🧠 Summary: Why Routers + Pydantic Matter
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Routers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Help organize routes modularly, cleanly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pydantic Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define data schemas + validation rules for request/response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FastAPI + Pydantic auto-validate data before your logic runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validation errors are returned with proper HTTP status + reason&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docs Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Models are reflected in Swagger Docs for each route automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🔍 &lt;strong&gt;FastAPI Path Parameters&lt;/strong&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🔐 &lt;strong&gt;Predefined Values (Enum)&lt;/strong&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🔎 &lt;strong&gt;Query Parameters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Each section includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What it is&lt;/li&gt;
&lt;li&gt;How it works&lt;/li&gt;
&lt;li&gt;Code examples&lt;/li&gt;
&lt;li&gt;Behavior behind the scenes (Pydantic + FastAPI)&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  📌 1. &lt;strong&gt;Path Parameters in FastAPI&lt;/strong&gt;
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ✅ What are Path Parameters?
&lt;/h3&gt;

&lt;p&gt;Path parameters are dynamic parts of the URL path that act as &lt;strong&gt;variables&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;FastAPI treats them as required parameters&lt;/strong&gt; and maps them using Python function parameters.&lt;/p&gt;
&lt;h3&gt;
  
  
  📘 Syntax Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/users/{user_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🛠 How it Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;/users/42&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;FastAPI converts &lt;code&gt;"42"&lt;/code&gt; to an &lt;code&gt;int&lt;/code&gt; (based on type hint)&lt;/li&gt;
&lt;li&gt;If type mismatch (e.g., &lt;code&gt;/users/abc&lt;/code&gt;), FastAPI returns a &lt;code&gt;422&lt;/code&gt; error automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚙️ Behind the Scenes:
&lt;/h3&gt;

&lt;p&gt;FastAPI uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python type hints&lt;/strong&gt; to enforce type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic&lt;/strong&gt; to validate the value before function execution&lt;/li&gt;
&lt;li&gt;Generates &lt;strong&gt;OpenAPI docs&lt;/strong&gt; automatically with correct parameter types&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✅ Optional Parameters?
&lt;/h3&gt;

&lt;p&gt;No. &lt;strong&gt;Path parameters must be required.&lt;/strong&gt;&lt;br&gt;
If optional, you must redesign using &lt;strong&gt;query parameters&lt;/strong&gt; instead.&lt;/p&gt;


&lt;h1&gt;
  
  
  🎯 2. &lt;strong&gt;Predefined Values with Enums (Validation)&lt;/strong&gt;
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ✅ What are Predefined Values?
&lt;/h3&gt;

&lt;p&gt;Sometimes, you want to restrict a path parameter to specific &lt;strong&gt;allowed values&lt;/strong&gt; — not anything.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;Python Enums&lt;/strong&gt; for this.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧱 Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;alexnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alexnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;resnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;lenet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lenet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/models/{model_name}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModelName&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🌐 Usage:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/models/alexnet&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/models/invalid_model&lt;/code&gt; ❌  → 422 Validation Error&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🔍 Why Use Enum?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensures clients use only valid values&lt;/li&gt;
&lt;li&gt;Auto-validates input (via Pydantic)&lt;/li&gt;
&lt;li&gt;Automatically shows options in Swagger Docs dropdown&lt;/li&gt;
&lt;li&gt;Prevents typos and unexpected inputs&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ⚙️ How it Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI internally maps the path to the Enum.&lt;/li&gt;
&lt;li&gt;If not part of the Enum, it returns &lt;code&gt;422&lt;/code&gt; with a message like:
&lt;/li&gt;
&lt;/ul&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;"detail"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"loc"&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="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model_name"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value is not a valid enumeration member"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type_error.enum"&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;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;h1&gt;
  
  
  📥 3. &lt;strong&gt;Query Parameters in FastAPI&lt;/strong&gt;
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ✅ What are Query Parameters?
&lt;/h3&gt;

&lt;p&gt;Parameters that appear &lt;strong&gt;after the &lt;code&gt;?&lt;/code&gt;&lt;/strong&gt; in a URL.&lt;br&gt;
Used for filtering, sorting, pagination, searching, etc.&lt;/p&gt;
&lt;h3&gt;
  
  
  📘 Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 URL: &lt;code&gt;/products?skip=5&amp;amp;limit=20&amp;amp;q=shoes&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  💡 Key Points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not positional like path parameters&lt;/li&gt;
&lt;li&gt;Can be optional or have default values&lt;/li&gt;
&lt;li&gt;Auto-validated using type hints&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🧰 Advanced: Use &lt;code&gt;Query&lt;/code&gt; for extra validation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;min_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;...&lt;/code&gt; = required&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;min_length&lt;/code&gt;, &lt;code&gt;max_length&lt;/code&gt;, &lt;code&gt;regex&lt;/code&gt; supported&lt;/li&gt;
&lt;li&gt;Shows up in API docs with proper validation&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🤯 Pydantic + Query Magic:
&lt;/h3&gt;

&lt;p&gt;Pydantic validates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required/Optional values&lt;/li&gt;
&lt;li&gt;Data types (e.g., &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Value constraints (min/max length, regex)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And &lt;strong&gt;FastAPI auto-generates&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swagger documentation&lt;/li&gt;
&lt;li&gt;Interactive query parameter fields&lt;/li&gt;
&lt;li&gt;Error responses for invalid queries&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📥 Optional Query Parameters
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/filter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;filter_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;in_stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in_stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;in_stock&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Summary Table
&lt;/h2&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;Path Parameters&lt;/th&gt;
&lt;th&gt;Predefined (Enum)&lt;/th&gt;
&lt;th&gt;Query Parameters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;URL Format&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/items/{id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/models/{model_name}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/products?skip=0&amp;amp;limit=10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;✅ Always&lt;/td&gt;
&lt;td&gt;✅ Always&lt;/td&gt;
&lt;td&gt;❌ Can be optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type Validation&lt;/td&gt;
&lt;td&gt;✅ (int, str, etc.)&lt;/td&gt;
&lt;td&gt;✅ Only allowed values via Enum&lt;/td&gt;
&lt;td&gt;✅ With type hints &amp;amp; Query()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto Swagger Docs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Dropdown with values&lt;/td&gt;
&lt;td&gt;✅ Shows default and constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common Use Case&lt;/td&gt;
&lt;td&gt;Dynamic routes (ID, slug)&lt;/td&gt;
&lt;td&gt;Model names, categories, user roles&lt;/td&gt;
&lt;td&gt;Filtering, searching, pagination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation Method&lt;/td&gt;
&lt;td&gt;Pydantic via type hints&lt;/td&gt;
&lt;td&gt;Pydantic Enum&lt;/td&gt;
&lt;td&gt;Pydantic + fastapi.Query&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  ✅ Default Values
&lt;/h2&gt;
&lt;h2&gt;
  
  
  ❓ Optional Parameters
&lt;/h2&gt;
&lt;h2&gt;
  
  
  📌 Using Both Together in &lt;strong&gt;Two Ways&lt;/strong&gt;
&lt;/h2&gt;


&lt;h2&gt;
  
  
  🔍 1. Using &lt;strong&gt;Plain Function Parameters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;FastAPI automatically treats query parameters with &lt;strong&gt;default values&lt;/strong&gt; as &lt;strong&gt;optional&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧪 Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required?&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Optional&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Optional&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Optional&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  🧠 Explanation:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;Query()&lt;/code&gt; is used.&lt;/li&gt;
&lt;li&gt;All parameters have defaults, so FastAPI treats them as optional.&lt;/li&gt;
&lt;li&gt;Validation is still applied via Python types.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧠 2. Using &lt;code&gt;Query()&lt;/code&gt; for More Control
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;fastapi.Query()&lt;/code&gt; when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To explicitly make a param &lt;strong&gt;optional or required&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;default value&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;validation (min, max, regex)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ✅ Optional with Default (Best Practice):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search term&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Page number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Max results per page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Required?&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Extras&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;min_length=2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ge=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;le=100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  ❗ Required Query Parameters
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;...&lt;/code&gt; in &lt;code&gt;Query(...)&lt;/code&gt; to make it required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;must_pass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;min_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⛔ &lt;code&gt;/required&lt;/code&gt; → &lt;strong&gt;Error&lt;/strong&gt;&lt;br&gt;
✅ &lt;code&gt;/required?q=abc&lt;/code&gt; → OK&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Optional with Pydantic &lt;code&gt;Optional[]&lt;/code&gt; (Alternative)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧾 Final Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Code Example&lt;/th&gt;
&lt;th&gt;Required?&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic optional param&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q: str = None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Simplest optional param&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required param&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q: str = Query(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Must be provided&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional with default&lt;/td&gt;
&lt;td&gt;&lt;code&gt;page: int = Query(1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Custom default + validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional with constraints&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q: str = Query(None, min_length=2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Adds validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional with &lt;code&gt;Optional[]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q: Optional[str] = Query(None)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;More explicit for dev clarity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fastapi</category>
      <category>python</category>
    </item>
    <item>
      <title>Docker Orchestration with AWS ECS – Full Guide (with Node.js Production Testing &amp; Tips</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:18:10 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-orchestration-with-aws-ecs-full-guide-with-nodejs-production-testing-tips-4i9f</link>
      <guid>https://dev.to/dpvasani56/docker-orchestration-with-aws-ecs-full-guide-with-nodejs-production-testing-tips-4i9f</guid>
      <description>&lt;h1&gt;
  
  
  🚢 &lt;strong&gt;Docker Orchestration with AWS ECS – Full Guide&lt;/strong&gt; &lt;em&gt;(with Node.js Production Testing &amp;amp; Tips)&lt;/em&gt;
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🧠 What is Docker Orchestration?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Orchestration&lt;/strong&gt; means managing the lifecycle of containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 Deploying&lt;/li&gt;
&lt;li&gt;🔁 Scaling (up/down)&lt;/li&gt;
&lt;li&gt;🚥 Load balancing&lt;/li&gt;
&lt;li&gt;🛠️ Updating&lt;/li&gt;
&lt;li&gt;💥 Handling failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Popular Orchestration Tools:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Swarm&lt;/strong&gt; 🐝&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes (K8s)&lt;/strong&gt; ☸️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon ECS&lt;/strong&gt; 🚀&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon EKS&lt;/strong&gt; (for Kubernetes) ☁️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll focus on &lt;strong&gt;AWS ECS&lt;/strong&gt; using &lt;strong&gt;Fargate&lt;/strong&gt; (serverless) and &lt;strong&gt;EC2 launch type&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Step 1: Setting Up AWS Account
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to 👉 &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;https://aws.amazon.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign up for a free tier account (needs credit/debit card 💳).&lt;/li&gt;
&lt;li&gt;Enable MFA for security 🔐.&lt;/li&gt;
&lt;li&gt;Set region (e.g., &lt;code&gt;us-east-1&lt;/code&gt;, &lt;code&gt;ap-south-1&lt;/code&gt;) 🌍.&lt;/li&gt;
&lt;li&gt;Create an &lt;strong&gt;IAM user&lt;/strong&gt; with &lt;strong&gt;AdministratorAccess&lt;/strong&gt; if not using root.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧴 Step 2: Setting up Amazon ECR (Elastic Container Registry)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ECR&lt;/strong&gt; is AWS's private Docker registry.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪜 Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;AWS Console → Search &lt;code&gt;ECR&lt;/code&gt; → Create repository 📂&lt;/li&gt;
&lt;li&gt;Configure:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;my-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Visibility: &lt;code&gt;Private&lt;/code&gt; 🔒&lt;/li&gt;
&lt;li&gt;Tag immutability: Enabled ✅

&lt;ol&gt;
&lt;li&gt;Push Docker Image to ECR:
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Authenticate Docker to ECR&lt;/span&gt;
aws ecr get-login-password &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 | docker login &lt;span class="nt"&gt;--username&lt;/span&gt; AWS &lt;span class="nt"&gt;--password-stdin&lt;/span&gt; &amp;lt;your-account-id&amp;gt;.dkr.ecr.us-east-1.amazonaws.com

&lt;span class="c"&gt;# Build and Tag image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Tag with ECR repo URI&lt;/span&gt;
docker tag my-app:latest &amp;lt;your-account-id&amp;gt;.dkr.ecr.us-east-1.amazonaws.com/my-app:latest

&lt;span class="c"&gt;# Push image&lt;/span&gt;
docker push &amp;lt;your-account-id&amp;gt;.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧰 Step 3: Setting up ECS Cluster
&lt;/h2&gt;

&lt;p&gt;An ECS Cluster is where your containers run.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪜 Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;AWS Console → ECS → Create Cluster&lt;/li&gt;
&lt;li&gt;Choose:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Networking only&lt;/code&gt; → &lt;strong&gt;Fargate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EC2 + Networking&lt;/code&gt; → EC2

&lt;ol&gt;
&lt;li&gt;Cluster Name: &lt;code&gt;my-app-cluster&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Proceed → ECS will create VPC and subnets 🛰️&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📝 Step 4: ECS Task Definition Setup
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Task Definition&lt;/strong&gt; = Docker container blueprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Key Components:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Task Role (IAM)&lt;/li&gt;
&lt;li&gt;Docker Image from ECR&lt;/li&gt;
&lt;li&gt;Port mappings (e.g., &lt;code&gt;80:3000&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;CPU &amp;amp; Memory: 256 CPU, 512 MiB RAM&lt;/li&gt;
&lt;li&gt;Log configuration: AWS CloudWatch&lt;/li&gt;
&lt;li&gt;Environment variables, secrets 🔐&lt;/li&gt;
&lt;li&gt;Health checks: &lt;code&gt;/health&lt;/code&gt; or &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🪜 Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;ECS → Task Definitions → Create new&lt;/li&gt;
&lt;li&gt;Launch Type: &lt;strong&gt;Fargate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add container:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;my-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Image: &lt;code&gt;&amp;lt;ECR Image URL&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Port: &lt;code&gt;3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Logging: &lt;strong&gt;awslogs&lt;/strong&gt;, with group: &lt;code&gt;/ecs/my-app&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚖️ Step 5: ECS Service Setup with Load Balancer
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Service&lt;/strong&gt; handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping tasks running&lt;/li&gt;
&lt;li&gt;Restarting failed containers&lt;/li&gt;
&lt;li&gt;Auto-scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🪜 Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ECS → Your Cluster → Create Service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch Type: &lt;strong&gt;Fargate&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Task Definition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Desired tasks: &lt;code&gt;1&lt;/code&gt; or more&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attach Load Balancer:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;ALB → New or existing&lt;/li&gt;
&lt;li&gt;Create Target Group → port &lt;code&gt;3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Health Check path: &lt;code&gt;/health&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Listener on port &lt;code&gt;80&lt;/code&gt; → forward to Target Group&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Enable &lt;strong&gt;Auto Scaling&lt;/strong&gt; (optional)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧪 Step 6: Testing Our Service (💥 with Node.js Tips!)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Basic Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 &amp;gt; Load Balancers&lt;/strong&gt; → Copy &lt;strong&gt;DNS URL&lt;/strong&gt; 🌐&lt;/li&gt;
&lt;li&gt;Visit in browser → You should see your app 🚀&lt;/li&gt;
&lt;li&gt;Confirm task is running: ECS &amp;gt; Cluster &amp;gt; Tasks&lt;/li&gt;
&lt;li&gt;Logs: CloudWatch &amp;gt; &lt;code&gt;/ecs/my-app&lt;/code&gt; 📜&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ✅ Deep Testing (For Node.js Applications)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🔹 1. Check container logs:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws logs get-log-events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; &lt;span class="s2"&gt;"/ecs/my-app"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-stream-name&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;your-log-stream&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via CloudWatch Console.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔹 2. CURL/HTTP test:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://&amp;lt;load-balancer-dns&amp;gt;/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ Ensure response is &lt;code&gt;200 OK&lt;/code&gt;. If not, ECS will &lt;strong&gt;kill and restart&lt;/strong&gt; your task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🔹 3. Test environment variables:
&lt;/h4&gt;

&lt;p&gt;Add this in your Node.js app:&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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENV:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set &lt;code&gt;"NODE_ENV": "production"&lt;/code&gt; in Task Definition.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔹 4. Debug failing deployments:
&lt;/h4&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task status (&lt;code&gt;Stopped?&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;View Reason (&lt;code&gt;StoppedReason&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Logs (&lt;code&gt;CloudWatch&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Health Check (endpoint must return 2xx)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🔹 5. Enable ECS Exec:
&lt;/h4&gt;

&lt;p&gt;Run shell commands inside the running container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ecs execute-command &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cluster&lt;/span&gt; my-app-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--task&lt;/span&gt; &amp;lt;task-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--container&lt;/span&gt; my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--interactive&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--command&lt;/span&gt; &lt;span class="s2"&gt;"/bin/sh"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Requires enabling ECS Exec &amp;amp; permissions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧹 Step 7: Clean up Resources (🧽 Avoid Charges!)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Checklist:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stop ECS Service&lt;/li&gt;
&lt;li&gt;Delete Tasks&lt;/li&gt;
&lt;li&gt;Delete Load Balancer&lt;/li&gt;
&lt;li&gt;Delete Target Groups&lt;/li&gt;
&lt;li&gt;Delete ECR Repository (optional)&lt;/li&gt;
&lt;li&gt;Delete Cluster&lt;/li&gt;
&lt;li&gt;Delete VPC (if created)&lt;/li&gt;
&lt;li&gt;Delete CloudWatch logs
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ecr delete-repository &lt;span class="nt"&gt;--repository-name&lt;/span&gt; my-app &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Manual vs Automatic Orchestration
&lt;/h2&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;Manual&lt;/th&gt;
&lt;th&gt;Automatic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deploy new container 🚀&lt;/td&gt;
&lt;td&gt;CLI or Console&lt;/td&gt;
&lt;td&gt;CI/CD + ECS Service Updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale app 🔄&lt;/td&gt;
&lt;td&gt;You change task count&lt;/td&gt;
&lt;td&gt;Auto Scaling based on CPU/Memory/Requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor and Heal 🩺&lt;/td&gt;
&lt;td&gt;Manual restart&lt;/td&gt;
&lt;td&gt;ECS restarts crashed tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load Balancing 🌐&lt;/td&gt;
&lt;td&gt;Manually configure ELB&lt;/td&gt;
&lt;td&gt;ECS auto-registers tasks to Target Groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image Updates 🔄&lt;/td&gt;
&lt;td&gt;Push new tag and update task def&lt;/td&gt;
&lt;td&gt;Use CodePipeline / GitHub Actions + Blue/Green&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Real-World Production Tips (💡 Especially for Node.js)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;.env.production&lt;/code&gt;&lt;/strong&gt; with &lt;code&gt;dotenv&lt;/code&gt; and &lt;strong&gt;pass via Task Definition&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reverse proxy with NGINX&lt;/strong&gt; (optional for advanced setups)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health Check Endpoint (&lt;code&gt;/health&lt;/code&gt;)&lt;/strong&gt;: return &lt;code&gt;200 OK&lt;/code&gt; JSON, no DB calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;pm2&lt;/code&gt;&lt;/strong&gt; inside container for better process management (optional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid console.log in production&lt;/strong&gt; → Use &lt;code&gt;winston&lt;/code&gt; or &lt;code&gt;pino&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Structured Logging&lt;/strong&gt; → Send logs to &lt;strong&gt;CloudWatch&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor memory &amp;amp; CPU metrics&lt;/strong&gt; via CloudWatch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable ECS Exec&lt;/strong&gt; to debug running container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use HTTPS via ACM&lt;/strong&gt; with Load Balancer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Deploy via GitHub Actions&lt;/strong&gt; + &lt;code&gt;AWS CLI&lt;/code&gt; or &lt;code&gt;CodePipeline&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set container limits&lt;/strong&gt; (soft/hard memory) to avoid OOM crashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Secrets Manager&lt;/strong&gt; for DB/API credentials 🔐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test locally with &lt;code&gt;docker run -p 3000:3000 my-app&lt;/code&gt; before push&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set &lt;code&gt;NODE_ENV=production&lt;/code&gt;&lt;/strong&gt; for optimized performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a lightweight base image&lt;/strong&gt; like &lt;code&gt;node:18-alpine&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧾 Summary Cheatsheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Tool/Service&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1️⃣&lt;/td&gt;
&lt;td&gt;Create AWS Account&lt;/td&gt;
&lt;td&gt;AWS Console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣&lt;/td&gt;
&lt;td&gt;Push Image to ECR&lt;/td&gt;
&lt;td&gt;ECR, Docker CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3️⃣&lt;/td&gt;
&lt;td&gt;Setup ECS Cluster&lt;/td&gt;
&lt;td&gt;ECS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4️⃣&lt;/td&gt;
&lt;td&gt;Define Task Definition&lt;/td&gt;
&lt;td&gt;ECS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5️⃣&lt;/td&gt;
&lt;td&gt;Create Service + Load Balancer&lt;/td&gt;
&lt;td&gt;ECS + ALB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6️⃣&lt;/td&gt;
&lt;td&gt;Test Your Application&lt;/td&gt;
&lt;td&gt;Load Balancer URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7️⃣&lt;/td&gt;
&lt;td&gt;Cleanup&lt;/td&gt;
&lt;td&gt;Console / CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>docker</category>
      <category>aws</category>
      <category>ecs</category>
      <category>devops</category>
    </item>
    <item>
      <title>🧩 Docker Compose – Full DevOps Power</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:14:42 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-compose-full-devops-power-4ckl</link>
      <guid>https://dev.to/dpvasani56/docker-compose-full-devops-power-4ckl</guid>
      <description>&lt;h1&gt;
  
  
  🧩 Docker Compose – Full DevOps Power
&lt;/h1&gt;




&lt;h2&gt;
  
  
  📘 What is Docker Compose?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; is a tool for defining and managing &lt;strong&gt;multi-container&lt;/strong&gt; Docker applications using a simple YAML file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of running &lt;code&gt;docker run&lt;/code&gt; commands multiple times, Compose lets you:&lt;/p&gt;

&lt;p&gt;✅ Define containers, networks, volumes, and environment variables&lt;br&gt;
✅ Start everything with &lt;strong&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
✅ Manage dependencies, ports, and data easily&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Basic Syntax of &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;         &lt;span class="c1"&gt;# Compose file version&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;              &lt;span class="c1"&gt;# Define all containers here&lt;/span&gt;
  &lt;span class="na"&gt;service1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;            &lt;span class="c1"&gt;# A named service (container)&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;       &lt;span class="c1"&gt;# Use this image&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;      &lt;span class="c1"&gt;# host:container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Why Use Docker Compose?
&lt;/h2&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;Why It Helps 🚀&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧱 Declarative Setup&lt;/td&gt;
&lt;td&gt;All infra defined in one YAML file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 Built-in Networking&lt;/td&gt;
&lt;td&gt;Services can talk by name (like DNS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧳 Volume Integration&lt;/td&gt;
&lt;td&gt;Persistent data made easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Auto-Dependency Mgmt&lt;/td&gt;
&lt;td&gt;Start db before app, cache, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔥 Dev &amp;amp; Prod Configs&lt;/td&gt;
&lt;td&gt;Easy environment switching&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🌐 Networking in Docker Compose
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ✅ Auto Network Creation:
&lt;/h3&gt;

&lt;p&gt;All services in a Compose file &lt;strong&gt;automatically share a custom bridge network&lt;/strong&gt; with internal DNS!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service Name&lt;/th&gt;
&lt;th&gt;Container DNS Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;db&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔧 You can ping other containers &lt;strong&gt;by service name&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:alpine&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In &lt;code&gt;api&lt;/code&gt;, you can make requests like:&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://web:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🗃️ Volumes in Docker Compose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Define persistent data storage:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mydata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then attach to a service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mydata:/var/lib/postgresql/data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔥 Compose &lt;strong&gt;creates and manages&lt;/strong&gt; these volumes for you!&lt;/p&gt;

&lt;h1&gt;
  
  
  🧠 Understanding Docker Compose Networking + Port Mapping 🔌
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🏗️ Sample &lt;code&gt;docker-compose.yml&lt;/code&gt; Setup:
&lt;/h2&gt;

&lt;p&gt;Your project folder is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📂 myapp/
  └── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔧 Compose File:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8001:5432"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 What Happens When You Run:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Docker Compose Automatically Does:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔧 Action&lt;/th&gt;
&lt;th&gt;💬 What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧱 Creates a network&lt;/td&gt;
&lt;td&gt;Named &lt;code&gt;myapp_default&lt;/code&gt; (based on folder name)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Launches web container&lt;/td&gt;
&lt;td&gt;Joins &lt;code&gt;myapp_default&lt;/code&gt; as &lt;code&gt;web&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Launches db container&lt;/td&gt;
&lt;td&gt;Joins &lt;code&gt;myapp_default&lt;/code&gt; as &lt;code&gt;db&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Enables DNS lookup&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;web&lt;/code&gt; can reach &lt;code&gt;db&lt;/code&gt; by hostname &lt;code&gt;db&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🌐 Internal Networking (Container ↔ Container)
&lt;/h2&gt;

&lt;p&gt;✅ Inside the &lt;code&gt;web&lt;/code&gt; container, your app can connect to the database like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postgres://db:5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 Why? Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker provides &lt;strong&gt;internal DNS&lt;/strong&gt; to resolve service names&lt;/li&gt;
&lt;li&gt;The port &lt;code&gt;5432&lt;/code&gt; is the &lt;strong&gt;internal (container) port&lt;/strong&gt;, exposed by the Postgres container&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 External Networking (Host ↔ Container)
&lt;/h2&gt;

&lt;p&gt;You’ve mapped container ports to host ports like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;     &lt;span class="c1"&gt;# Host: 8000 → Container: 8000&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8001:5432"&lt;/span&gt;     &lt;span class="c1"&gt;# Host: 8001 → Container: 5432&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So from &lt;strong&gt;your host machine&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access web on 👉 &lt;code&gt;http://localhost:8000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Connect to Postgres on 👉 &lt;code&gt;postgres://localhost:8001&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Important Concept: &lt;code&gt;HOST_PORT:CONTAINER_PORT&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HOST_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port &lt;strong&gt;on your machine&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CONTAINER_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5432&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port &lt;strong&gt;inside the container&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mapping&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8001:5432&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Requests to &lt;code&gt;localhost:8001&lt;/code&gt; go to Postgres in container on port &lt;code&gt;5432&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 Real World Analogy
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🧳 Think of containers as hotel rooms.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Each has its own &lt;strong&gt;room number&lt;/strong&gt; (container port)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;front desk&lt;/strong&gt; (your host machine) assigns a &lt;strong&gt;guest-access number&lt;/strong&gt; (host port)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;5432&lt;/code&gt; = actual DB server inside room&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;8001&lt;/code&gt; = external phone number to reach that room from outside&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔒 Internal vs External Communication Recap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;URL Format&lt;/th&gt;
&lt;th&gt;Who uses it?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔁 Container-to-container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postgres://db:5432&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inside Docker network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌍 Host-to-container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postgres://localhost:8001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;From your laptop / browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ Internal comms use &lt;strong&gt;service names + container port&lt;/strong&gt;&lt;br&gt;
✅ External comms use &lt;strong&gt;localhost + host port&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 Final Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker Compose &lt;strong&gt;auto-creates a network&lt;/strong&gt; (unless you override it)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;don’t need to expose ports&lt;/strong&gt; unless you want &lt;strong&gt;outside access&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use internal ports (&lt;code&gt;CONTAINER_PORT&lt;/code&gt;) when services talk to each other&lt;/li&gt;
&lt;li&gt;Expose &lt;strong&gt;only the ports you need&lt;/strong&gt; to keep things secure 🔐&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧪 Bonus Tip: Inspect the Compose Network
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect myapp_default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This will show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containers in the network&lt;/li&gt;
&lt;li&gt;Their IPs&lt;/li&gt;
&lt;li&gt;Connection metadata&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🌐 Docker Compose Advanced Networking – A Complete Guide
&lt;/h1&gt;


&lt;h2&gt;
  
  
  🚀 1. Multi-Host Networking via &lt;strong&gt;Overlay&lt;/strong&gt; (Swarm Mode)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Overlay networking allows &lt;strong&gt;containers on different Docker hosts&lt;/strong&gt; to communicate — as if they were on the same network!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  🔌 Use Case:
&lt;/h3&gt;

&lt;p&gt;✅ Deploying a &lt;strong&gt;multi-host&lt;/strong&gt; microservice system&lt;br&gt;
✅ Need backend containers on &lt;strong&gt;host A&lt;/strong&gt; to talk to database on &lt;strong&gt;host B&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  🛠️ How It Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requires &lt;strong&gt;Swarm mode&lt;/strong&gt; (&lt;code&gt;docker swarm init&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Docker uses &lt;strong&gt;overlay driver&lt;/strong&gt; to create a virtual network across machines&lt;/li&gt;
&lt;li&gt;Compose uses this with no special setup, if Swarm mode is active&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🧪 Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my_overlay&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;overlay&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then attach to services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my_overlay&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my_overlay&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Compose will automatically connect services to the &lt;strong&gt;multi-host overlay network&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Overlay vs Bridge (Single Host Only)
&lt;/h2&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;
&lt;code&gt;bridge&lt;/code&gt; (default)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;overlay&lt;/code&gt; (Swarm)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host Limit&lt;/td&gt;
&lt;td&gt;1 machine&lt;/td&gt;
&lt;td&gt;Multiple machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Local dev&lt;/td&gt;
&lt;td&gt;Distributed apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS-based discovery&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs Swarm mode?&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧱 2. Custom Networks in Compose
&lt;/h2&gt;

&lt;p&gt;You’re not limited to just the default network. You can &lt;strong&gt;define and connect containers to specific networks&lt;/strong&gt; using the &lt;code&gt;networks:&lt;/code&gt; key.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 Example Topology
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./proxy&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;

  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./app&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧭 Network Layout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontend network:
  - proxy
  - app

backend network:
  - app
  - db

proxy 🔁 app 🔁 db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;code&gt;proxy&lt;/code&gt; can't see &lt;code&gt;db&lt;/code&gt;, but &lt;code&gt;app&lt;/code&gt; can talk to both&lt;br&gt;
✅ &lt;strong&gt;Great for enforcing security boundaries&lt;/strong&gt; 🔐&lt;/p&gt;


&lt;h2&gt;
  
  
  🔌 3. Custom Network Drivers &amp;amp; Options
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
    &lt;span class="na"&gt;driver_opts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;com.docker.network.bridge.host_binding_ipv4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1"&lt;/span&gt;

  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custom-driver&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bridge&lt;/code&gt;: Standard Docker single-host network&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;custom-driver&lt;/code&gt;: Plug in advanced/third-party networking solutions (e.g., macvlan, overlay, weave)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📛 4. Rename Docker Network (Custom Name)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custom_frontend&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;🔁 Instead of &lt;code&gt;projectname_frontend&lt;/code&gt;, Docker will create &lt;code&gt;custom_frontend&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;✅ Useful in CI/CD or pre-defined environments.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧮 5. Assigning Static IPs in Compose
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;ipv4_address&lt;/code&gt; under the &lt;strong&gt;service's network attachment&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app_net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ipv4_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.28.0.4&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
    &lt;span class="na"&gt;ipam&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;subnet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.28.0.0/16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Be careful — misconfiguring subnets or overlapping IPs can break your network.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ 6. Customize the &lt;code&gt;default&lt;/code&gt; Network
&lt;/h2&gt;

&lt;p&gt;You can override the default Compose-generated network like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custom-driver-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Still lets you use default behavior, but with custom driver/settings.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌉 7. Use a Pre-Existing Docker Network
&lt;/h2&gt;

&lt;p&gt;Want to connect to a network created &lt;strong&gt;outside Compose&lt;/strong&gt;? Use &lt;code&gt;external: true&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;network1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-pre-existing-network&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Compose will &lt;strong&gt;connect&lt;/strong&gt; to the existing network, not recreate it.&lt;/p&gt;

&lt;p&gt;🔁 Helpful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using shared infra (like reverse proxies)&lt;/li&gt;
&lt;li&gt;Reusing CI/CD networking&lt;/li&gt;
&lt;li&gt;Linking across Compose projects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Final Cheatsheet
&lt;/h2&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;Keyword&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-host networking&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;overlay&lt;/code&gt; driver&lt;/td&gt;
&lt;td&gt;Works with Swarm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated networks&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;networks:&lt;/code&gt; per service&lt;/td&gt;
&lt;td&gt;Scoped communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom drivers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;driver: bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Control behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rename network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use meaningful names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static IPs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ipv4_address&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Predictable networking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-existing networks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;external: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connect to outside network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customize default&lt;/td&gt;
&lt;td&gt;&lt;code&gt;networks: default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Override auto network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Final Takeaways
&lt;/h2&gt;

&lt;p&gt;✅ Compose makes &lt;strong&gt;networking declarative, secure, and powerful&lt;/strong&gt;&lt;br&gt;
✅ Use &lt;strong&gt;custom networks&lt;/strong&gt; to enforce boundaries and structure&lt;br&gt;
✅ Use &lt;strong&gt;overlay&lt;/strong&gt; for multi-host magic&lt;br&gt;
✅ Use &lt;strong&gt;external&lt;/strong&gt; to plug into existing infra&lt;br&gt;
✅ DNS-based discovery simplifies microservice URLs&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗️ Custom Docker Builds in Compose
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Use your own &lt;code&gt;Dockerfile&lt;/code&gt; with build context:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;                 &lt;span class="c1"&gt;# current folder&lt;/span&gt;
    &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;     &lt;span class="c1"&gt;# name of your Dockerfile&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;🧠 Docker Compose will build the image &lt;strong&gt;before running&lt;/strong&gt; the service.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 Compose vs Manual Docker Commands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Docker CLI&lt;/th&gt;
&lt;th&gt;Docker Compose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Start container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧱 Full Project Example: E-Commerce Stack
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 📦 Project Name&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;e-commerce&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# 🔧 Backend Service&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;                 &lt;span class="c1"&gt;# Use current directory as build context&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;    &lt;span class="c1"&gt;# Dockerfile to build the backend image&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;     &lt;span class="c1"&gt;# Name of the backend container&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;             &lt;span class="c1"&gt;# Map host:container port&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;                      &lt;span class="c1"&gt;# Start db first&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;                   &lt;span class="c1"&gt;# Start redis first&lt;/span&gt;

  &lt;span class="c1"&gt;# 🗃️ PostgreSQL Database Service&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;          &lt;span class="c1"&gt;# Latest stable PostgreSQL&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

  &lt;span class="c1"&gt;# ⚡ Redis In-Memory Data Store&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;       &lt;span class="c1"&gt;# Lightweight Redis image&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis_data:/data&lt;/span&gt;

&lt;span class="c1"&gt;# 🗃️ Named Volumes for Persistent Storage&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔥 How It Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;backend&lt;/code&gt; is built from the local &lt;code&gt;Dockerfile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;db&lt;/code&gt; &amp;amp; &lt;code&gt;redis&lt;/code&gt; use official images&lt;/li&gt;
&lt;li&gt;Volumes persist data between restarts&lt;/li&gt;
&lt;li&gt;All services can talk to each other via names (&lt;code&gt;backend&lt;/code&gt;, &lt;code&gt;db&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ✅ Start Everything:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ⛔ Stop &amp;amp; Clean Everything:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧰 Pro Tips
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tip 💡&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;depends_on&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Control &lt;strong&gt;boot order&lt;/strong&gt; of containers (not readiness!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;strong&gt;named volumes&lt;/strong&gt; for clean reuse &amp;amp; backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;env_file:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load &lt;code&gt;.env&lt;/code&gt; for cleaner configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;profiles:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable or disable services dynamically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;networks:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Customize default networks if needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🎓 Final Summary
&lt;/h2&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;Compose Benefit 🚀&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;🔗 Name-based access between containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumes&lt;/td&gt;
&lt;td&gt;📦 Persistent storage, managed cleanly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builds&lt;/td&gt;
&lt;td&gt;🛠️ Custom image building from source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;🧠 Multi-container orchestration made easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reusability&lt;/td&gt;
&lt;td&gt;♻️ YAML can be reused across environments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🧩 Example: Internal-only Docker Compose Network (No Exposed Ports) 🐳
&lt;/h1&gt;


&lt;h3&gt;
  
  
  ✅ Scenario:
&lt;/h3&gt;

&lt;p&gt;You’re building a simple &lt;strong&gt;backend + database + Redis&lt;/strong&gt; stack that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does &lt;strong&gt;not need to be accessed from the host/browser&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Only needs &lt;strong&gt;container-to-container communication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Should remain &lt;strong&gt;internal and secure&lt;/strong&gt; (no &lt;code&gt;ports:&lt;/code&gt; exposed)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📦 &lt;code&gt;docker-compose.yml&lt;/code&gt; (No Ports Exposed)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# 🔧 Backend API&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;DB_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="na"&gt;REDIS_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;

  &lt;span class="c1"&gt;# 🗃️ PostgreSQL Database&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

  &lt;span class="c1"&gt;# ⚡ Redis Cache&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis_data:/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Key Points
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;💡 Concept&lt;/th&gt;
&lt;th&gt;✅ Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;❌ No &lt;code&gt;ports:&lt;/code&gt; field&lt;/td&gt;
&lt;td&gt;Nothing is exposed to host machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Internal network&lt;/td&gt;
&lt;td&gt;Docker Compose auto-creates a shared bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 DNS by service name&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;backend&lt;/code&gt; can talk to &lt;code&gt;db&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt; via name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Security&lt;/td&gt;
&lt;td&gt;Fully isolated, no public entry points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  💬 How Services Communicate
&lt;/h3&gt;

&lt;p&gt;Inside &lt;code&gt;backend&lt;/code&gt; container, you can do:&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="c1"&gt;// Node.js example (env used above)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pg&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;pg&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;redis&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;redis&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;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;pg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// "db"&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&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;redisClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redis://redis:6379&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Works seamlessly, because &lt;strong&gt;Docker Compose provides built-in DNS resolution&lt;/strong&gt; for service names.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Run the Stack:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👀 Nothing exposed outside, but all services talk inside.&lt;br&gt;
Want to debug? Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; backend sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 When to Use This Pattern
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Why it Fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧱 Internal APIs/microservices&lt;/td&gt;
&lt;td&gt;No external access needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👷 Workers/CRON jobs&lt;/td&gt;
&lt;td&gt;Runs in background only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Security-sensitive apps&lt;/td&gt;
&lt;td&gt;Reduce attack surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Local-only testing&lt;/td&gt;
&lt;td&gt;Don't expose unnecessary ports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Final Tip
&lt;/h2&gt;

&lt;p&gt;If you later need external access (e.g., for testing):&lt;br&gt;
Just &lt;strong&gt;add a single port&lt;/strong&gt; to the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But for private, secure, container-to-container apps — &lt;strong&gt;no ports is cleanest&lt;/strong&gt;. ✅&lt;/p&gt;




&lt;h1&gt;
  
  
  🛠️ Docker Compose – Custom Docker Builds (Full Guide) 🐳
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🧩 Overview
&lt;/h2&gt;

&lt;p&gt;Docker Compose allows &lt;strong&gt;two primary ways&lt;/strong&gt; to set up containers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🛠️ Build locally from Dockerfile&lt;/td&gt;
&lt;td&gt;&lt;code&gt;build:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;During development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ Pull prebuilt image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;image:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CI/CD &amp;amp; production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  ✅ 1. &lt;strong&gt;Local Dockerfile Build&lt;/strong&gt; – Using &lt;code&gt;build:&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;When you want to &lt;strong&gt;build your Docker image directly from your source code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;                  &lt;span class="c1"&gt;# 📁 Location of source code (root of app)&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;      &lt;span class="c1"&gt;# 📝 File to use (default is 'Dockerfile')&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📁 Folder Structure:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myapp/
├── backend/
│   ├── Dockerfile
│   ├── server.js
│   └── package.json
└── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧠 Explanation:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;context:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Folder Docker will send to the daemon for the build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dockerfile:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom name or path to Dockerfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Triggers a local build when you run &lt;code&gt;docker compose up --build&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🔁 You don’t push/pull — just &lt;strong&gt;edit → build → run&lt;/strong&gt; locally:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ☁️ 2. &lt;strong&gt;Pull Image from Registry&lt;/strong&gt; – Using &lt;code&gt;image:&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In production or CI/CD, it’s better to &lt;strong&gt;pull prebuilt, versioned images&lt;/strong&gt; from Docker Hub or GitHub Container Registry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/myapp-backend:v1.0.3&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Works only &lt;strong&gt;if you've pushed this image earlier&lt;/strong&gt;:
&lt;/h3&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; dpvasani56/myapp-backend:v1.0.3 &lt;span class="nb"&gt;.&lt;/span&gt;
docker push dpvasani56/myapp-backend:v1.0.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 This is great when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want reproducible builds ✅&lt;/li&gt;
&lt;li&gt;You deploy to servers that don’t have your source code ✅&lt;/li&gt;
&lt;li&gt;You want fast CI/CD ✅&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Both Build &amp;amp; Image (Hybrid)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/myapp-backend:latest&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 In this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local build happens first&lt;/li&gt;
&lt;li&gt;Image is &lt;strong&gt;tagged and stored locally&lt;/strong&gt; as &lt;code&gt;dpvasani56/myapp-backend:latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Useful for &lt;strong&gt;building locally but keeping consistent image tags&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧪 Real Example: Backend + Frontend + DB
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/app-backend:dev&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/app-frontend:latest&lt;/span&gt;   &lt;span class="c1"&gt;# Pulled from Docker Hub&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pgdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📤 Push/Deploy Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1️⃣&lt;/td&gt;
&lt;td&gt;Build locally: &lt;code&gt;docker build -t dpvasani56/app-backend:dev .&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣&lt;/td&gt;
&lt;td&gt;Push to registry: &lt;code&gt;docker push dpvasani56/app-backend:dev&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3️⃣&lt;/td&gt;
&lt;td&gt;On server: &lt;code&gt;docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ Easy deployment&lt;br&gt;
✅ No source code leak&lt;br&gt;
✅ Fast start time&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Custom Dockerfile Path or Name
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./src&lt;/span&gt;
  &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.prod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You can place your Dockerfile anywhere and name it however you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Best Practices
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;build:&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;image:&lt;/code&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development 👨‍💻&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production 🚀&lt;/td&gt;
&lt;td&gt;❌ Avoid&lt;/td&gt;
&lt;td&gt;✅ Required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD 🧪&lt;/td&gt;
&lt;td&gt;✅ Build &amp;amp; Push&lt;/td&gt;
&lt;td&gt;✅ Pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collaboration 🧑‍🤝‍🧑&lt;/td&gt;
&lt;td&gt;✅ Share Compose file&lt;/td&gt;
&lt;td&gt;✅ Share tagged image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🗃️ Full Compose File with Both Options
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/my-backend:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/my-frontend:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;

  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pgdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧾 Summary Cheatsheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Use When?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You have Dockerfile locally&lt;/td&gt;
&lt;td&gt;Great for dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You push/pull from registry&lt;/td&gt;
&lt;td&gt;Ideal for prod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;build&lt;/code&gt; + &lt;code&gt;image&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Build locally with version tag&lt;/td&gt;
&lt;td&gt;Best of both worlds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;context&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define source code directory&lt;/td&gt;
&lt;td&gt;Defaults to &lt;code&gt;.&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dockerfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use custom name/location&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>docker</category>
      <category>devops</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>📦 Docker Volumes – A2Z Storage Guide 🐳</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:13:39 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-volumes-a2z-storage-guide-367a</link>
      <guid>https://dev.to/dpvasani56/docker-volumes-a2z-storage-guide-367a</guid>
      <description>&lt;h1&gt;
  
  
  📦 Docker Volumes – A2Z Storage Guide 🐳
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🔍 What is a Docker Volume?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;Docker volume&lt;/strong&gt; is a persistent storage mechanism managed by Docker &lt;strong&gt;outside&lt;/strong&gt; the container filesystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ Volumes &lt;strong&gt;survive container restarts&lt;/strong&gt;&lt;br&gt;
✅ Volumes are &lt;strong&gt;managed by Docker&lt;/strong&gt;&lt;br&gt;
✅ They’re perfect for &lt;strong&gt;storing databases, logs, user uploads, and config files&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📁 Real-World Analogy:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🧳 Think of a volume as a &lt;strong&gt;USB stick plugged into your container&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;You can eject the container 💣&lt;/li&gt;
&lt;li&gt;The USB (volume) still has all your files 💾&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧠 Why Use Volumes?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅ Benefit&lt;/th&gt;
&lt;th&gt;💬 Why It’s Awesome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Persistent Storage&lt;/td&gt;
&lt;td&gt;Data stays even after container dies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decoupled&lt;/td&gt;
&lt;td&gt;Separate from container logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared Access&lt;/td&gt;
&lt;td&gt;Mount same volume into multiple containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup Friendly&lt;/td&gt;
&lt;td&gt;Easy to archive/export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safe from image rebuilds&lt;/td&gt;
&lt;td&gt;Won't be deleted accidentally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🔌 Types of Docker Volume Mounts
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Syntax Example&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🐳 Named Volume&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-v my-volume:/app/data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default, managed by Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ Host Bind&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-v /host/folder:/container/folder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use host machine's file system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Anonymous&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-v /app/data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Randomly named, temporary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🔧 1. Using a &lt;strong&gt;Named Volume&lt;/strong&gt;
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create mydata

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; db &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; mydata:/var/lib/mysql &lt;span class="se"&gt;\&lt;/span&gt;
  mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ The data is stored in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/lib/docker/volumes/mydata/_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🗂️ 2. Attaching Host Folders (Bind Mounts)
&lt;/h1&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;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; webapp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /home/user/project:/usr/src/app &lt;span class="se"&gt;\&lt;/span&gt;
  node:alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Mounts a host folder directly inside the container.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Bind mounts&lt;/strong&gt; are powerful but risk exposing sensitive host files if misused.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔥 Differences: Volume vs Bind Mount
&lt;/h2&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;Volume (Docker-managed)&lt;/th&gt;
&lt;th&gt;Bind Mount (Host folder)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Managed by Docker&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host portability&lt;/td&gt;
&lt;td&gt;✅ Portable&lt;/td&gt;
&lt;td&gt;❌ Host-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data safety&lt;/td&gt;
&lt;td&gt;✅ Isolated&lt;/td&gt;
&lt;td&gt;❌ Depends on host path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;✅ Better&lt;/td&gt;
&lt;td&gt;⚠️ Potentially risky&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🔁 3. Share Volume Between Multiple Containers
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧪 Example:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create shared-data

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; writer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; shared-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  busybox sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"echo hello &amp;gt; /data/file.txt &amp;amp;&amp;amp; sleep 9999"&lt;/span&gt;

docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; reader &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; shared-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  busybox &lt;span class="nb"&gt;cat&lt;/span&gt; /data/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📦 Both &lt;code&gt;writer&lt;/code&gt; and &lt;code&gt;reader&lt;/code&gt; share the &lt;strong&gt;same volume&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔂 Read-only Volume Mount
&lt;/h2&gt;

&lt;p&gt;Prevent writing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-v&lt;/span&gt; mydata:/app/data:ro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Makes volume read-only inside the container!&lt;/p&gt;




&lt;h1&gt;
  
  
  📦 Volume Lifecycle Commands
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔧 Command&lt;/th&gt;
&lt;th&gt;💬 What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker volume create &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker volume ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker volume inspect &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View volume details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker volume rm &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker volume prune&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete &lt;strong&gt;all unused&lt;/strong&gt; volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🧪 Using Volumes in &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pgdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Docker creates &amp;amp; manages the &lt;code&gt;pgdata&lt;/code&gt; volume&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Volume Naming Tip
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Named volumes persist and can be reused by name&lt;/li&gt;
&lt;li&gt;Anonymous volumes are created automatically and can be hard to track
&lt;/li&gt;
&lt;/ul&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;-v&lt;/span&gt; /data nginx    &lt;span class="c"&gt;# Anonymous volume&lt;/span&gt;
docker run &lt;span class="nt"&gt;-v&lt;/span&gt; myvol:/data nginx  &lt;span class="c"&gt;# Named volume ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📤 Backing Up &amp;amp; Restoring Volumes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧳 Backup:
&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;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; myvolume:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/backup &lt;span class="se"&gt;\&lt;/span&gt;
  busybox &lt;span class="nb"&gt;tar &lt;/span&gt;czvf /backup/backup.tar.gz /data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ♻️ Restore:
&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;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; myvolume:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/backup &lt;span class="se"&gt;\&lt;/span&gt;
  busybox &lt;span class="nb"&gt;tar &lt;/span&gt;xzvf /backup/backup.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚨 Volume Gotchas to Avoid
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⚠️ Mistake&lt;/th&gt;
&lt;th&gt;💥 Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not naming volumes&lt;/td&gt;
&lt;td&gt;Hard to manage &amp;amp; reuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixing bind mount with sensitive paths&lt;/td&gt;
&lt;td&gt;Potential host damage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting to prune&lt;/td&gt;
&lt;td&gt;Unused volumes pile up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overwriting app folder with empty volume&lt;/td&gt;
&lt;td&gt;App might not start!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Managed&lt;/th&gt;
&lt;th&gt;Persistent&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🐳 Named Volume&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Safe default, backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ Bind Mount&lt;/td&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Mount local code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Anonymous Volume&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;⚠️ Temporary&lt;/td&gt;
&lt;td&gt;Quick test, not tracked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  ✅ Final Takeaways
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Volumes are best practice&lt;/strong&gt; for persistent, portable storage.&lt;/li&gt;
&lt;li&gt;💡 Use &lt;strong&gt;named volumes&lt;/strong&gt; for databases, uploads, logs.&lt;/li&gt;
&lt;li&gt;⚙️ Use &lt;strong&gt;bind mounts&lt;/strong&gt; for local dev.&lt;/li&gt;
&lt;li&gt;🧠 Share volumes to enable inter-container communication via files.&lt;/li&gt;
&lt;li&gt;🧽 Clean up with &lt;code&gt;docker volume prune&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>docker</category>
      <category>webdev</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🌐 Docker Networking A2Z – Masterclass for Developers &amp; DevOps</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:12:11 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-networking-a2z-masterclass-for-developers-devops-a8</link>
      <guid>https://dev.to/dpvasani56/docker-networking-a2z-masterclass-for-developers-devops-a8</guid>
      <description>&lt;h1&gt;
  
  
  🌐 Docker Networking A2Z – Masterclass for Developers &amp;amp; DevOps
&lt;/h1&gt;




&lt;h2&gt;
  
  
  📦 What is Docker Networking?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🧠 Docker networking allows &lt;strong&gt;containers to communicate&lt;/strong&gt; with:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Each other 📞&lt;/li&gt;
&lt;li&gt;The host machine 🖥️&lt;/li&gt;
&lt;li&gt;The external internet 🌍&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker automatically creates networks and connects containers based on mode.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Key Terms
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Emoji&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Virtual connection b/w containers&lt;/td&gt;
&lt;td&gt;🛣️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bridge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default, isolated internal network&lt;/td&gt;
&lt;td&gt;🌉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shares host’s network stack&lt;/td&gt;
&lt;td&gt;🏠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;None&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No network access&lt;/td&gt;
&lt;td&gt;🚫&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overlay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-host communication (Swarm)&lt;/td&gt;
&lt;td&gt;🕸️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🌉 Bridge Mode (Default)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;🧱 &lt;strong&gt;Bridge network&lt;/strong&gt; is like a &lt;strong&gt;private switch&lt;/strong&gt; where containers talk to each other.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🧵 Created Automatically:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for: &lt;code&gt;bridge&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 How it works:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Containers get &lt;strong&gt;private IPs&lt;/strong&gt; (like &lt;code&gt;172.17.0.x&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;They &lt;strong&gt;can access the internet&lt;/strong&gt; via NAT&lt;/li&gt;
&lt;li&gt;But &lt;strong&gt;cannot be accessed from outside&lt;/strong&gt; without &lt;code&gt;-p&lt;/code&gt; port mapping&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧪 Try it:
&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; container1 nginx
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; container2 busybox &lt;span class="nb"&gt;sleep &lt;/span&gt;9999

&lt;span class="c"&gt;# Ping container1 from container2 by IP&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container2 ping 172.17.0.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ By default, they &lt;strong&gt;can’t talk by name&lt;/strong&gt; unless in &lt;strong&gt;custom network&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  🧱 Custom Bridge Network (Recommended)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 Custom networks support &lt;strong&gt;container name resolution (DNS)&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  📦 Create a custom bridge:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create my-network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Launch containers into it:
&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app1 &lt;span class="nt"&gt;--network&lt;/span&gt; my-network nginx
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app2 &lt;span class="nt"&gt;--network&lt;/span&gt; my-network busybox sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, inside &lt;code&gt;app2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping app1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Works! 🎉 Containers can &lt;strong&gt;ping by name&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Why Use Custom Bridge?
&lt;/h2&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;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 DNS&lt;/td&gt;
&lt;td&gt;Resolve container names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Isolation&lt;/td&gt;
&lt;td&gt;Only containers in same network can talk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Flexibility&lt;/td&gt;
&lt;td&gt;Use multiple networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Control&lt;/td&gt;
&lt;td&gt;Inspect with &lt;code&gt;docker network inspect&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🏠 Host Network Mode
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Shares the &lt;strong&gt;host’s network stack&lt;/strong&gt; directly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🚀 Use:
&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;--network&lt;/span&gt; host nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 Super fast — no NAT or port mapping&lt;/li&gt;
&lt;li&gt;🧪 Useful for monitoring tools (Prometheus, Grafana)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;No isolation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧱 Cannot run 2 containers on same port!&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🚫 None Network Mode
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Container has &lt;strong&gt;no networking&lt;/strong&gt; at all.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;--network&lt;/span&gt; none busybox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🔒 Fully isolated&lt;/li&gt;
&lt;li&gt;Useful for &lt;strong&gt;security testing&lt;/strong&gt; or &lt;strong&gt;offline compute jobs&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🌐 Overlay Network (Advanced – Docker Swarm)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;🕸️ Enables containers on &lt;strong&gt;different hosts&lt;/strong&gt; to communicate&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Use Case:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker Swarm&lt;/li&gt;
&lt;li&gt;Distributed Microservices&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create &lt;span class="nt"&gt;--driver&lt;/span&gt; overlay my-overlay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Swarm mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker swarm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔌 Connect Containers to Multiple Networks
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create frontend
docker network create backend

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; frontend &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network-alias&lt;/span&gt; api &lt;span class="se"&gt;\&lt;/span&gt;
  nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then attach to another network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network connect backend api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Inspect a Network
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect my-network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container list&lt;/li&gt;
&lt;li&gt;IPs&lt;/li&gt;
&lt;li&gt;Aliases&lt;/li&gt;
&lt;li&gt;Subnets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧰 CLI Recap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network create &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a custom network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run --network &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connect to specific network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network inspect &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspect config and members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network rm &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network connect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connect running container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network disconnect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disconnect container&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🎯 Best Practices for Docker Networking
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Practice&lt;/th&gt;
&lt;th&gt;Why It’s Great&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ Use custom bridge networks&lt;/td&gt;
&lt;td&gt;Enable name resolution + isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚫 Avoid host mode unless needed&lt;/td&gt;
&lt;td&gt;Can expose host stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧱 Use none mode for compute-only jobs&lt;/td&gt;
&lt;td&gt;Maximum isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Limit network access&lt;/td&gt;
&lt;td&gt;Avoid connecting everything together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 Use &lt;code&gt;inspect&lt;/code&gt; to debug IPs&lt;/td&gt;
&lt;td&gt;Know who talks to whom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Use &lt;code&gt;busybox&lt;/code&gt; or &lt;code&gt;alpine&lt;/code&gt; to test ping&lt;/td&gt;
&lt;td&gt;Lightweight network testing tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Isolated?&lt;/th&gt;
&lt;th&gt;Can Use DNS?&lt;/th&gt;
&lt;th&gt;Host Access?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No (unless custom)&lt;/td&gt;
&lt;td&gt;✅ via &lt;code&gt;-p&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;custom bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ via &lt;code&gt;-p&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Best for local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Direct&lt;/td&gt;
&lt;td&gt;No port mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;For isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Cross-host&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Swarm only&lt;/td&gt;
&lt;td&gt;For multi-node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Final Analogy
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bridge network&lt;/strong&gt; = Private Wi-Fi router 🌐&lt;br&gt;
&lt;strong&gt;Custom bridge&lt;/strong&gt; = Guest Wi-Fi with name tags 🏷️&lt;br&gt;
&lt;strong&gt;Host mode&lt;/strong&gt; = Ethernet cable directly into host 💻&lt;br&gt;
&lt;strong&gt;None mode&lt;/strong&gt; = Airplane mode ✈️&lt;br&gt;
&lt;strong&gt;Overlay&lt;/strong&gt; = Corporate VPN connecting multiple offices 🏢🏢&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🌐 Docker Networking Overview
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;Container networking&lt;/strong&gt; is the foundation of container communication. Every container is equipped with a network interface, IP address, routing table, DNS config, etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ By default, containers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make outbound connections (internet)&lt;/li&gt;
&lt;li&gt;Be connected to &lt;strong&gt;default or custom networks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Be isolated or exposed, depending on the configuration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚦 Types of Docker Network Drivers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network Driver&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🧱 Default isolated network for single-host&lt;/td&gt;
&lt;td&gt;Local development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🏠 Shares host’s network namespace&lt;/td&gt;
&lt;td&gt;Low-latency, host-level apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🚫 No networking at all&lt;/td&gt;
&lt;td&gt;Offline or compute-only tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🌍 Enables multi-host (Swarm) communication&lt;/td&gt;
&lt;td&gt;Distributed systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;macvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🪪 Assigns MAC + IP from host’s network&lt;/td&gt;
&lt;td&gt;IoT, legacy systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ipvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Similar to macvlan, IP only&lt;/td&gt;
&lt;td&gt;More control over routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;custom plugins&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🛠 Extendable third-party solutions&lt;/td&gt;
&lt;td&gt;SDN, advanced use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🧱 Default Bridge Network vs 🧩 User-Defined Bridge Network
&lt;/h1&gt;

&lt;p&gt;Both are based on the &lt;code&gt;bridge&lt;/code&gt; driver, but they differ &lt;strong&gt;significantly&lt;/strong&gt; in features &amp;amp; behavior.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧱 Default &lt;code&gt;bridge&lt;/code&gt; Network
&lt;/h3&gt;

&lt;p&gt;Created automatically by Docker when installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="c"&gt;# OUTPUT will contain:&lt;/span&gt;
&lt;span class="c"&gt;# bridge    bridge    local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app1 nginx
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app2 busybox &lt;span class="nb"&gt;sleep &lt;/span&gt;999
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📛 &lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Limitation&lt;/th&gt;
&lt;th&gt;Explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚫 No DNS&lt;/td&gt;
&lt;td&gt;Can't resolve container names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📵 Not isolated&lt;/td&gt;
&lt;td&gt;All containers using default bridge are technically on the same LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Poor discoverability&lt;/td&gt;
&lt;td&gt;Need to link manually or use IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔓 Less secure&lt;/td&gt;
&lt;td&gt;Containers can talk across networks by default if not isolated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🧩 User-Defined Bridge Network
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Created with:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create my-custom-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&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;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Built-in DNS&lt;/td&gt;
&lt;td&gt;Containers can resolve each other by &lt;strong&gt;name&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Isolated environment&lt;/td&gt;
&lt;td&gt;Containers only talk to others on the same network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Auto service discovery&lt;/td&gt;
&lt;td&gt;Works like microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Fine-grained control&lt;/td&gt;
&lt;td&gt;Inspect, attach, detach easily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📂 Easier multi-container orchestration&lt;/td&gt;
&lt;td&gt;Compose, Swarm, or manually&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  ⚖️ Comparison: Default vs User-Defined Bridge
&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;Default &lt;code&gt;bridge&lt;/code&gt; 🌉&lt;/th&gt;
&lt;th&gt;User-Defined Bridge 🧩&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS support&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service name resolution&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation&lt;/td&gt;
&lt;td&gt;❌ Less secure&lt;/td&gt;
&lt;td&gt;✅ Scoped per network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compose support&lt;/td&gt;
&lt;td&gt;🚫 Not recommended&lt;/td&gt;
&lt;td&gt;✅ Fully supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Scoped &amp;amp; controlled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container-to-container name access&lt;/td&gt;
&lt;td&gt;❌ Only via IP&lt;/td&gt;
&lt;td&gt;✅ Via name (&lt;code&gt;ping app1&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preferred for production/dev&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔍 Inspecting Networks
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect my-custom-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📊 Output includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subnet&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;li&gt;Connected containers&lt;/li&gt;
&lt;li&gt;DNS aliases&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Example Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Default Bridge (no DNS):
&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; alpha nginx
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; busybox
&lt;span class="c"&gt;# ping alpha – ❌ fails&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. User-defined Bridge:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create testnet
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; alpha &lt;span class="nt"&gt;--network&lt;/span&gt; testnet nginx
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; testnet busybox
&lt;span class="c"&gt;# ping alpha – ✅ works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Other Drivers – Quick Overview
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;th&gt;Emoji&lt;/th&gt;
&lt;th&gt;Key Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🏠&lt;/td&gt;
&lt;td&gt;High-perf apps (no NAT), not isolated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🚫&lt;/td&gt;
&lt;td&gt;Secure offline or processing containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🌍&lt;/td&gt;
&lt;td&gt;Multi-host Swarm networking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;macvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🪪&lt;/td&gt;
&lt;td&gt;Assign physical IPs from host’s LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ipvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🧭&lt;/td&gt;
&lt;td&gt;Fine-grained routing control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;custom plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🧰&lt;/td&gt;
&lt;td&gt;CNI integrations, SDNs (like Calico)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🔐 When to Use What?
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Best Network Driver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local dev, isolated apps&lt;/td&gt;
&lt;td&gt;🧩 User-defined bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-container orchestration&lt;/td&gt;
&lt;td&gt;🧩 Custom bridge + Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-speed, low-latency app (e.g. Prometheus)&lt;/td&gt;
&lt;td&gt;🏠 Host network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No internet access container&lt;/td&gt;
&lt;td&gt;🚫 None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers across multiple hosts&lt;/td&gt;
&lt;td&gt;🌍 Overlay (Swarm mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign IPs from LAN for legacy systems&lt;/td&gt;
&lt;td&gt;🪪 Macvlan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🎯 Key Docker Networking Commands Cheat Sheet 🐳
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔧 Command&lt;/th&gt;
&lt;th&gt;💬 Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;📜 List all available networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network create &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🛠️ Create a custom bridge network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network rm &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🗑️ Remove a network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network inspect &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔍 View detailed info about a network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run --network &amp;lt;name&amp;gt; &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🚀 Create container in a specific network (unnamed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -d --name &amp;lt;container&amp;gt; --network &amp;lt;network&amp;gt; &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Create &lt;strong&gt;named container&lt;/strong&gt; in a custom network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network connect &amp;lt;network&amp;gt; &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔗 Attach an &lt;strong&gt;existing container&lt;/strong&gt; to a network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker network disconnect &amp;lt;network&amp;gt; &amp;lt;container&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Detach a container from a network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  ✅ Real-World Example: Create and Use a Custom Bridge Network
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1️⃣ Create a custom bridge network&lt;/span&gt;
docker network create my-bridge

&lt;span class="c"&gt;# 2️⃣ Run a container (nginx) attached to that network&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; my-app &lt;span class="nt"&gt;--network&lt;/span&gt; my-bridge nginx

&lt;span class="c"&gt;# 3️⃣ Run another container (busybox) in the same network&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; client &lt;span class="nt"&gt;--network&lt;/span&gt; my-bridge busybox

&lt;span class="c"&gt;# 4️⃣ Inside 'client', you can ping 'my-app' by name&lt;/span&gt;
ping my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Result: &lt;code&gt;client&lt;/code&gt; can resolve and communicate with &lt;code&gt;my-app&lt;/code&gt; using container name thanks to Docker’s internal DNS in &lt;strong&gt;custom bridge networks&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Bonus Tip: Disconnect &amp;amp; Reconnect
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network disconnect my-bridge my-app    &lt;span class="c"&gt;# Disconnect from network&lt;/span&gt;
docker network connect my-bridge my-app       &lt;span class="c"&gt;# Reconnect to same or new network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Final Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧱 &lt;strong&gt;Default bridge&lt;/strong&gt; is basic → no name resolution, low security&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;User-defined bridge&lt;/strong&gt; is preferred for real-world apps&lt;/li&gt;
&lt;li&gt;🌍 Use &lt;strong&gt;overlay&lt;/strong&gt; for distributed microservices&lt;/li&gt;
&lt;li&gt;🧰 Know when to use each driver to optimize performance &amp;amp; security&lt;/li&gt;
&lt;li&gt;🧪 Always test communication with tools like &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;netcat&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🌐 Docker Networking Logic – Container Communication
&lt;/h1&gt;




&lt;h2&gt;
  
  
  ✅ 1. &lt;strong&gt;User-Defined Bridge Network = Container DNS Heaven 🧠&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🧩 When you create a &lt;strong&gt;user-defined bridge network&lt;/strong&gt;, Docker automatically enables an &lt;strong&gt;internal DNS service&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📦 That means containers can &lt;strong&gt;talk to each other by name&lt;/strong&gt;! 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create my-net

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; db &lt;span class="nt"&gt;--network&lt;/span&gt; my-net mongo
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web &lt;span class="nt"&gt;--network&lt;/span&gt; my-net node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Now, inside &lt;code&gt;web&lt;/code&gt;, you can:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Boom! It works because Docker auto-resolves &lt;code&gt;db&lt;/code&gt; → container's IP inside the same network.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ 2. Default Bridge Network = Only IP-Based Access 🔢
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Containers in the &lt;strong&gt;default bridge&lt;/strong&gt; cannot resolve each other by name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example:
&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app1 nginx       &lt;span class="c"&gt;# default bridge&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app2 busybox    &lt;span class="c"&gt;# default bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside &lt;code&gt;app2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping app1    &lt;span class="c"&gt;# ❌ FAILS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Because &lt;strong&gt;DNS resolution doesn’t work&lt;/strong&gt; in the default &lt;code&gt;bridge&lt;/code&gt; without using the old &lt;code&gt;--link&lt;/code&gt; option (now deprecated 🚫).&lt;/p&gt;




&lt;h2&gt;
  
  
  📛 Legacy &lt;code&gt;--link&lt;/code&gt; (Avoid Using It)
&lt;/h2&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; db mongo
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web &lt;span class="nt"&gt;--link&lt;/span&gt; db node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Works — but deprecated &amp;amp; removed in newer Docker versions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 3. Containers in Different Networks = 🚫 No Communication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create net-a
docker network create net-b

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app1 &lt;span class="nt"&gt;--network&lt;/span&gt; net-a nginx
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; app2 &lt;span class="nt"&gt;--network&lt;/span&gt; net-b busybox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside &lt;code&gt;app2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping app1    &lt;span class="c"&gt;# ❌ FAILS – isolated networks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🧱 Networks are isolated &lt;strong&gt;by default&lt;/strong&gt;. Containers on different bridge networks &lt;strong&gt;cannot talk to each other&lt;/strong&gt; unless you &lt;strong&gt;connect one container to both&lt;/strong&gt; using:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network connect net-a app2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;app2&lt;/code&gt; belongs to both networks!&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Real-World Analogy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧱 Default Bridge&lt;/td&gt;
&lt;td&gt;Talking in a crowd with no names, only IPs (👤192.168.x.x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 User-defined Bridge&lt;/td&gt;
&lt;td&gt;Talking in a chatroom where everyone has a username (📛 @web, &lt;a class="mentioned-user" href="https://dev.to/db"&gt;@db&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔌 Multi-Network&lt;/td&gt;
&lt;td&gt;Having one foot in two rooms 🦶🏽🚪&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Recap – Container Communication Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Communicate by name?&lt;/th&gt;
&lt;th&gt;Communicate by IP?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same user-defined bridge&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Best practice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same default bridge&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;No name resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different networks&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Unless manually connected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With &lt;code&gt;--link&lt;/code&gt; (legacy)&lt;/td&gt;
&lt;td&gt;⚠️ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Deprecated, avoid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;strong&gt;User-defined networks&lt;/strong&gt; allow &lt;strong&gt;name-based&lt;/strong&gt; communication via Docker's built-in DNS.&lt;/li&gt;
&lt;li&gt;🧱 &lt;strong&gt;Default bridge&lt;/strong&gt; networks &lt;strong&gt;don't support DNS&lt;/strong&gt; — only IPs.&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Each network is isolated&lt;/strong&gt; — containers inside a network can talk, but can't reach containers in &lt;strong&gt;other&lt;/strong&gt; networks unless &lt;strong&gt;manually connected&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;💡 Use &lt;code&gt;docker network connect&lt;/code&gt; to join a container to multiple networks if needed.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🌐 Overview of Advanced Docker Network Drivers
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Host-to-Container&lt;/th&gt;
&lt;th&gt;Container-to-Host&lt;/th&gt;
&lt;th&gt;Cross-Host Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cross-host container communication (Swarm)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;macvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assign real MAC &amp;amp; IP from LAN to container&lt;/td&gt;
&lt;td&gt;❌ No (by default)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ipvlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP-level control without creating MAC addresses&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1️⃣ 🌍 Overlay Network
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 What It Is:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Allows &lt;strong&gt;containers on different Docker hosts&lt;/strong&gt; to securely communicate as if they were on the same LAN.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;💡 Requires Docker Swarm (or other orchestrators).&lt;br&gt;
Creates an &lt;strong&gt;encrypted VXLAN tunnel&lt;/strong&gt; between hosts.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧠 Real-world Analogy:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Like a VPN that connects branch offices (containers) across cities (hosts).&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  ✅ Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-host microservices&lt;/li&gt;
&lt;li&gt;Docker Swarm services&lt;/li&gt;
&lt;li&gt;HA + distributed architecture&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🚀 How to Use (with Swarm):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Initialize Swarm&lt;/span&gt;
docker swarm init

&lt;span class="c"&gt;# 2. Create overlay network&lt;/span&gt;
docker network create &lt;span class="nt"&gt;--driver&lt;/span&gt; overlay my-overlay

&lt;span class="c"&gt;# 3. Deploy service to use overlay&lt;/span&gt;
docker service create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; webapp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--replicas&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; my-overlay &lt;span class="se"&gt;\&lt;/span&gt;
  nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔐 Key Features:
&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;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Encrypted traffic&lt;/td&gt;
&lt;td&gt;Uses IPSEC tunneling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Auto service discovery&lt;/td&gt;
&lt;td&gt;Works across nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Built-in load balancing&lt;/td&gt;
&lt;td&gt;Container-to-service routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Works with Docker Compose (v3+)&lt;/td&gt;
&lt;td&gt;Great for multi-host orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  2️⃣ 🪪 Macvlan Network
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔍 What It Is:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Allows containers to appear as &lt;strong&gt;physical devices on the host’s network&lt;/strong&gt;, each with their &lt;strong&gt;own IP and MAC&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;💡 The container &lt;strong&gt;bypasses Docker’s NAT&lt;/strong&gt;, appearing directly on your LAN.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 Real-world Analogy:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Like plugging a new computer (container) directly into your office switch with its own IP.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  ✅ Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Legacy apps that require static IPs or MACs&lt;/li&gt;
&lt;li&gt;IoT, embedded, or bare metal simulation&lt;/li&gt;
&lt;li&gt;When containers must be reachable &lt;strong&gt;from the LAN directly&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🚀 How to Use:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Create macvlan network&lt;/span&gt;
docker network create &lt;span class="nt"&gt;-d&lt;/span&gt; macvlan &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eth0 &lt;span class="se"&gt;\&lt;/span&gt;
  macvlan-net

&lt;span class="c"&gt;# 2. Run a container on that network&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; myrouter &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; macvlan-net &lt;span class="se"&gt;\&lt;/span&gt;
  busybox &lt;span class="nb"&gt;sleep &lt;/span&gt;3600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 &lt;code&gt;parent=eth0&lt;/code&gt;: your physical host’s network interface&lt;/p&gt;


&lt;h3&gt;
  
  
  ⚠️ Limitations:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Limitation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚫 No container-to-host&lt;/td&gt;
&lt;td&gt;Can't ping container from host by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Can bypass Docker security stack&lt;/td&gt;
&lt;td&gt;Be cautious in shared infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌍 Requires IP address planning&lt;/td&gt;
&lt;td&gt;Must avoid IP conflicts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  🛠 Tip to Enable Host ↔ Container Communication (Workaround):
&lt;/h3&gt;

&lt;p&gt;Create a &lt;strong&gt;dummy interface&lt;/strong&gt; on the host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip &lt;span class="nb"&gt;link &lt;/span&gt;add macvlan-shim &lt;span class="nb"&gt;link &lt;/span&gt;eth0 &lt;span class="nb"&gt;type &lt;/span&gt;macvlan mode bridge
ip addr add 192.168.1.200/24 dev macvlan-shim
ip &lt;span class="nb"&gt;link set &lt;/span&gt;macvlan-shim up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ 🧬 IPvlan Network
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 What It Is:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Similar to macvlan, but &lt;strong&gt;no extra MACs per container&lt;/strong&gt;.&lt;br&gt;
All containers &lt;strong&gt;share host’s MAC&lt;/strong&gt;, just get different IPs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;⚙️ More compatible with cloud and DHCP setups where duplicate MACs are not allowed.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Analogy:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Multiple workers using one ID card (MAC) but different phone numbers (IP).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ✅ Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Performance-sensitive systems&lt;/li&gt;
&lt;li&gt;Cloud infra with MAC restrictions&lt;/li&gt;
&lt;li&gt;Advanced network routing with minimal overhead&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚀 How to Use:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create &lt;span class="nt"&gt;-d&lt;/span&gt; ipvlan &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eth0 &lt;span class="se"&gt;\&lt;/span&gt;
  ipvlan-net

docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; ipvlan-net alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 IPvlan supports two modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;l2&lt;/code&gt;: Same subnet, like macvlan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;l3&lt;/code&gt;: Different subnet, routing via host&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ Benefits:
&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;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Efficient&lt;/td&gt;
&lt;td&gt;No MAC duplication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 More predictable IP rules&lt;/td&gt;
&lt;td&gt;Good for secured environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧰 Custom routing support&lt;/td&gt;
&lt;td&gt;Great for advanced network setups&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  📊 Advanced Network Drivers Comparison Table
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature/Driver&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;overlay&lt;/code&gt; 🌍&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;macvlan&lt;/code&gt; 🪪&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;ipvlan&lt;/code&gt; 🧬&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-host support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires Swarm?&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uses physical IP/MAC&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (IP only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host ↔ container communication&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (manual fix)&lt;/td&gt;
&lt;td&gt;✅ (limited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Microservices on multiple hosts&lt;/td&gt;
&lt;td&gt;LAN-level communication&lt;/td&gt;
&lt;td&gt;Custom IP routing or cloud infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security model&lt;/td&gt;
&lt;td&gt;Swarm-controlled&lt;/td&gt;
&lt;td&gt;Exposes real IP on LAN&lt;/td&gt;
&lt;td&gt;More controlled than macvlan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;td&gt;🔴 High&lt;/td&gt;
&lt;td&gt;🟠 Medium-High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Security Considerations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;th&gt;Security Tip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overlay&lt;/td&gt;
&lt;td&gt;Isolated per service; enable encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macvlan&lt;/td&gt;
&lt;td&gt;Bypasses Docker’s firewall — isolate via VLAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPvlan&lt;/td&gt;
&lt;td&gt;Good firewall compatibility; still isolate with subnet rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔁 When to Use What?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Use Driver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔀 Multi-host Swarm deployments&lt;/td&gt;
&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📡 Direct LAN access required&lt;/td&gt;
&lt;td&gt;&lt;code&gt;macvlan&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧬 Controlled IP mapping, no MAC exposure&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ipvlan&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;overlay&lt;/code&gt;: Best for &lt;strong&gt;Swarm&lt;/strong&gt;, cross-node services, scalable infra&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;macvlan&lt;/code&gt;: Best for &lt;strong&gt;LAN visibility&lt;/strong&gt;, legacy hardware, IP-bound apps&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ipvlan&lt;/code&gt;: Best for &lt;strong&gt;performance&lt;/strong&gt; and &lt;strong&gt;controlled environments&lt;/strong&gt; (e.g., cloud)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚫 Docker &lt;code&gt;none&lt;/code&gt; Network Driver – Ultimate Guide
&lt;/h2&gt;




&lt;h2&gt;
  
  
  ❓ What is the &lt;code&gt;none&lt;/code&gt; Network?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;none&lt;/code&gt; network is a special Docker network driver that &lt;strong&gt;completely disables networking&lt;/strong&gt; for a container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🚫 No IP address&lt;br&gt;
🚫 No routing&lt;br&gt;
🚫 No DNS&lt;br&gt;
🚫 No internet access&lt;br&gt;
🚫 No communication with host or other containers&lt;/p&gt;


&lt;h3&gt;
  
  
  🔐 Use Case:
&lt;/h3&gt;

&lt;p&gt;When you want your container to &lt;strong&gt;run in complete isolation&lt;/strong&gt;, especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ CPU-intensive or file-only tasks&lt;/li&gt;
&lt;li&gt;✅ Secure environments with no external communication&lt;/li&gt;
&lt;li&gt;✅ Containers that interact only via &lt;strong&gt;volume sharing&lt;/strong&gt; or &lt;strong&gt;IPC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Avoiding &lt;strong&gt;network-related attacks&lt;/strong&gt; (like SSRF, port scanning, etc.)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧠 Real-World Analogy
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s like putting a person in a &lt;strong&gt;soundproof, windowless room&lt;/strong&gt; 🧍‍♂️🔇&lt;br&gt;
They can compute, read, or write files – but &lt;strong&gt;cannot talk or hear&lt;/strong&gt; the outside world.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧪 How to Use It
&lt;/h2&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;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; none alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then inside the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com   &lt;span class="c"&gt;# ❌ Fails&lt;/span&gt;
ip addr            &lt;span class="c"&gt;# Shows no IP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ The container runs, but it’s &lt;strong&gt;completely cut off&lt;/strong&gt; from any kind of networking.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Check from the Host
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect &amp;lt;container-id&amp;gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"NetworkMode"&lt;/span&gt;
&lt;span class="c"&gt;# Output: "NetworkMode": "none"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧰 Useful Scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Why &lt;code&gt;none&lt;/code&gt; Works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧮 Data processing / math computation&lt;/td&gt;
&lt;td&gt;Doesn't need the internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Security sandboxing&lt;/td&gt;
&lt;td&gt;No attack vector via networking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Testing firewall rules&lt;/td&gt;
&lt;td&gt;Simulate “no internet” condition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧊 Build-only stages&lt;/td&gt;
&lt;td&gt;Avoid leaking credentials over network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 DevOps CI/CD&lt;/td&gt;
&lt;td&gt;Run isolated build/test tasks with no exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📛 Warning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;cannot &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;apt update&lt;/code&gt;, or download&lt;/strong&gt; anything inside containers using &lt;code&gt;--network none&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Any tools that require internet or inter-container access will &lt;strong&gt;fail&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It's &lt;strong&gt;not usable&lt;/strong&gt; for most microservices or web APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Tip: Combine with Volumes or IPC
&lt;/h2&gt;

&lt;p&gt;If you want to &lt;strong&gt;exchange data&lt;/strong&gt; without a network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a shared volume&lt;/span&gt;
docker volume create shared-data

&lt;span class="c"&gt;# Use it with the isolated container&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; none &lt;span class="nt"&gt;-v&lt;/span&gt; shared-data:/data alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ This lets you read/write to shared storage &lt;strong&gt;without needing any network access.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 Summary Table
&lt;/h2&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;
&lt;code&gt;none&lt;/code&gt; Driver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host access&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container-to-container&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Security, sandboxing, isolated compute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Final Verdict
&lt;/h2&gt;

&lt;p&gt;If you need &lt;strong&gt;absolute network isolation&lt;/strong&gt;, &lt;code&gt;--network none&lt;/code&gt; is your &lt;strong&gt;zero-trust go-to option&lt;/strong&gt;.&lt;br&gt;
It’s perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 Security-first workloads&lt;/li&gt;
&lt;li&gt;🧪 Testing internal-only logic&lt;/li&gt;
&lt;li&gt;🚫 Disabling all remote calls&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>docker</category>
      <category>networking</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🔒 Why Secure User Management in Docker Matters?</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:10:57 +0000</pubDate>
      <link>https://dev.to/dpvasani56/why-secure-user-management-in-docker-matters-1hk2</link>
      <guid>https://dev.to/dpvasani56/why-secure-user-management-in-docker-matters-1hk2</guid>
      <description>&lt;h1&gt;
  
  
  🔒 Why Secure User Management in Docker Matters?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;🧠 By default, Docker containers run processes as &lt;strong&gt;root&lt;/strong&gt;, which is:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;huge security risk&lt;/strong&gt; 🧨&lt;/li&gt;
&lt;li&gt;Can lead to &lt;strong&gt;host exploitation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bad for &lt;strong&gt;CI/CD and prod environments&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ NEVER ship containers that run as root in production!
&lt;/h3&gt;




&lt;h2&gt;
  
  
  🔍 Real-World Analogy
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🏡 Giving root access is like giving a guest 🔓 &lt;em&gt;the master key to your house&lt;/em&gt;, including bank vaults, server room, and more.&lt;br&gt;
🧑‍💻 Instead, give them &lt;strong&gt;only what they need&lt;/strong&gt; – just one room!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  ✅ How to Add a Secure User in Docker
&lt;/h1&gt;

&lt;h3&gt;
  
  
  📦 Example (Linux-based):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a group &amp;amp; user with no login shell&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--gid&lt;/span&gt; 1001 appgroup &lt;span class="se"&gt;\
&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--uid&lt;/span&gt; 1001 &lt;span class="nt"&gt;--ingroup&lt;/span&gt; appgroup &lt;span class="nt"&gt;--disabled-password&lt;/span&gt; appuser

&lt;span class="c"&gt;# Switch to non-root user&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔑 Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--system&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Marks as a system-level user/group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--disabled-password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents password login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USER appuser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs all next steps as a &lt;strong&gt;non-root user&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔁 Typical Secure Dockerfile Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&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 and build with root privileges&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build

&lt;span class="c"&gt;# 🔒 Create a secure user&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-S&lt;/span&gt; appgroup &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; adduser &lt;span class="nt"&gt;-S&lt;/span&gt; appuser &lt;span class="nt"&gt;-G&lt;/span&gt; appgroup

&lt;span class="c"&gt;# ✅ Drop privileges&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Best Practices for Secure User Management
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅ Best Practice&lt;/th&gt;
&lt;th&gt;💬 Why It’s Important&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧑‍💻 &lt;strong&gt;Avoid root&lt;/strong&gt; in final image&lt;/td&gt;
&lt;td&gt;Reduces attack surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Use &lt;code&gt;USER&lt;/code&gt; instruction&lt;/td&gt;
&lt;td&gt;Ensures all commands run as non-root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📂 Set correct permissions (&lt;code&gt;chown&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ensure new user can access copied files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 Audit with &lt;code&gt;docker scan&lt;/code&gt; or &lt;code&gt;trivy&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Catch misconfigurations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👁️ Keep image minimal&lt;/td&gt;
&lt;td&gt;Less packages = fewer CVEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📜 Use &lt;code&gt;.dockerignore&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Prevent leaking &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;keys&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛡️ Preventing Permission Issues with Files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=appuser:appgroup . .&lt;/span&gt;

&lt;span class="c"&gt;# OR fix it manually&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; appuser:appgroup /app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Ensures the &lt;code&gt;appuser&lt;/code&gt; has access to source files&lt;br&gt;
⛔ Otherwise you might get &lt;code&gt;EACCES&lt;/code&gt; or permission denied errors.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔐 Dockerfile Security Summary Table
&lt;/h2&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;Good Practice&lt;/th&gt;
&lt;th&gt;Why?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use non-root user&lt;/td&gt;
&lt;td&gt;🧱 Least privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;--chown&lt;/code&gt; flag&lt;/td&gt;
&lt;td&gt;🧽 File ownership fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Avoid &lt;code&gt;sudo&lt;/code&gt;, limit shell access&lt;/td&gt;
&lt;td&gt;🔒 Prevent privilege escalation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ENTRYPOINT&lt;/code&gt;/&lt;code&gt;CMD&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Should not run as root&lt;/td&gt;
&lt;td&gt;✅ Always run app as secure user&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧪 Check Current User in Container
&lt;/h2&gt;

&lt;p&gt;You can debug by checking UID:&lt;br&gt;
&lt;/p&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;-it&lt;/span&gt; your-image &lt;span class="nb"&gt;whoami
&lt;/span&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; your-image &lt;span class="nb"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧰 Bonus Tip: Use Docker Compose Securely
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpvasani56/secure-api&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1001:1001"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 You can enforce user ID even if Dockerfile doesn’t specify it.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Final Checklist for Secure User Management
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅ Task&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create system user &amp;amp; group&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign proper UID:GID&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch user with &lt;code&gt;USER&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set file ownership (&lt;code&gt;--chown&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove unnecessary packages&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test permissions inside container&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>webdev</category>
      <category>docker</category>
      <category>devops</category>
      <category>development</category>
    </item>
    <item>
      <title>🧱 What is a Multi-Stage Build in Docker?</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:09:36 +0000</pubDate>
      <link>https://dev.to/dpvasani56/what-is-a-multi-stage-build-in-docker-5cfl</link>
      <guid>https://dev.to/dpvasani56/what-is-a-multi-stage-build-in-docker-5cfl</guid>
      <description>&lt;h1&gt;
  
  
  🧱 What is a Multi-Stage Build in Docker?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Multi-stage build&lt;/strong&gt; allows you to use &lt;strong&gt;multiple &lt;code&gt;FROM&lt;/code&gt; statements&lt;/strong&gt; in a single Dockerfile to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build the app in one stage 🏗️&lt;/li&gt;
&lt;li&gt;Copy only what's needed to a smaller final image 📦&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ❓ Why Do We Need It?
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Main Goals:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🚀 Benefit&lt;/th&gt;
&lt;th&gt;💬 Why it Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Smaller Images&lt;/td&gt;
&lt;td&gt;Only copy what's needed into final image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 More Secure&lt;/td&gt;
&lt;td&gt;No dev tools or secrets in production image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛠️ Cleaner CI/CD&lt;/td&gt;
&lt;td&gt;Separate build &amp;amp; runtime environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📚 Better Layer Caching&lt;/td&gt;
&lt;td&gt;Speeds up builds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌍 Environment Separation&lt;/td&gt;
&lt;td&gt;One image builds everything!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Real-World Analogy
&lt;/h2&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏗️ Stage 1 = Construction site (messy, heavy tools)&lt;/li&gt;
&lt;li&gt;🏠 Stage 2 = Finished house (clean, cozy)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You &lt;strong&gt;build&lt;/strong&gt; in the messy environment, but &lt;strong&gt;only move the furniture&lt;/strong&gt; into the clean house. 🧹&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Multi-Stage Build Syntax
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# 🔨 Stage 1: Build Stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&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="k"&gt;RUN &lt;/span&gt;npm ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# 📦 Stage 2: Final Production Image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&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 only final build artifacts (no source or node_modules)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/dist ./dist&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/package.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# Set env vars, port and run&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=3000&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Key Concepts Explained
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AS builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Give a name to this stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--from=builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy files from previous stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm ci --omit=dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install only production deps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY . .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Used only in build stage to avoid code bloat in final image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📦 Before vs After: Image Size
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Image Size&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;😵‍💫 Traditional Single Build&lt;/td&gt;
&lt;td&gt;~900MB&lt;/td&gt;
&lt;td&gt;Full source code + dev dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤩 Multi-Stage Build&lt;/td&gt;
&lt;td&gt;~200MB&lt;/td&gt;
&lt;td&gt;Just built app + runtime dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💥 Real Project Example: React App
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Build React App&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&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="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Step 2: Serve using NGINX&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/build /usr/share/nginx/html&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ This builds the app with Node.js, and serves the static files via NGINX (no Node.js in final image!)&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Common Multi-Stage Use Cases
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💻 Frontend builds&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;node&lt;/code&gt; + &lt;code&gt;nginx&lt;/code&gt; combo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Backend builds&lt;/td&gt;
&lt;td&gt;Build with TS/Go/Rust, then copy binaries only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Testing stage&lt;/td&gt;
&lt;td&gt;Add test/linting in one stage, skip in final&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 CI/CD pipelines&lt;/td&gt;
&lt;td&gt;Clean, reproducible builds across stages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧰 Pro Tips &amp;amp; Best Practices
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;💡 Tip&lt;/th&gt;
&lt;th&gt;✅ Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Use &lt;code&gt;--omit=dev&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Strip dev-only packages in final stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use &lt;code&gt;.dockerignore&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Exclude &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;tests/&lt;/code&gt;, etc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use labels&lt;/td&gt;
&lt;td&gt;Add metadata like version, author, etc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Don’t copy everything&lt;/td&gt;
&lt;td&gt;Use exact &lt;code&gt;COPY&lt;/code&gt; paths for size control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use named stages&lt;/td&gt;
&lt;td&gt;Easier to copy from (&lt;code&gt;--from=builder&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep final image minimal&lt;/td&gt;
&lt;td&gt;Just enough to run your app (no tools!)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 Combine with Docker Compose
&lt;/h2&gt;

&lt;p&gt;You can define multi-stage builds in your Dockerfile and just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose build
docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your services will use the optimized final image automatically 🧠✅&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Example Multi-Stage for TypeScript API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stage 1: Compile TS&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&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="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Stage 2: Run with only JS output&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/dist ./dist&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Summary: When to Use Multi-Stage Builds?
&lt;/h2&gt;

&lt;p&gt;✅ Always use if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're using &lt;strong&gt;build tools&lt;/strong&gt; like &lt;code&gt;tsc&lt;/code&gt;, &lt;code&gt;webpack&lt;/code&gt;, &lt;code&gt;vite&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;minimal production images&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;separate testing/staging/building&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;faster CI builds&lt;/strong&gt; &amp;amp; smaller attack surface&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Final TL;DR Cheatsheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Base Image&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stage 1 (builder)&lt;/td&gt;
&lt;td&gt;Build, compile, test&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;node&lt;/code&gt;, &lt;code&gt;golang&lt;/code&gt;, &lt;code&gt;rust&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/dist&lt;/code&gt;, &lt;code&gt;/build&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 2 (prod)&lt;/td&gt;
&lt;td&gt;Serve/run app only&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;node:alpine&lt;/code&gt;, &lt;code&gt;nginx&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;Final slim image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📦 Full Dockerfile (Context Recap)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine3.19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;

&lt;span class="c"&gt;# Stage 1: Build Stuff&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /home/build&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="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; tsconfig.json .&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="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/ src/&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Stage 2: Runner&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runner&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /home/app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /home/build/dist dist/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /home/build/package*.json .&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="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--gid&lt;/span&gt; 1001 nodejs
&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--uid&lt;/span&gt; 1001 nodejs

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nodejs&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=8000&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;h1&gt;
  
  
  🎯 A2Z Breakdown of Each Section
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🧱 &lt;code&gt;FROM node:20-alpine3.19 as base&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;🧠 &lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starts from a &lt;strong&gt;minimal Node.js 20 Alpine image&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Alpine is lightweight (~5MB), good for small, fast images&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;as base&lt;/code&gt; names this stage for reuse&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🧩 Think of &lt;code&gt;base&lt;/code&gt; like a shared template that both stages use.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔨 &lt;strong&gt;Stage 1: Builder&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /home/build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔧 &lt;strong&gt;What happens here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We &lt;strong&gt;switch to a new build stage&lt;/strong&gt;, using &lt;code&gt;base&lt;/code&gt; image&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /home/build&lt;/code&gt; sets a directory for our build process&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json .&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; tsconfig.json .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📦 &lt;strong&gt;Install dependencies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;package*.json&lt;/code&gt; copied to install dependencies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tsconfig.json&lt;/code&gt; is required for TypeScript compilation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; installs &lt;strong&gt;all dependencies&lt;/strong&gt; (dev + prod)&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/ src/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ &lt;strong&gt;Build your app:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copies your app's TypeScript code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run build&lt;/code&gt; compiles TS into JS → typically inside &lt;code&gt;/dist&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ End Result of Stage 1:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A folder &lt;code&gt;/home/build/dist&lt;/code&gt; with compiled production-ready JS output.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Stage 2: Runner&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runner&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /home/app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We now create a fresh container just for &lt;strong&gt;running&lt;/strong&gt; the app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /home/app&lt;/code&gt; is where your app will run from.&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /home/build/dist dist/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /home/build/package*.json .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📂 &lt;strong&gt;Copy built artifacts only:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only copy the &lt;code&gt;dist/&lt;/code&gt; folder and package files (no source, no tsconfig)&lt;/li&gt;
&lt;li&gt;Ensures the final image is &lt;strong&gt;slim &amp;amp; clean&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 &lt;strong&gt;Production-only install:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installs &lt;strong&gt;only prod dependencies&lt;/strong&gt; (no dev tools like &lt;code&gt;eslint&lt;/code&gt;, &lt;code&gt;tsc&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Keeps final image light and secure ✅&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👮 Add Secure Non-Root User
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--gid&lt;/span&gt; 1001 nodejs
&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--uid&lt;/span&gt; 1001 nodejs
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nodejs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 &lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running as &lt;code&gt;root&lt;/code&gt; is dangerous in containers ❌&lt;/li&gt;
&lt;li&gt;We create a user &lt;code&gt;nodejs&lt;/code&gt; with &lt;strong&gt;limited permissions&lt;/strong&gt; for safety&lt;/li&gt;
&lt;li&gt;UID/GID &lt;code&gt;1001&lt;/code&gt; is just an arbitrary non-root system user&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 Port &amp;amp; Env Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EXPOSE 8000&lt;/code&gt;: Documents that the app uses port 8000&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ENV PORT=8000&lt;/code&gt;: Sets the default port for app to use internally&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;You still need to use &lt;code&gt;-p&lt;/code&gt; to map it to host:&lt;br&gt;
&lt;code&gt;docker run -p 8000:8000 &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚦 Start the App
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&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;p&gt;🟢 &lt;strong&gt;Default entrypoint&lt;/strong&gt; when container runs&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This triggers your &lt;code&gt;"start"&lt;/code&gt; script from &lt;code&gt;package.json&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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 dist/index.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔹 Section&lt;/th&gt;
&lt;th&gt;🔍 Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM base&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reuse image to reduce duplication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compiles TypeScript into JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs a minimal production image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm install&lt;/code&gt; in builder&lt;/td&gt;
&lt;td&gt;Installs full deps for building&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm install --omit=dev&lt;/code&gt; in runner&lt;/td&gt;
&lt;td&gt;Installs only what's needed to run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY --from=builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Efficient file copy without rebuild&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USER nodejs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enhances container security&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📊 Resulting Benefits
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🚀 Benefit&lt;/th&gt;
&lt;th&gt;✅ Achieved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small Image&lt;/td&gt;
&lt;td&gt;✅ Only runtime code in final image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secure&lt;/td&gt;
&lt;td&gt;✅ Non-root user, no dev tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Faster Builds&lt;/td&gt;
&lt;td&gt;✅ Reuses build layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean Code Separation&lt;/td&gt;
&lt;td&gt;✅ No TypeScript or build files inside final container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portable&lt;/td&gt;
&lt;td&gt;✅ Can run on any platform with Node 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Bonus Tip: View Image Sizes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the &lt;strong&gt;multi-stage image (~100MB)&lt;/strong&gt; vs a &lt;strong&gt;single-stage image (~400–600MB)&lt;/strong&gt; 🤯&lt;/p&gt;




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

&lt;blockquote&gt;
&lt;p&gt;This approach follows &lt;strong&gt;Docker best practices&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-stage&lt;/li&gt;
&lt;li&gt;Production-ready&lt;/li&gt;
&lt;li&gt;Secure by default&lt;/li&gt;
&lt;li&gt;Reproducible builds&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




</description>
      <category>docker</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>🧩 Docker Layer Caching</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 08:06:51 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-layer-caching-2i84</link>
      <guid>https://dev.to/dpvasani56/docker-layer-caching-2i84</guid>
      <description>&lt;h2&gt;
  
  
  🧩 Docker Layer Caching: What &amp;amp; Why?
&lt;/h2&gt;

&lt;p&gt;When you build a Docker image, &lt;strong&gt;each instruction (like &lt;code&gt;COPY&lt;/code&gt;, &lt;code&gt;RUN&lt;/code&gt;, etc.) creates a layer&lt;/strong&gt;. Docker caches these layers 🔄 so it can &lt;strong&gt;reuse them in future builds&lt;/strong&gt;, making things faster!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Why Layer Order Matters
&lt;/h2&gt;

&lt;p&gt;Docker reads your &lt;code&gt;Dockerfile&lt;/code&gt; &lt;strong&gt;top to bottom&lt;/strong&gt; 📜⬇️&lt;br&gt;
The &lt;strong&gt;first changed line invalidates the cache&lt;/strong&gt; for all lines after it ❌🚫&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 Example: Bad vs Good Sequence
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🚫 &lt;strong&gt;BAD Dockerfile (Unoptimized Layer Order)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .        # ❌ Copies everything first (even changing README breaks cache)&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;# Cache busts often!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ✅ &lt;strong&gt;GOOD Dockerfile (Optimized Layer Order)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./  # ✅ Only changes when dependencies change&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;# ✅ Reused most of the time&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .               # ✅ Source code comes after&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you copy the whole source &lt;strong&gt;before installing deps&lt;/strong&gt;, &lt;strong&gt;any code change breaks the cache for dependencies!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;By copying just &lt;code&gt;package.json&lt;/code&gt; first, Docker only re-installs when dependencies change.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Recommended Layer Order Cheat Sheet 📝
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Why It Comes Here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base image, foundation layer 🏗️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WORKDIR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set working directory 📁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY package*.json ./&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dependency file copied first for caching 🧃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;RUN npm ci&lt;/code&gt; or &lt;code&gt;RUN npm install&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Install deps (caches as long as package.json doesn’t change) 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY . .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Now copy the actual app code 🧑‍💻&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;EXPOSE&lt;/code&gt; &amp;amp; &lt;code&gt;ENV&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Doesn’t affect cache much, but goes here 🔌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entrypoint, doesn't affect caching 🟢&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Pro Caching Tips
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;💡 Tip&lt;/th&gt;
&lt;th&gt;🛠️ Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧩 Use &lt;code&gt;.dockerignore&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Prevent unnecessary files (e.g. &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;) from breaking cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Use &lt;code&gt;npm ci&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Faster and more reproducible in CI/CD than &lt;code&gt;npm install&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧑‍🏭 Split dev &amp;amp; prod builds&lt;/td&gt;
&lt;td&gt;Use multi-stage builds to keep production images small and cache efficient.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Use exact base versions&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;node:20-alpine&lt;/code&gt; instead of &lt;code&gt;node:alpine&lt;/code&gt; to avoid unexpected cache busts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Visual Analogy
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of Docker caching like making &lt;strong&gt;layered sandwiches 🥪&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🥖 If you change the base bread (early layers), the whole sandwich needs to be rebuilt.&lt;/li&gt;
&lt;li&gt;🧀 But if you change just the top slice of tomato 🍅 (code), you don’t need to rebuild the whole thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔁 Final Thought
&lt;/h2&gt;

&lt;p&gt;💬 &lt;strong&gt;Always structure your Dockerfile to keep slow-changing layers at the top&lt;/strong&gt; and fast-changing layers (like source code) at the bottom — this will save build time ⏱️ and make CI/CD faster ⚡.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>📘 Complete Docker Image Publishing CheatSheet 🐳🚀</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Fri, 11 Jul 2025 15:12:09 +0000</pubDate>
      <link>https://dev.to/dpvasani56/complete-docker-image-publishing-cheatsheet-jo4</link>
      <guid>https://dev.to/dpvasani56/complete-docker-image-publishing-cheatsheet-jo4</guid>
      <description>&lt;h1&gt;
  
  
  📘 Complete Docker Image Publishing CheatSheet 🐳🚀
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🌐 What is a Docker Registry?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Docker registry&lt;/strong&gt; is a &lt;strong&gt;storage for Docker images&lt;/strong&gt; 🗃️. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Push&lt;/strong&gt; your custom images to it&lt;/li&gt;
&lt;li&gt;📥 &lt;strong&gt;Pull&lt;/strong&gt; images when needed&lt;/li&gt;
&lt;li&gt;🔐 Optionally &lt;strong&gt;set them private/public&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏠 Popular Registries:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🐳 Docker Hub (hub.docker.com)&lt;/li&gt;
&lt;li&gt;🔐 GitHub Container Registry (ghcr.io)&lt;/li&gt;
&lt;li&gt;☁️ Google Artifact Registry / Amazon ECR / GitLab / Azure ACR&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Structure of Docker Image Name
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;registry&amp;gt;/&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;:&amp;lt;tag&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Registry&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;docker.io&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;Where image is stored 🌍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dpvasani56&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your DockerHub or GitHub ID 👤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;node-application&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your app/project name 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tag&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;latest&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Version tag 🏷️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Two Ways to Publish Docker Image to Docker Hub
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 Step 0: Build the image
&lt;/h3&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; dpvasani56/node-application:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧭 Method 1: &lt;strong&gt;Manual Push to Docker Hub&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✅ Step-by-step:
&lt;/h4&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Login to Docker Hub&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 Enter your Docker Hub username and password.&lt;/p&gt;




&lt;p&gt;2️⃣ &lt;strong&gt;Push your image&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Image will now appear on your Docker Hub at:&lt;br&gt;
📍 &lt;code&gt;https://hub.docker.com/r/dpvasani56/node-application&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;Pull from any system&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Then run:&lt;br&gt;
&lt;/p&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 dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧠 Method 2: &lt;strong&gt;Push from GitHub via GitHub Container Registry (ghcr.io)&lt;/strong&gt;
&lt;/h3&gt;




&lt;h3&gt;
  
  
  🔧 Step-by-step:
&lt;/h3&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Create a GitHub repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Name it like: &lt;code&gt;node-application&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;2️⃣ &lt;strong&gt;Login to GitHub Container Registry&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &amp;lt;GH_TOKEN&amp;gt; | docker login ghcr.io &lt;span class="nt"&gt;-u&lt;/span&gt; USERNAME &lt;span class="nt"&gt;--password-stdin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Use a &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt; from GitHub with &lt;code&gt;write:packages&lt;/code&gt; permission.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;3️⃣ &lt;strong&gt;Tag your image&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag node-application ghcr.io/dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;4️⃣ &lt;strong&gt;Push to GitHub Container Registry&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push ghcr.io/dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Image is now available at:&lt;br&gt;
🔗 &lt;code&gt;https://github.com/dpvasani56/packages&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 Tagging Summary
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tag for DockerHub&lt;/span&gt;
docker tag node-application dpvasani56/node-application:v1

&lt;span class="c"&gt;# Tag for GitHub Registry&lt;/span&gt;
docker tag node-application ghcr.io/dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧼 Optional Cleanup
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;image-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use this to save space once pushed.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Bonus: Automate with GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Use this snippet in &lt;code&gt;.github/workflows/docker.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push_to_registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Log in to GitHub Container Registry&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "${{ secrets.GH_PAT }}" | docker login ghcr.io -u dpvasani56 --password-stdin&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Push&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t ghcr.io/dpvasani56/node-application:v1 .&lt;/span&gt;
          &lt;span class="s"&gt;docker push ghcr.io/dpvasani56/node-application:v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Set &lt;code&gt;GH_PAT&lt;/code&gt; as a GitHub secret with correct permissions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Quick Recap Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Docker Hub&lt;/th&gt;
&lt;th&gt;GitHub Container Registry&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Login&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker login ghcr.io&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker push dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker push ghcr.io/dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker pull dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker pull ghcr.io/dpvasani56/app:v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Sample Push Command (Your Request)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ This pushes your image to Docker Hub under your account.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏷️ Step-by-Step: Tag &amp;amp; Push Docker Image to Docker Hub (&lt;code&gt;dpvasani56/node-application&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Assume your image is locally named:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you want to push it as:&lt;br&gt;
📦 &lt;code&gt;dpvasani56/node-application&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  🔧 Step 1: Tag the Image
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;🏷️ Think of this as &lt;strong&gt;giving your image a Docker Hub label&lt;/strong&gt; 🎫&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag my-app dpvasani56/node-application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ This tags your image for Docker Hub upload.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Optional: Add a Version Tag
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag my-app dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 This is better for &lt;strong&gt;version control&lt;/strong&gt; in CI/CD and releases.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 Step 2: Login to Docker Hub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Enter Docker Hub credentials for &lt;strong&gt;&lt;code&gt;dpvasani56&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  📤 Step 3: Push the Image
&lt;/h3&gt;

&lt;h4&gt;
  
  
  👉 With version tag:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  👉 Or default (&lt;code&gt;latest&lt;/code&gt; tag):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push dpvasani56/node-application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Image now available at:&lt;br&gt;
🔗 &lt;a href="https://hub.docker.com/r/dpvasani56/node-application" rel="noopener noreferrer"&gt;https://hub.docker.com/r/dpvasani56/node-application&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  📥 Step 4: Pull &amp;amp; Use It Anywhere
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run the app:&lt;br&gt;
&lt;/p&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 dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 All Commands Recap
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 🔨 Build your image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# 🏷️ Tag for Docker Hub&lt;/span&gt;
docker tag my-app dpvasani56/node-application:v1

&lt;span class="c"&gt;# 🔐 Login to Docker Hub&lt;/span&gt;
docker login

&lt;span class="c"&gt;# 📤 Push to Docker Hub&lt;/span&gt;
docker push dpvasani56/node-application:v1

&lt;span class="c"&gt;# 📥 Pull from Docker Hub (anywhere)&lt;/span&gt;
docker pull dpvasani56/node-application:v1

&lt;span class="c"&gt;# ▶️ Run it&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 dpvasani56/node-application:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Helpful Tips
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View tagged images locally 🗂️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rmi &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove an image locally 🧹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View running containers 🚀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker stop &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop a container manually 🛑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>docker</category>
      <category>javascript</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🧭 Docker Port Mapping &amp; CLI Flag CheatSheet</title>
      <dc:creator>Darshan Vasani</dc:creator>
      <pubDate>Fri, 11 Jul 2025 15:11:02 +0000</pubDate>
      <link>https://dev.to/dpvasani56/docker-port-mapping-cli-flag-cheatsheet-cm</link>
      <guid>https://dev.to/dpvasani56/docker-port-mapping-cli-flag-cheatsheet-cm</guid>
      <description>&lt;h1&gt;
  
  
  🧭 Docker Port Mapping &amp;amp; CLI Flag CheatSheet
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🚪 Port Mapping 101: &lt;code&gt;-p&lt;/code&gt; vs &lt;code&gt;-P&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Analogy&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p &amp;lt;host&amp;gt;:&amp;lt;container&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Map host port to container port&lt;/td&gt;
&lt;td&gt;Custom Door Mapping 🚪&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p 8080:3000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;-P&lt;/code&gt; (uppercase)&lt;/td&gt;
&lt;td&gt;Auto-map all exposed ports to random host ports&lt;/td&gt;
&lt;td&gt;🔀 Auto Door Mapping&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🎯 Example 1: Manual Mapping with &lt;code&gt;-p&lt;/code&gt;
&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; 8080:3000 my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🔧 Host port &lt;strong&gt;8080&lt;/strong&gt; mapped to container's &lt;strong&gt;3000&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Access via &lt;code&gt;localhost:8080&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🎲 Example 2: Auto Mapping with &lt;code&gt;-P&lt;/code&gt;
&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; my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Maps &lt;strong&gt;ALL &lt;code&gt;EXPOSE&lt;/code&gt;d ports&lt;/strong&gt; to &lt;strong&gt;random available host ports&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;View with &lt;code&gt;docker ps&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 Multiple Port Mappings
&lt;/h2&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 &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 my-multi-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Maps &lt;strong&gt;multiple services/APIs&lt;/strong&gt; or frontend/backend apps&lt;/li&gt;
&lt;li&gt;Great for full-stack containers!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📡 Exposing Ports in Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000 5000 7000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🧠 Note:&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;EXPOSE&lt;/code&gt; is &lt;strong&gt;just documentation&lt;/strong&gt; for which ports the container listens to.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It &lt;strong&gt;does not&lt;/strong&gt; publish or map ports. Use &lt;code&gt;-p&lt;/code&gt; or &lt;code&gt;-P&lt;/code&gt; in &lt;code&gt;docker run&lt;/code&gt; to do that.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📦 Exposing a Range of Ports
&lt;/h2&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; 8000-8010:8000-8010 my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Useful for services like &lt;strong&gt;WebRTC&lt;/strong&gt;, &lt;strong&gt;game servers&lt;/strong&gt;, or &lt;strong&gt;load balancers&lt;/strong&gt; needing multiple ports.&lt;/li&gt;
&lt;li&gt;🔄 Keep range symmetrical between host and container.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Combine with &lt;code&gt;--rm&lt;/code&gt;, &lt;code&gt;-it&lt;/code&gt;, &lt;code&gt;-d&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Emoji&lt;/th&gt;
&lt;th&gt;Use-case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-remove container when it exits&lt;/td&gt;
&lt;td&gt;🧹&lt;/td&gt;
&lt;td&gt;Clean test runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive (stdin open)&lt;/td&gt;
&lt;td&gt;🎤&lt;/td&gt;
&lt;td&gt;Needed for terminal apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TTY (format output)&lt;/td&gt;
&lt;td&gt;🖥️&lt;/td&gt;
&lt;td&gt;Pretty output formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combo: interactive + tty&lt;/td&gt;
&lt;td&gt;🧑‍💻&lt;/td&gt;
&lt;td&gt;Needed for shell, REPLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detached mode (run in background)&lt;/td&gt;
&lt;td&gt;🛸&lt;/td&gt;
&lt;td&gt;Long-running servers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🔥 Full Command Example
&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;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 4000:3000 my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Runs interactively&lt;/li&gt;
&lt;li&gt;Auto deletes after exit&lt;/li&gt;
&lt;li&gt;Maps port 3000 → 4000&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚀 Run in Detached Mode + Multiple Ports + Clean Exit
&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Runs in background&lt;/li&gt;
&lt;li&gt;Auto-cleans after stopping&lt;/li&gt;
&lt;li&gt;Maps frontend + backend&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🕵️‍♂️ How to Check Mapped Ports?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;What it Shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PORTS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Host:Container mapping (e.g., &lt;code&gt;0.0.0.0:8080-&amp;gt;3000/tcp&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛑 Stop a Detached Container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Real-World Analogies
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Container port&lt;/td&gt;
&lt;td&gt;📦 Internal phone extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host port&lt;/td&gt;
&lt;td&gt;☎️ Public phone number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assigning specific number to extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Letting system pick a number for you randomly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Summary Cheatsheet Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 8080:80&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual port map&lt;/td&gt;
&lt;td&gt;&lt;code&gt;host:container&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 8000-8010:8000-8010&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port range mapping&lt;/td&gt;
&lt;td&gt;Bulk apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-map all exposed ports&lt;/td&gt;
&lt;td&gt;Quick tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXPOSE 3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Doc port in Dockerfile&lt;/td&gt;
&lt;td&gt;Doesn't publish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-remove after exit&lt;/td&gt;
&lt;td&gt;Clean containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive terminal&lt;/td&gt;
&lt;td&gt;Needed for shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run in background&lt;/td&gt;
&lt;td&gt;Daemonized apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Real Full Example: Production-style Run
&lt;/h2&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;-d&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 443:443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-nginx &lt;span class="se"&gt;\&lt;/span&gt;
  nginx:alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Starts Nginx with HTTP &amp;amp; HTTPS&lt;br&gt;
✅ Cleans itself after &lt;code&gt;docker stop&lt;/code&gt;&lt;br&gt;
✅ Runs in background with custom name&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Bonus Tip: Use &lt;code&gt;--network&lt;/code&gt; to map ports between containers!
&lt;/h2&gt;

</description>
      <category>webdev</category>
      <category>docker</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
