π¦ 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)