Master Docker for consistent development environments and scalable deployments.
Basic Dockerfile
# Node.js application
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Multi-Stage Build
# 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
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/server.js"]
Docker Compose
version: '3.8'
services:
app:
build: .
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Docker Commands
# Build image
docker build -t myapp .
# Run container
docker run -d -p 3000:3000 myapp
# View logs
docker logs -f container_id
# Docker Compose commands
docker-compose up -d
docker-compose down
docker-compose logs -f
Best Practices
- Use multi-stage builds to reduce image size
- Don't run as root - use a non-root user
- Use .dockerignore to exclude unnecessary files
- Pin specific versions for reproducible builds
- Leverage layer caching by ordering commands properly
Posted ondevopswith tags: