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>
211 lines
3.6 KiB
Markdown
211 lines
3.6 KiB
Markdown
# Reference: Docker Compose Resources Syntax
|
|
|
|
Riferimento completo per la configurazione delle risorse in Docker Compose.
|
|
|
|
## Sezione deploy.resources
|
|
|
|
### Struttura Completa
|
|
|
|
```yaml
|
|
services:
|
|
service_name:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: 'VALUE'
|
|
memory: 'VALUE'
|
|
reservations:
|
|
cpus: 'VALUE'
|
|
memory: 'VALUE'
|
|
```
|
|
|
|
## Parametri Limits
|
|
|
|
### cpus
|
|
|
|
**Formato:** Stringa con numero decimale
|
|
|
|
```yaml
|
|
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à
|
|
|
|
```yaml
|
|
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
|
|
|
|
```yaml
|
|
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)
|
|
|
|
```yaml
|
|
web:
|
|
image: nginx:alpine
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: 1G
|
|
```
|
|
|
|
### Application Server (t2.small)
|
|
|
|
```yaml
|
|
app:
|
|
image: node:alpine
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: 2G
|
|
```
|
|
|
|
### Database (t2.medium)
|
|
|
|
```yaml
|
|
db:
|
|
image: postgres:16-alpine
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '2'
|
|
memory: 4G
|
|
reservations:
|
|
cpus: '1'
|
|
memory: 2G
|
|
```
|
|
|
|
### Worker CPU-Intensive (c5.xlarge)
|
|
|
|
```yaml
|
|
worker:
|
|
image: python:alpine
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '4'
|
|
memory: 4G
|
|
```
|
|
|
|
## Validation
|
|
|
|
### Verifica con docker compose config
|
|
|
|
```bash
|
|
docker compose config
|
|
```
|
|
|
|
Output per servizio con limits:
|
|
```yaml
|
|
services:
|
|
web:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: 1073741824 # 1G in byte
|
|
```
|
|
|
|
### Verifica con docker inspect
|
|
|
|
```bash
|
|
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:**
|
|
```yaml
|
|
# Riduci i limits
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '0.5' # Era '2'
|
|
memory: 512M # Era '2G'
|
|
```
|
|
|
|
### Errore: "invalid memory format"
|
|
|
|
**Causa:** Formato non valido
|
|
|
|
**Soluzione:**
|
|
```yaml
|
|
# ✗ 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
|