DevOps
Docker in Production: Lessons from Scaling to Millions
Real-world Docker strategies for scaling applications in production environments.

Introduction
Running Docker in production at scale requires careful planning and proven strategies. In this article, I'll share lessons learned from scaling Dockerized applications to serve millions of users.
1. Multi-Stage Builds
Use multi-stage builds to create smaller, more secure images:
# Dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER node
EXPOSE 3000
CMD ["npm", "start"]
2. Resource Management
Set resource limits to prevent container sprawl:
# docker-compose.yml
version: '3.8'
services:
app:
image: my-app:latest
deploy:
resources:
limits:
memory: 512M
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.5'
3. Health Checks
Implement proper health checks:
# Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
4. Logging Strategy
Implement centralized logging:
# docker-compose.yml
version: '3.8'
services:
app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
5. Security Best Practices
Run containers as non-root users:
# Dockerfile
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs
6. Orchestration with Kubernetes
For large-scale deployments, use Kubernetes:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 3000
resources:
limits:
memory: "512Mi"
cpu: "500m"
Conclusion
Docker in production requires a holistic approach focusing on security, monitoring, and scalability. By implementing these strategies, you can build robust, scalable containerized applications.