Awesome-claude-code optimize-docker-compose-resources
Optimizes Docker Compose resource allocation for PHP stacks. Configures memory limits, CPU constraints, and service scaling.
install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/optimize-docker-compose-resources" ~/.claude/skills/dykyi-roman-awesome-claude-code-optimize-docker-compose-resources && rm -rf "$T"
manifest:
skills/optimize-docker-compose-resources/SKILL.mdsource content
Docker Compose Resource Optimization
Configures resource allocation, constraints, and scaling for PHP application stacks.
Resource Allocation Overview
┌─────────────────────────────────────────────────────────────────┐ │ PHP STACK RESOURCE DISTRIBUTION (4GB Host) │ ├─────────────────────────────────────────────────────────────────┤ │ PHP-FPM: ████████████████████░░░░░░░░░░ 1024MB (25%) │ │ MySQL: ████████████████████████░░░░░░ 1536MB (38%) │ │ Redis: ████████░░░░░░░░░░░░░░░░░░░░░░ 512MB (13%) │ │ Nginx: ████░░░░░░░░░░░░░░░░░░░░░░░░░░ 256MB (6%) │ │ RabbitMQ: ████████░░░░░░░░░░░░░░░░░░░░░░ 512MB (13%) │ │ System: ████░░░░░░░░░░░░░░░░░░░░░░░░░░ 256MB (6%) │ └─────────────────────────────────────────────────────────────────┘
Recommended Resource Limits
| Service | Memory Limit | Memory Reservation | CPU Limit | CPU Reservation |
|---|---|---|---|---|
| PHP-FPM | 512MB-1GB | 256MB | 1.0 | 0.25 |
| Nginx | 128MB-256MB | 64MB | 0.5 | 0.1 |
| MySQL | 1GB-2GB | 512MB | 1.5 | 0.5 |
| PostgreSQL | 1GB-2GB | 512MB | 1.5 | 0.5 |
| Redis | 256MB-512MB | 128MB | 0.5 | 0.1 |
| RabbitMQ | 512MB-1GB | 256MB | 1.0 | 0.25 |
Service Configurations
PHP-FPM
php-fpm: deploy: resources: limits: { cpus: "1.0", memory: 1024M } reservations: { cpus: "0.25", memory: 256M } replicas: 2 tmpfs: ["/tmp:size=64M"] healthcheck: test: ["CMD", "php-fpm-healthcheck"] interval: 30s timeout: 5s start_period: 10s
MySQL
mysql: deploy: resources: limits: { cpus: "1.5", memory: 2048M } reservations: { cpus: "0.5", memory: 512M } shm_size: "256m" command: > --innodb-buffer-pool-size=1G --innodb-log-file-size=256M --max-connections=200 --tmp-table-size=64M ulimits: nofile: { soft: 65536, hard: 65536 }
Redis
redis: deploy: resources: limits: { cpus: "0.5", memory: 512M } reservations: { cpus: "0.1", memory: 128M } command: redis-server --maxmemory 384mb --maxmemory-policy allkeys-lru --save "" --appendonly no tmpfs: ["/data:size=384M"]
RabbitMQ
rabbitmq: deploy: resources: limits: { cpus: "1.0", memory: 1024M } reservations: { cpus: "0.25", memory: 256M } environment: RABBITMQ_VM_MEMORY_HIGH_WATERMARK: 0.6 RABBITMQ_DISK_FREE_LIMIT: 128MB
Logging Configuration
logging: driver: json-file options: max-size: "10m" max-file: "3"
| Service | max-size | max-file | Total Disk |
|---|---|---|---|
| PHP-FPM | 10m | 3 | 30MB |
| Nginx | 20m | 5 | 100MB |
| MySQL | 10m | 3 | 30MB |
| Redis | 5m | 2 | 10MB |
tmpfs for Ephemeral Data
tmpfs: - /tmp:size=64M,mode=1777 - /app/var/cache:size=128M - /app/var/log:size=32M
Benefits: faster I/O, no disk writes, auto-cleaned on restart.
shm_size for Databases
postgres: shm_size: "256m" # shared_buffers, WAL buffers, lock tables mysql: shm_size: "256m" # InnoDB buffer pool, temp tables
ulimits Configuration
| ulimit | Default | Recommended | Purpose |
|---|---|---|---|
| nofile | 1024 | 65536 | Max open files/sockets |
| nproc | 1024 | 4096 | Max processes |
| memlock | 64KB | unlimited | Memory locking (Redis) |
Scaling with Replicas
php-fpm: deploy: replicas: 3 endpoint_mode: dnsrr resources: limits: { cpus: "0.5", memory: 512M } # Total: 1.5 CPU, 1536M memory across 3 replicas # Nginx resolves php-fpm to all replicas via DNS round-robin
Before/After Comparison
| Metric | No Limits | With Limits | Improvement |
|---|---|---|---|
| OOM kills | Frequent | Rare | Predictable |
| Noisy neighbor | Common | Prevented | Isolated |
| Memory waste | 30-50% | < 10% | -80% waste |
| Log disk usage | Unbounded | < 200MB | Controlled |
| Recovery time | Minutes | Seconds | Faster restarts |
Generation Instructions
- Inventory services: List all containers in the stack
- Assess host resources: Total CPU and memory available
- Allocate proportionally: Database > App > Cache > Proxy
- Set limits and reservations: Limits cap usage, reservations guarantee minimum
- Configure logging: Prevent unbounded disk growth
- Add health checks: Enable automatic recovery
- Test under load: Verify no OOM kills or throttling