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)