Files
laboratori-cloud/labs/lab-03-compute/reference/compose-resources-syntax.md
Luca Sacchi Ricciardi 23a9ffe443 feat(lab-03): complete Phase 4 - Compute & EC2 lab
Phase Plans (5 files):
- 04-RESEARCH.md: Domain research on Docker limits, healthchecks, EC2 parallels
- 04-VALIDATION.md: Success criteria and validation strategy
- 04-01-PLAN.md: Test infrastructure (RED phase)
- 04-02-PLAN.md: Diátxis documentation
- 04-03-PLAN.md: Infrastructure implementation (GREEN phase)

Test Scripts (6 files, 1300+ lines):
- 01-resource-limits-test.sh: Validate INF-03 compliance
- 02-healthcheck-test.sh: Validate healthcheck configuration
- 03-enforcement-test.sh: Verify resource limits with docker stats
- 04-verify-infrastructure.sh: Infrastructure verification
- 99-final-verification.sh: End-to-end student verification
- run-all-tests.sh: Test orchestration with fail-fast
- quick-test.sh: Fast validation (<30s)

Documentation (11 files, 2500+ lines):
Tutorials (3):
- 01-set-resource-limits.md: EC2 instance types, Docker limits syntax
- 02-implement-healthchecks.md: ELB health check parallels
- 03-dependencies-with-health.md: depends_on with service_healthy

How-to Guides (4):
- check-resource-usage.md: docker stats monitoring
- test-limits-enforcement.md: Stress testing CPU/memory
- custom-healthcheck.md: HTTP, TCP, database healthchecks
- instance-type-mapping.md: Docker limits → EC2 mapping

Reference (3):
- compose-resources-syntax.md: Complete deploy.resources reference
- healthcheck-syntax.md: All healthcheck parameters
- ec2-instance-mapping.md: Instance type mapping table

Explanation (1):
- compute-ec2-parallels.md: Container=EC2, Limits=Instance Type, Healthcheck=ELB

Infrastructure:
- docker-compose.yml: 5 services (web, app, worker, db, stress-test)
  All services: INF-03 compliant (cpus + memory limits)
  All services: healthcheck configured
  EC2 parallels: t2.nano, t2.micro, t2.small, t2.medium, m5.large
- Dockerfile: Alpine 3.19 + stress tools + non-root user

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 15:16:58 +02:00

3.6 KiB

Reference: Docker Compose Resources Syntax

Riferimento completo per la configurazione delle risorse in Docker Compose.

Sezione deploy.resources

Struttura Completa

services:
  service_name:
    deploy:
      resources:
        limits:
          cpus: 'VALUE'
          memory: 'VALUE'
        reservations:
          cpus: 'VALUE'
          memory: 'VALUE'

Parametri Limits

cpus

Formato: Stringa con numero decimale

cpus: '0.5'     # 50% di 1 CPU
cpus: '1'       # 1 CPU completa
cpus: '2'       # 2 CPU complete
cpus: '1.5'     # 1.5 CPU
cpus: '0.25'    # 25% di 1 CPU

Validità:

  • Minimo: 0.001 (1 millesimo di CPU)
  • Massimo: Numero di CPU host (es. 8 su host con 8 core)
  • Default: Nessun limite (tutte le CPU disponibili)

memory

Formato: Stringa con unità

memory: '512M'    # 512 Megabyte
memory: '1G'      # 1 Gigabyte
memory: '128M'    # 128 Megabyte
memory: '4G'      # 4 Gigabyte
memory: '1024M'   # 1024 Megabyte (equivale a 1G)

Unità Supportate:

  • B - Byte
  • K / KB - Kilobyte (1024 bytes)
  • M / MB - Megabyte (1024 KB)
  • G / GB - Gigabyte (1024 MB)

Validità:

  • Minimo: 4M (4 Megabyte)
  • Massico: Memoria host disponibile
  • Default: Nessun limite (tutta la memoria disponibile)

Parametri Reservations

Scopo

Le reservations garantiscono risorse minime disponibili:

  • Docker riserva queste risorse per il container
  • Usato per pianificazione capacity (Kubernetes)
  • Meno comune in Docker Compose locale

Esempio

deploy:
  resources:
    limits:
      cpus: '2'      # Massimo 2 CPU
      memory: '4G'   # Massimo 4 GB
    reservations:
      cpus: '1'      # Garantite 1 CPU
      memory: '2G'   # Garantiti 2 GB

Uso tipico:

  • limits - Definisce il tetto massimo (enforcement)
  • reservations - Definisce il pavimento minimo (garanzia)

Esempi Completi per Servizi

Web Server (t2.micro)

web:
  image: nginx:alpine
  deploy:
    resources:
      limits:
        cpus: '1'
        memory: 1G

Application Server (t2.small)

app:
  image: node:alpine
  deploy:
    resources:
      limits:
        cpus: '1'
        memory: 2G

Database (t2.medium)

db:
  image: postgres:16-alpine
  deploy:
    resources:
      limits:
        cpus: '2'
        memory: 4G
    reservations:
      cpus: '1'
      memory: 2G

Worker CPU-Intensive (c5.xlarge)

worker:
  image: python:alpine
  deploy:
    resources:
      limits:
        cpus: '4'
        memory: 4G

Validation

Verifica con docker compose config

docker compose config

Output per servizio con limits:

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1073741824  # 1G in byte

Verifica con docker inspect

docker inspect lab03-web --format '{{.HostConfig}}'

Output:

map[NanoCpus:1000000000 Memory:1073741824]

Conversione:

  • NanoCpus: 1000000000 = 1 CPU (1e9 nanocpus)
  • Memory: 1073741824 = 1 GB (in byte)

Troubleshooting

Errore: "no matching resources"

Causa: Host non ha abbastanza risorse

Soluzione:

# Riduci i limits
deploy:
  resources:
    limits:
      cpus: '0.5'    # Era '2'
      memory: 512M  # Era '2G'

Errore: "invalid memory format"

Causa: Formato non valido

Soluzione:

# ✗ WRONG
memory: 1024       # Manca unità
memory: "1GB"      # "GB" non valido (usa G)

# ✓ CORRECT
memory: 1G
memory: 1024M

Vedi Anche

  • Tutorial: Configurare Limiti delle Risorse
  • Reference: EC2 Instance Mapping