| name | docker-setup |
| description | Docker containerization setup and configuration. Use when containerizing applications, creating development environments, or setting up deployment workflows. |
Purpose
Package applications and their dependencies into containers for consistent deployment across environments.
When to Use
- Containerizing applications
- Creating reproducible development environments
- Setting up microservices
- Deploying to production
- Isolating dependencies
Installation
Linux
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
macOS
brew install --cask docker
Windows
Dockerfile Basics
Simple Node.js App
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Python App
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
Multi-stage Build
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Common Dockerfile Patterns
React App
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Next.js App
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
CMD ["node", "server.js"]
Go App
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]
Docker Compose
Basic Web App + Database
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Development Environment
version: '3.8'
services:
app:
build: .
volumes:
- .:/app
- /app/node_modules
ports:
- "3000:3000"
environment:
- NODE_ENV=development
command: npm run dev
Multi-Service Setup
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
backend:
build: ./backend
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
Docker Compose Commands
docker-compose up
docker-compose up -d
docker-compose down
docker-compose up --build
docker-compose logs -f
docker-compose exec app sh
docker-compose ps
docker-compose down -v
Docker Commands
Images
docker build -t myapp:1.0 .
docker images
docker rmi myapp:1.0
docker pull node:20-alpine
docker push myrepo/myapp:1.0
Containers
docker run -p 3000:3000 myapp:1.0
docker run -d -p 3000:3000 myapp:1.0
docker ps
docker stop <container-id>
docker rm <container-id>
docker exec -it <container-id> sh
Volumes
docker volume create myvolume
docker volume ls
docker volume rm myvolume
Networks
docker network create mynetwork
docker network ls
docker network connect mynetwork mycontainer
Best Practices
Dockerfile
- Use specific base image tags (not
latest)
- Use multi-stage builds for smaller images
- Combine RUN commands to reduce layers
- Use .dockerignore to exclude files
- Run as non-root user when possible
- Set HEALTHCHECK for monitoring
- Use build args for configuration
Docker Compose
- Use version 3.8+ for compatibility
- Define volumes for persistent data
- Use environment variables for configuration
- Set resource limits
- Use depends_on for service dependencies
- Use restart policies for production
Security
- Scan images for vulnerabilities
- Use official base images
- Keep images updated
- Don't run as root
- Use secrets management
- Limit container capabilities
.dockerignore
node_modules
npm-debug.log
.git
.env
.DS_Store
coverage
.next
dist
build
*.log
Common Issues
Container Won't Start
docker logs <container-id>
netstat -tulpn | grep <port>
docker ps -a
Out of Space
docker image prune -a
docker container prune
docker volume prune
docker system prune -a
Permission Issues
sudo usermod -aG docker $USER
docker run -u $(id -u):$(id -g) ...
Production Deployment
Docker Registry
docker login registry.example.com
docker tag myapp:1.0 registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0
Docker Swarm
docker swarm init
docker stack deploy -c docker-compose.yml mystack
docker service ls
docker service scale mystack_app=3
Kubernetes (using Kompose)
curl -L https://github.com/kubernetes/kompose/releases/download/v1.28.0/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv kompose /usr/local/bin/
kompose convert
kubectl apply -f .
Scripts
build.sh
#!/bin/bash
docker build -t myapp:$(git rev-parse --short HEAD) .
deploy.sh
#!/bin/bash
docker-compose down
docker-compose up -d --build
docker-compose logs -f
clean.sh
#!/bin/bash
docker-compose down -v
docker system prune -a