| name | docker-management |
| description | Build, optimize, and troubleshoot Docker containers and images. Create efficient Dockerfiles, manage container lifecycle, configure networking and volumes, and debug container issues. Use when working with Docker, containerization, or container troubleshooting. |
| license | MIT |
| metadata | {"author":"devops-skills","version":"1.0"} |
Docker Management
Build, run, and manage Docker containers for application deployment and development.
When to Use This Skill
Use this skill when:
- Creating and optimizing Dockerfiles
- Building and tagging Docker images
- Running and managing containers
- Debugging container issues
- Configuring Docker networking and volumes
- Implementing container security best practices
Prerequisites
- Docker Engine installed (20.10+)
- Basic command line knowledge
- Understanding of application deployment
Dockerfile Best Practices
Multi-Stage Build
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine AS production
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
USER nodejs
EXPOSE 3000
CMD ["node", "dist/index.js"]
Layer Optimization
FROM python:3.12-slim
# Install dependencies first (cached unless requirements change)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application code (changes frequently)
COPY . .
CMD ["python", "app.py"]
Security Hardening
FROM node:20-alpine
# Create non-root user
RUN addgroup -g 1001 appgroup && \
adduser -u 1001 -G appgroup -D appuser
WORKDIR /app
# Copy with proper ownership
COPY --chown=appuser:appgroup . .
# Drop privileges
USER appuser
# Use exec form for proper signal handling
CMD ["node", "server.js"]
Building Images
Basic Build
docker build -t myapp:1.0 .
docker build --build-arg NODE_ENV=production -t myapp:prod .
docker build --platform linux/amd64 -t myapp:amd64 .
docker build --no-cache -t myapp:fresh .
Multi-Platform Builds
docker buildx create --name multiplatform --use
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t myregistry/myapp:latest \
--push .
Running Containers
Basic Operations
docker run -d --name myapp -p 8080:3000 myapp:latest
docker run -d \
-e DATABASE_URL=postgres://localhost/db \
-e NODE_ENV=production \
myapp:latest
docker run -d \
--memory="512m" \
--cpus="1.0" \
myapp:latest
docker run -d --restart=unless-stopped myapp:latest
Volume Management
docker volume create mydata
docker run -v mydata:/app/data myapp:latest
docker run -v $(pwd)/config:/app/config:ro myapp:latest
docker run --tmpfs /tmp:rw,noexec,nosuid myapp:latest
Networking
docker network create mynetwork
docker run -d --network mynetwork --name api myapp:latest
docker network connect mynetwork existing-container
docker run -d -p 127.0.0.1:8080:3000 myapp:latest
Container Lifecycle
Management Commands
docker ps -a
docker stop myapp
docker rm myapp
docker rm -f myapp
docker container prune -f
Logs and Monitoring
docker logs myapp
docker logs -f --tail 100 myapp
docker stats myapp
docker inspect myapp
Debugging Containers
Interactive Access
docker exec -it myapp /bin/sh
docker run -it --rm myapp:latest /bin/sh
docker run -it --entrypoint /bin/sh myapp:latest
Troubleshooting
docker logs myapp 2>&1 | grep -i error
docker inspect --format='{{.State.Status}}' myapp
docker top myapp
docker diff myapp
docker export myapp > myapp-fs.tar
Health Checks
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
docker inspect --format='{{.State.Health.Status}}' myapp
Image Management
Tagging and Pushing
docker tag myapp:latest myregistry.com/myapp:v1.0
docker push myregistry.com/myapp:v1.0
docker pull myregistry.com/myapp:v1.0
Cleanup
docker image prune -a
docker system prune -a --volumes
docker rmi myapp:old
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
Image Analysis
docker history myapp:latest
docker inspect myapp:latest
docker scout cves myapp:latest
Docker Compose Integration
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- app-data:/app/data
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
volumes:
app-data:
db-data:
Security Best Practices
Image Security
# Use specific version tags
FROM node:20.10-alpine3.18
# Don't run as root
USER nobody
# Remove unnecessary packages
RUN apk del --purge build-dependencies
# Use COPY instead of ADD
COPY . .
Runtime Security
docker run -d \
--security-opt=no-new-privileges \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--read-only \
myapp:latest
Common Issues
Issue: Container Exits Immediately
Problem: Container starts and stops instantly
Solution: Check if CMD/ENTRYPOINT runs foreground process, use docker logs to see errors
Issue: Cannot Connect to Container
Problem: Port not accessible
Solution: Verify port mapping (-p), check container is running, verify firewall rules
Issue: Out of Disk Space
Problem: Docker using too much disk
Solution: Run docker system prune -a --volumes, check for large unused images
Issue: Build Cache Not Working
Problem: Every build downloads dependencies
Solution: Order Dockerfile instructions from least to most frequently changing
Best Practices
- Use multi-stage builds to minimize image size
- Never store secrets in images - use runtime injection
- Pin base image versions for reproducibility
- Implement health checks for production containers
- Use .dockerignore to exclude unnecessary files
- Run containers as non-root users
- Scan images for vulnerabilities regularly
- Use Docker BuildKit for faster builds
Related Skills