# Capitolo 5 – Gestione Avanzata dei Container

In questo capitolo vedremo:

- Gestione avanzata dei container
- Volumi Docker
- Reti Docker
- Variabili d’ambiente
- Limiti di risorse (CPU e RAM)
- Policy di riavvio

---

## 5.1 Gestione dei container

### Elencare i container

Container attivi:

```bash
docker ps
```

Tutti i container (anche fermati):

```bash
docker ps -a
```

---

### Avviare un container fermo

```bash
docker start nome_container
```

---

### Fermare un container

```bash
docker stop nome_container
```

---

### Riavviare un container

```bash
docker restart nome_container
```

---

### Eliminare un container

```bash
docker rm nome_container
```

Forzare la rimozione:

```bash
docker rm -f nome_container
```

---

## 5.2 Log dei container

Visualizzare i log:

```bash
docker logs nome_container
```

Seguire i log in tempo reale:

```bash
docker logs -f nome_container
```

---

## 5.3 Accesso alla shell di un container

Entrare in un container in esecuzione:

```bash
docker exec -it nome_container /bin/bash
```

Se bash non è disponibile:

```bash
docker exec -it nome_container /bin/sh
```

---

## 5.4 Variabili d’ambiente

Passare variabili al container:

```bash
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
```

Oppure tramite file `.env`:

```bash
docker run --env-file .env nginx
```

---

## 5.5 Volumi Docker

I volumi permettono di salvare dati persistenti fuori dal container.

### Creare un volume

```bash
docker volume create mio_volume
```

Elencare i volumi:

```bash
docker volume ls
```

---

### Utilizzare un volume

```bash
docker run -d \
  -v mio_volume:/var/lib/mysql \
  mysql
```

In questo modo i dati non vengono persi se il container viene eliminato.

---

### Rimuovere un volume

```bash
docker volume rm mio_volume
```

---

## 5.6 Bind Mount (cartella host)

Montare una cartella del sistema host:

```bash
docker run -d \
  -v /home/user/dati:/app/dati \
  nginx
```

Differenza:

- Volume → gestito da Docker
- Bind mount → directory reale del sistema host

---

## 5.7 Reti Docker

### Elencare le reti

```bash
docker network ls
```

---

### Creare una rete personalizzata

```bash
docker network create mia_rete
```

---

### Avviare container nella stessa rete

```bash
docker run -d --name app --network mia_rete nginx
docker run -d --name db --network mia_rete mysql
```

I container nella stessa rete possono comunicare usando il nome del container come hostname.

---

## 5.8 Limiti di risorse

Limitare la memoria:

```bash
docker run -d --memory="512m" nginx
```

Limitare la CPU:

```bash
docker run -d --cpus="1.0" nginx
```

Questo evita che un container utilizzi tutte le risorse del sistema.

---

## 5.9 Policy di riavvio

Riavviare automaticamente il container:

```bash
docker run -d --restart unless-stopped nginx
```

Opzioni disponibili:

- no
- always
- on-failure
- unless-stopped

---

## 5.10 Ispezione e statistiche

Dettagli completi di un container:

```bash
docker inspect nome_container
```

Utilizzo risorse in tempo reale:

```bash
docker stats
```

---

## Best Practice

- Usare volumi per dati persistenti
- Limitare CPU e RAM in ambienti di produzione
- Utilizzare reti personalizzate per isolamento
- Impostare policy di riavvio per servizi critici
- Monitorare log e risorse regolarmente

---

## Conclusione

Ora sai:

- Gestire container in modo avanzato
- Usare volumi e bind mount
- Configurare reti personalizzate
- Limitare risorse
- Configurare riavvii automatici

Nel prossimo capitolo vedremo Docker Compose per gestire applicazioni multi-container.