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)