Docker Containerization
Containerize applications with production-ready Dockerfiles, Docker Compose configurations, and deployment scripts for Next.js, React, and Node.js projects.
Your Dockerfile is 2 GB because you copied it from Stack Overflow in 2022. It installs dev dependencies in production, runs as root, and rebuilds everything on every code change. 'It works on my machine' is not a deployment strategy.
Who it's for: developers containerizing their first application, teams moving from bare-metal to Docker, DevOps engineers optimizing bloated images, full-stack developers needing production-ready configs, startups setting up Docker Compose for local development
Example
"Containerize our Next.js app for production" → Multi-stage Dockerfile (200 MB vs 2 GB), Docker Compose for local dev with hot reload, production config with health checks, and deployment scripts for AWS ECS and Google Cloud Run
New here? 3-minute setup guide → | Already set up? Copy the template below.
# Docker Containerization
## Your Role
You are my DevOps engineer specializing in containerization. Help me create production-ready Docker configurations for web applications, particularly Next.js, React, and Node.js projects.
## Core Capabilities
- Dockerfile generation (production, development, static)
- Docker Compose configurations
- Container management scripts
- Deployment configurations for various platforms
## Decision Tree
### Step 1: Determine Environment
- **Production**: Optimized multi-stage builds
- **Development**: Hot reload, debugging
- **Static**: Nginx serving pre-built files
### Step 2: Container Count
- **Single**: Simple applications
- **Multi-container**: App + database + cache
### Step 3: Registry Choice
- Docker Hub
- GitHub Container Registry
- AWS ECR
- Google Container Registry
### Step 4: Deployment Platform
- Kubernetes
- AWS ECS Fargate
- Google Cloud Run
- Azure Container Apps
- Digital Ocean
### Step 5: Optimizations Needed
- Build caching
- Image size reduction
- Security hardening
## Dockerfile Templates
### Production (Next.js)
```dockerfile
# Build stage
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
```
### Development
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
```
### Nginx Static
```dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```
## Docker Compose
### Local Development
```yaml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:alpine
volumes:
postgres_data:
```
## .dockerignore
```
node_modules
.next
.git
.gitignore
README.md
Dockerfile*
docker-compose*
.env*
coverage
.nyc_output
```
## Management Scripts
### Build Script
```bash
#!/bin/bash
docker build -t myapp:latest .
docker tag myapp:latest registry/myapp:latest
```
### Run Script
```bash
#!/bin/bash
docker run -d \
--name myapp \
-p 3000:3000 \
--env-file .env \
myapp:latest
```
### Push Script
```bash
#!/bin/bash
docker push registry/myapp:latest
```
## Best Practices
### Security
- Use non-root users
- Scan for vulnerabilities
- Never hardcode secrets
- Use minimal base images
### Performance
- Optimize layer caching
- Use multi-stage builds
- Minimize image size
- Use Alpine images
### Maintainability
- Version control all configs
- Document build arguments
- Follow DRY principles
- Use clear naming
## Troubleshooting
| Issue | Cause | Solution |
|-------|-------|----------|
| Large image | No multi-stage | Add builder stage |
| Slow builds | Bad layer order | Put rarely-changing layers first |
| Container exits | Bad CMD | Check entrypoint/cmd |
| Changes not seen | Old cache | Build with --no-cache |
## Platform Deployments
### Kubernetes
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 3000
```
### AWS ECS Task Definition
```json
{
"family": "myapp",
"containerDefinitions": [{
"name": "myapp",
"image": "myapp:latest",
"portMappings": [{
"containerPort": 3000,
"protocol": "tcp"
}],
"memory": 512,
"cpu": 256
}]
}
```
What This Does
Containerize your applications with production-ready Docker configurations. Generate optimized Dockerfiles, Docker Compose setups, and deployment scripts for various platforms including Kubernetes, AWS ECS, and Google Cloud Run.
Quick Start
Step 1: Navigate to Your Project
cd ~/your-project
Step 2: Download the Template
Click Download above, then:
mv ~/Downloads/CLAUDE.md ./
Step 3: Generate Docker Configuration
claude
Then ask: "Containerize this Next.js app for production"
Supported Configurations
Dockerfile Types
| Type | Use Case |
|---|---|
| Production | Optimized, multi-stage builds |
| Development | Hot reload, debugging support |
| Nginx Static | Static file serving |
Deployment Platforms
- Kubernetes
- AWS ECS Fargate
- Google Cloud Run
- Azure Container Apps
- Digital Ocean App Platform
Example Prompts
- "Create a production Dockerfile for my Next.js app"
- "Set up Docker Compose for local development"
- "Generate Kubernetes manifests for deployment"
- "Create deployment scripts for AWS ECS"
Best Practices Included
Security
- Non-root user execution
- Vulnerability scanning setup
- No hardcoded secrets
- Minimal base images
Performance
- Multi-stage builds
- Layer caching optimization
- Alpine-based images
- .dockerignore configuration
Maintainability
- Version-controlled configs
- Documented build args
- DRY principles
- Clear naming conventions
Sample Dockerfile
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Production stage
FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
COPY --from=builder /app/node_modules ./node_modules
COPY --chown=nextjs:nodejs . .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
Troubleshooting
| Issue | Solution |
|---|---|
| Image too large | Use multi-stage builds, Alpine base |
| Slow builds | Optimize layer caching order |
| Container exits immediately | Check CMD and ENTRYPOINT |
| Changes not reflecting | Rebuild without cache |