π¦ 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
π οΈ 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"]
π« 3. .dockerignore
File (Very Important!)
node_modules .dockerignore Dockerfile npm-debug.log .git .env
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 .
π Run the Container
# π§ͺ Run interactively docker run -p 8000:8000 my-node-app
# π§ͺ Run in background docker run -d -p 8000:8000 my-node-app
π Run with Mount (Dev Mode - Hot Reload)
docker run -v ${PWD}:/app -p 8000:8000 my-node-app
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
π Stop & Remove
docker stop <id> # Stop container docker rm <id> # Remove container docker rmi my-node-app # Remove image
πͺ Exec Into a Container
docker exec -it <id> /bin/sh # Alpine or BusyBox docker exec -it <id> /bin/bash # Ubuntu-based
π Logs & Details
docker logs <id> # Show logs docker inspect <id> # Low-level config info docker history my-node-app # See image layers
π§Ό 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
π‘οΈ 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}`); });
π 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
π§ͺ 10. Docker Compose (Bonus)
# docker-compose.yml version: '3.8' services: web: build: . ports: - "8000:8000" volumes: - .:/app environment: - NODE_ENV=production
# Run with: docker-compose up --build
β 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
Update package.json
:
"scripts": { "start": "node index.js", "dev": "nodemon index.js" }
Then in Dockerfile:
RUN npm install --only=production # OR use dev mode in compose
Top comments (0)