Docker & Kubernetes Skill
Docker Basics
Dockerfile for Next.js
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
# Copy necessary files
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
Docker Compose
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=${DATABASE_URL}
depends_on:
- db
- redis
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
Docker Commands
docker build -t smarter-poker .
docker run -p 3000:3000 smarter-poker
docker ps
docker logs -f container_id
docker exec -it container_id sh
docker stop $(docker ps -q)
docker system prune -a
Kubernetes Deployment
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: smarter-poker
spec:
replicas: 3
selector:
matchLabels:
app: smarter-poker
template:
metadata:
labels:
app: smarter-poker
spec:
containers:
- name: web
image: smarter-poker:latest
ports:
- containerPort: 3000
resources:
limits:
memory: "512Mi"
cpu: "500m"
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-secrets
key: database-url
---
apiVersion: v1
kind: Service
metadata:
name: smarter-poker-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 3000
selector:
app: smarter-poker
Useful Tools
lazydocker - TUI for Docker
dive - Analyze Docker image layers
hadolint - Dockerfile linter