DEV Community

Darshan Vasani
Darshan Vasani Subscriber

Posted on • Edited on

πŸ“¦ Docker Custom Images + Node Server Dockerization Cheatsheet πŸš€

πŸ“¦ Docker Custom Images + Node Server Dockerization Cheatsheet πŸš€

Learn to build, optimize, and run custom Docker images for Node.js applications like a pro.


πŸ“ 1. Folder Structure for a Dockerized Node App

my-app/ β”œβ”€β”€ Dockerfile β”œβ”€β”€ .dockerignore β”œβ”€β”€ package.json β”œβ”€β”€ package-lock.json β”œβ”€β”€ index.js 
Enter fullscreen mode Exit fullscreen mode

πŸ› οΈ 2. Create a Custom Docker Image for Node.js App

βœ… Sample Optimized Dockerfile

# πŸ‘· Stage 1: Build FROM node:20-alpine AS builder # Set working directory WORKDIR /app # Install dependencies COPY package*.json ./ RUN npm ci # Copy source code COPY . . # 🧼 Prune dev dependencies RUN npm prune --production # πŸš€ Stage 2: Run FROM node:20-alpine WORKDIR /app # Copy from builder stage COPY --from=builder /app . # Set environment and expose port ENV NODE_ENV=production ENV PORT=8000 EXPOSE 8000 # Run the app CMD ["npm", "start"] 
Enter fullscreen mode Exit fullscreen mode

🚫 3. .dockerignore File (Very Important!)

node_modules .dockerignore Dockerfile npm-debug.log .git .env 
Enter fullscreen mode Exit fullscreen mode

Prevents unnecessary files from being copied into your image, reducing build time and size.


βš™οΈ 4. Build & Run Docker Image for Node App

🧱 Build the Image

# πŸ§ͺ Build with a custom tag docker build -t my-node-app . 
Enter fullscreen mode Exit fullscreen mode

πŸš€ Run the Container

# πŸ§ͺ Run interactively docker run -p 8000:8000 my-node-app 
Enter fullscreen mode Exit fullscreen mode
# πŸ§ͺ Run in background docker run -d -p 8000:8000 my-node-app 
Enter fullscreen mode Exit fullscreen mode

πŸ“‚ Run with Mount (Dev Mode - Hot Reload)

docker run -v ${PWD}:/app -p 8000:8000 my-node-app 
Enter fullscreen mode Exit fullscreen mode

Mounts your current directory inside the container, ideal for development.


πŸ” 5. Inspect, Debug, and Clean Containers

βœ… List Containers & Images

docker ps # Running containers docker ps -a # All containers docker images # Local images 
Enter fullscreen mode Exit fullscreen mode

πŸ›‘ Stop & Remove

docker stop <id> # Stop container docker rm <id> # Remove container docker rmi my-node-app # Remove image 
Enter fullscreen mode Exit fullscreen mode

πŸͺ› Exec Into a Container

docker exec -it <id> /bin/sh # Alpine or BusyBox docker exec -it <id> /bin/bash # Ubuntu-based 
Enter fullscreen mode Exit fullscreen mode

πŸ“œ Logs & Details

docker logs <id> # Show logs docker inspect <id> # Low-level config info docker history my-node-app # See image layers 
Enter fullscreen mode Exit fullscreen mode

🧼 6. Prune & Clean Docker Environment

docker container prune # Remove stopped containers docker image prune # Remove dangling images docker volume prune # Clean volumes docker system prune -a # Remove all unused data 
Enter fullscreen mode Exit fullscreen mode

πŸ›‘οΈ 7. Best Practices for Custom Docker Images

Practice Benefit
Use alpine base Reduces image size drastically πŸ“‰
Multi-stage builds Keep final image clean & minimal 🧼
Set .dockerignore Avoid bloat, faster builds ⚑
Cache dependencies Speeds up builds 🎯
Pin base image versions Prevents future breaking changes πŸ”’
Avoid root user Increases container security πŸ”
Clean caches in RUN steps Reduces leftover junk πŸ—‘οΈ

πŸš€ 8. Example Node.js Server (index.js)

// index.js const express = require('express'); const app = express(); const PORT = process.env.PORT || 8000; app.get('/', (req, res) => { res.send('Hello from Dockerized Node Server πŸš€'); }); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); 
Enter fullscreen mode Exit fullscreen mode

πŸ” 9. Image Size Analyzer Tools

docker history my-node-app # View layers and size docker image inspect my-node-app # Use Dive CLI tool dive my-node-app # Use DockerSlim to shrink it docker-slim build my-node-app 
Enter fullscreen mode Exit fullscreen mode

πŸ§ͺ 10. Docker Compose (Bonus)

# docker-compose.yml version: '3.8' services: web: build: . ports: - "8000:8000" volumes: - .:/app environment: - NODE_ENV=production 
Enter fullscreen mode Exit fullscreen mode
# Run with: docker-compose up --build 
Enter fullscreen mode Exit fullscreen mode

βœ… Summary of Key Docker Commands for Node Server

Task Command
🧱 Build Image docker build -t my-node-app .
πŸš€ Run Container docker run -p 8000:8000 my-node-app
πŸ” View Running docker ps
πŸ›‘ Stop Container docker stop <id>
πŸ—‘οΈ Prune Containers docker container prune
🧼 Clean All docker system prune -a

🎁 Bonus Tip

πŸ’‘ To auto-rebuild and restart on file changes during dev:

npm install -D nodemon 
Enter fullscreen mode Exit fullscreen mode

Update package.json:

"scripts": { "start": "node index.js", "dev": "nodemon index.js" } 
Enter fullscreen mode Exit fullscreen mode

Then in Dockerfile:

RUN npm install --only=production # OR use dev mode in compose 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)