container-debugging
Debug Docker containers and containerized applications. Diagnose deployment issues, container lifecycle problems, and resource constraints.
When & Why to Use This Skill
The Container Debugging skill for Claude provides a comprehensive framework for troubleshooting Docker and Kubernetes environments. It empowers developers and DevOps engineers to diagnose deployment issues, resolve container lifecycle failures, and manage resource constraints like CPU and memory limits. By leveraging advanced techniques for log analysis, container inspection, and network debugging, this skill accelerates the resolution of application crashes and performance bottlenecks in containerized workflows.
Use Cases
- Identifying the root cause of container startup failures and unexpected exits using exit code analysis (e.g., SIGKILL 137).
- Resolving 'address already in use' errors and complex network connectivity issues between microservices.
- Diagnosing and optimizing resource usage to prevent Out-of-Memory (OOM) errors and CPU throttling.
- Inspecting real-time logs and container internal states to debug application-level runtime errors.
- Streamlining multi-stage Docker builds to reduce image size and improve deployment security and performance.
| name | container-debugging |
|---|---|
| description | Debug Docker containers and containerized applications. Diagnose deployment issues, container lifecycle problems, and resource constraints. |
Container Debugging
Overview
Container debugging focuses on issues within Docker/Kubernetes environments including resource constraints, networking, and application runtime problems.
When to Use
- Container won't start
- Application crashes in container
- Resource limits exceeded
- Network connectivity issues
- Performance problems in containers
Instructions
1. Docker Debugging Basics
# Check container status
docker ps -a
docker inspect <container-id>
docker stats <container-id>
# View container logs
docker logs <container-id>
docker logs --follow <container-id> # Real-time
docker logs --tail 100 <container-id> # Last 100 lines
# Connect to running container
docker exec -it <container-id> /bin/bash
docker exec -it <container-id> sh
# Inspect container details
docker inspect <container-id> | grep -A 5 "State"
docker inspect <container-id> | grep -E "Memory|Cpu"
# Check container processes
docker top <container-id>
# View resource usage
docker stats <container-id>
# Shows: CPU%, Memory usage, Network I/O
# Copy files from container
docker cp <container-id>:/path/to/file /local/path
# View image layers
docker history <image-name>
docker inspect <image-name>
2. Common Container Issues
Issue: Container Won't Start
Diagnosis:
1. docker logs <container-id>
2. Check exit code: docker inspect (ExitCode)
3. Verify image exists: docker images
4. Check entrypoint: docker inspect --format='{{.Config.Entrypoint}}'
Common Exit Codes:
0: Normal exit
1: General application error
127: Command not found
128+N: Terminated by signal N
137: Out of memory (SIGKILL)
139: Segmentation fault
Solutions:
- Fix application error
- Ensure required files exist
- Check executable permissions
- Verify working directory
---
Issue: Out of Memory
Symptoms: Exit code 137 (SIGKILL)
Debug:
docker stats <container-id>
# Check Memory usage vs limit
Solution:
docker run -m 512m <image>
# Increase memory limit
docker inspect (MemoryLimit)
# Check current limit
---
Issue: Port Already in Use
Error: "bind: address already in use"
Debug:
docker ps # Check running containers
netstat -tlnp | grep 8080 # Check port usage
Solution:
docker run -p 8081:8080 <image>
# Use different host port
---
Issue: Network Issues
Symptom: Cannot reach other containers
Debug:
docker network ls
docker inspect <container-id> | grep IPAddress
docker exec <container-id> ping <other-container>
Solution:
docker network create app-network
docker run --network app-network <image>
3. Container Optimization
Resource Limits:
Set in docker-compose:
version: '3'
services:
app:
image: myapp
environment:
- NODE_ENV=production
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
Limits: Maximum resources
Reservations: Guaranteed resources
---
Multi-Stage Builds:
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Result: 1GB → 200MB image size
4. Debugging Checklist
Container Issues:
[ ] Container starts without error
[ ] Ports mapped correctly
[ ] Logs show no errors
[ ] Environment variables set
[ ] Volumes mounted correctly
[ ] Network connectivity works
[ ] Resource limits appropriate
[ ] Permissions correct
[ ] Dependencies installed
[ ] Entrypoint working
Kubernetes Issues:
[ ] Pod running (not Pending/CrashLoop)
[ ] All containers started
[ ] Readiness probes passing
[ ] Liveness probes passing
[ ] Resource requests/limits set
[ ] Network policies allow traffic
[ ] Secrets/ConfigMaps available
[ ] Logs show no errors
Tools:
docker:
- logs
- stats
- inspect
- exec
docker-compose:
- logs
- ps
- config
kubectl (Kubernetes):
- logs
- describe pod
- get events
- port-forward
Key Points
- Check logs first:
docker logs <container> - Understand exit codes (137=OOM, 127=not found)
- Use resource limits appropriately
- Network containers on same network
- Multi-stage builds reduce image size
- Monitor resource usage with stats
- Port mappings: host:container
- Exec into running containers for debugging
- Update base images regularly
- Include health checks in containers