# Tutorial 1: Configurare i Limiti delle Risorse
In questo tutorial imparerai a configurare i limiti delle risorse CPU e memoria per i container Docker, simulando i diversi **EC2 Instance Types** di AWS.
## Obiettivi di Apprendimento
Al termine di questo tutorial sarai in grado di:
- Comprendere cosa sono gli **EC2 Instance Types** e come si applicano a Docker
- Configurare i limiti **CPU** e **memoria** in Docker Compose
- Mappare le configurazioni Docker alle istanze EC2
- Verificare i limiti delle risorse con `docker stats`
---
## Prerequisiti
- Docker Engine >= 24.0 installato e funzionante
- Docker Compose V2 (`docker compose` comando disponibile)
- Conoscenza base di Docker e docker-compose.yml
---
## Parte 1: EC2 Instance Types - Concetti Fondamentali
### Cos'è un EC2 Instance Type?
In AWS, un **Instance Type** definisce:
- **vCPUs**: Numero di CPU virtuali
- **Memory**: Quantità di RAM
- **Use case**: Tipo di carico di lavoro ottimale
### Famiglie di Instance Types Principali
| Famiglia | Prefix | Use Case | Esempio |
|----------|--------|----------|---------|
| **Burstable** | t2, t3 | Dev/test, basso costo | t2.micro |
| **General Purpose** | m5, m6 | Equilibrato CPU/memoria | m5.large |
| **Compute Optimized** | c5, c6 | Alta CPU | c5.xlarge |
| **Memory Optimized** | r5, r6 | Alta memoria | r5.large |
### Instance Types Comuni
| Instance Type | vCPUs | Memory | Use Case |
|---------------|-------|--------|----------|
| t2.nano | 0.5 | 512 MB | Microservizi |
| t2.micro | 1 | 1 GB | Dev/Test |
| t2.small | 1 | 2 GB | Web server |
| t2.medium | 2 | 4 GB | Application server |
| m5.large | 2 | 8 GB | Production app |
| m5.xlarge | 4 | 16 GB | High traffic |
---
## Parte 2: Limiti delle Risorse in Docker Compose
### Sintassi di Base
In Docker Compose, i limiti delle risorse si configurano con la sezione `deploy.resources.limits`:
```yaml
version: "3.8"
services:
app:
image: nginx:alpine
deploy:
resources:
limits:
cpus: '1' # Numero di CPU
memory: 1G # Memoria (M, G)
```
### Formati della Memoria
```yaml
memory: 512M # 512 Megabyte
memory: 1G # 1 Gigabyte
memory: 1024M # 1024 Megabyte (equivale a 1G)
```
### Format delle CPU
```yaml
cpus: '0.5' # Mezza CPU
cpus: '1' # 1 CPU completa
cpus: '2' # 2 CPU complete
cpus: '1.5' # 1.5 CPU (1 completa + 50% di un'altra)
```
---
## Parte 3: Pratica - Configurare un Container t2.micro
Creiamo un container simile a un'istanza **t2.micro** (1 vCPU, 1 GB RAM).
### Step 1: Creare il file docker-compose.yml
Crea il file `labs/lab-03-compute/docker-compose.yml`:
```yaml
version: "3.8"
services:
# Web server - simula t2.micro
web:
image: nginx:alpine
container_name: lab03-web
hostname: web
# Resource limits - t2.micro parallel
deploy:
resources:
limits:
cpus: '1'
memory: 1G
ports:
- "127.0.0.1:8080:80"
restart: unless-stopped
```
### Step 2: Verificare la sintassi
```bash
cd labs/lab-03-compute
docker compose config
```
Se non ci sono errori, vedrai la configurazione completa.
### Step 3: Avviare il container
```bash
docker compose up -d
```
### Step 4: Verificare i limiti applicati
```bash
# Ispeziona il container per vedere i limiti
docker inspect lab03-web --format '{{.HostConfig.NanoCpus}}'
# Output: 1000000000 (1e9 = 1 CPU)
docker inspect lab03-web --format '{{.HostConfig.Memory}}'
# Output: 1073741824 (1 GB in byte)
```
### Step 5: Monitorare l'utilizzo delle risorse
```bash
# Mostra l'utilizzo in tempo reale
docker stats lab03-web
```
Premi `Ctrl+C` per uscire.
```bash
# Snapshot singolo
docker stats --no-stream
```
**Output previsto:**
```
CONTAINER NAME CPU % MEM USAGE / LIMIT MEM %
12345 lab03-web 0.01% 2.5MiB / 1GiB 0.24%
```
Nota che il **LIMIT** è 1GiB, configurato correttamente.
---
## Parte 4: Pratica - Configurare un Container t2.small
Ora configuriamo un container simile a **t2.small** (1 vCPU, 2 GB RAM).
### Aggiungi il servizio app al docker-compose.yml:
```yaml
# Application server - simula t2.small
app:
image: nginx:alpine
container_name: lab03-app
hostname: app
deploy:
resources:
limits:
cpus: '1'
memory: 2G
ports:
- "127.0.0.1:8081:80"
restart: unless-stopped
```
### Avviare e verificare
```bash
docker compose up -d
docker compose ps
```
```bash
# Verifica i limiti
docker inspect lab03-app --format 'CPU: {{.HostConfig.NanoCpus}} CPUs, Memory: {{.HostConfig.Memory}} bytes'
```
---
## Parte 5: Pratica - Configurare un Container t2.medium
Configuriamo un container **t2.medium** (2 vCPU, 4 GB RAM).
### Aggiungi il servizio worker:
```yaml
# Worker - simula t2.medium
worker:
image: alpine:3.19
container_name: lab03-worker
hostname: worker
command: ["sh", "-c", "sleep 3600"]
deploy:
resources:
limits:
cpus: '2'
memory: 4G
restart: unless-stopped
```
### Avviare e verificare
```bash
docker compose up -d
docker stats --no-stream lab03-worker
```
---
## Parte 6: Tabella di Mapping Completa
Ecco la tabella completa di mapping tra Docker e EC2:
| Docker Limits | EC2 Instance | vCPUs | Memory | Use Case |
|---------------|--------------|-------|--------|----------|
| `cpus: '0.5'`
`memory: 512M` | t2.nano | 0.5 | 512 MB | Microservizi minimi |
| `cpus: '1'`
`memory: 1G` | t2.micro | 1 | 1 GB | Dev/Test |
| `cpus: '1'`
`memory: 2G` | t2.small | 1 | 2 GB | Web servers |
| `cpus: '2'`
`memory: 4G` | t2.medium | 2 | 4 GB | Application |
| `cpus: '2'`
`memory: 8G` | m5.large | 2 | 8 GB | Production |
| `cpus: '4'`
`memory: 16G` | m5.xlarge | 4 | 16 GB | High traffic |
---
## Parte 7: Verifica Finale
### Script di Verifica
Esegui questo comando per verificare tutti i limiti:
```bash
# Per ogni servizio, mostra i limiti
for service in web app worker; do
echo "Service: $service"
docker inspect "lab03-$service" --format ' CPUs: {{.HostConfig.NanoCpus}}'
docker inspect "lab03-$service" --format ' Memory: {{.HostConfig.Memory}}'
done
```
### Controllo INF-03
Lo script di verifica del lab controllerà automaticamente che tutti i servizi abbiano i limiti configurati (requisito **INF-03**).
```bash
bash tests/01-resource-limits-test.sh
```
---
## Risoluzione Problemi
### Errore: "no matching resources"
**Causa:** I limiti specificati superano le risorse disponibili sull'host.
**Soluzione:**
- Riduci i limiti CPU/memoria
- Libera risorse sull'host
- Usa un'istanza tipo più piccola
### Errore: "invalid memory format"
**Causa:** Formato della memoria non valido.
**Soluzione:**
- Usa `M` per Megabyte (es. `512M`)
- Usa `G` per Gigabyte (es. `1G`)
- Non usare spazi o formati misti
### Container OOM Killed
**Causa:** Il container sta tentando di usare più memoria del limite.
**Soluzione:**
- Aumenta il limite `memory`
- Indaga il consumo di memoria dell'applicazione
- Verifica memory leak
---
## Riepilogo
In questo tutorial hai imparato:
✓ **Concetto:** EC2 Instance Types definiscono CPU e memoria
✓ **Sintassi:** `deploy.resources.limits` in Docker Compose
✓ **Mapping:** Docker limits → EC2 instances
✓ **Verifica:** `docker stats` per monitorare l'utilizzo
✓ **Compliance:** INF-03 richiede limiti per tutti i container
---
## Prossimi Passi
Nel prossimo tutorial imparerai a:
- Implementare **healthchecks** per monitorare lo stato dei servizi
- Configurare dipendenze tra servizi con `depends_on`
- Mappare healthchecks Docker agli **ELB Health Checks** di AWS
Continua con **Tutorial 2: Implementare Healthchecks** →