# Capitolo 6 – Docker Compose

In questo capitolo vedremo:

- Cos’è Docker Compose
- Installazione del plugin Compose
- Struttura di un file docker-compose.yml
- Gestione di applicazioni multi-container
- Comandi principali
- Variabili d’ambiente
- Best practice

---

## 6.1 Cos’è Docker Compose

Docker Compose è uno strumento che permette di definire e gestire applicazioni multi-container tramite un file YAML.

Con un solo comando è possibile:

- Creare reti
- Creare volumi
- Avviare più container
- Gestire dipendenze tra servizi

È ideale per ambienti di sviluppo e piccole/medie infrastrutture.

---

## 6.2 Verifica installazione

Docker Compose è incluso come plugin nelle versioni recenti di Docker.

Verifica:

```bash
docker compose version
```

Se il comando risponde con una versione, Compose è correttamente installato.

---

## 6.3 Struttura base di docker-compose.yml

Esempio semplice con Nginx:

```yaml
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
```

Salvare il file come:

```
docker-compose.yml
```

---

## 6.4 Avviare un progetto Compose

Dalla directory dove si trova il file:

```bash
docker compose up -d
```

Parametri:

- `up` → crea e avvia i servizi
- `-d` → modalità detached (background)

Verifica container attivi:

```bash
docker compose ps
```

---

## 6.5 Fermare e rimuovere i servizi

Fermare i container:

```bash
docker compose stop
```

Fermare e rimuovere container, reti e configurazioni:

```bash
docker compose down
```

Rimuovere anche i volumi:

```bash
docker compose down -v
```

---

## 6.6 Esempio applicazione multi-container (Web + Database)

Esempio con Nginx e MySQL:

```yaml
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: esempio
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
```

In questo esempio:

- Viene creata automaticamente una rete
- I servizi possono comunicare usando il nome del servizio (es. `db`)
- Il volume `db_data` salva i dati del database

---

## 6.7 Variabili d’ambiente con file .env

Creare un file `.env` nella stessa directory:

```
MYSQL_ROOT_PASSWORD=superpassword
```

Nel file docker-compose.yml:

```yaml
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
```

Compose caricherà automaticamente le variabili dal file `.env`.

---

## 6.8 Ricostruire i servizi

Se modifichi il Dockerfile:

```bash
docker compose up -d --build
```

Forzare la ricreazione dei container:

```bash
docker compose up -d --force-recreate
```

---

## 6.9 Visualizzare i log

Log di tutti i servizi:

```bash
docker compose logs
```

Seguire i log in tempo reale:

```bash
docker compose logs -f
```

Log di un singolo servizio:

```bash
docker compose logs web
```

---

## 6.10 Scalare un servizio

Esempio:

```bash
docker compose up -d --scale web=3
```

Questo avvia 3 istanze del servizio web.

---

## Best Practice

- Non usare `latest` in produzione
- Separare ambienti (dev, staging, prod)
- Usare file `.env` per password e configurazioni
- Versionare sempre il file docker-compose.yml
- Utilizzare volumi per dati persistenti
- Limitare CPU e RAM nei servizi critici

---

## Conclusione

Ora sai:

- Cos’è Docker Compose
- Gestire applicazioni multi-container
- Usare variabili d’ambiente
- Scalare servizi
- Gestire reti e volumi automaticamente

Nel prossimo capitolo vedremo come mettere in produzione un'applicazione Docker con reverse proxy e HTTPS.