Come appare il messaggio
Error response from daemon: driver failed programming external connectivity on endpoint web: Bind for 0.0.0.0:80 failed: port is already allocatedCause frequenti
- Un altro container pubblica la stessa porta, spesso dopo il cambio di progetto Compose.
- Un servizio dell'host usa la porta, per esempio nginx, Apache o Pi-hole.
- Un vecchio container è ancora attivo perché
docker compose downnon è mai stato eseguito. - Un container usa
network_mode: hoste in più dichiara il mapping delle porte. - Un processo
docker-proxydi un container rimosso tiene ancora la porta.
Verifica
- Chi ascolta sulla porta?
ss -lntp | grep ':80 ' - Quale container la pubblica?
docker ps --format 'table {{.Names}}\t{{.Ports}}' | grep ':80' - Tutte le porte, anche dei container fermi
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' - Processi proxy bloccati
ps aux | grep -i '[d]ocker-proxy'
Soluzione
- Trova e ferma il container con
docker stop NOME, poi rilanciadocker compose up -d. - Identifica il servizio dell'host e decidi se fermarlo o spostare il container su un'altra porta, per esempio
8080:80. - Con più progetti Compose distribuisci le porte in modo esplicito invece di mappare 80 e 443 due volte.
- Pulisci i container vecchi con
docker compose down --remove-orphans. docker restartnon risolve: la porta resta occupata finché gira l'altro processo.
Domande frequenti
Due container possono usare la porta 80?
Non direttamente. Solo uno tiene la porta dell'host. Metti un reverse proxy davanti e usa porte interne diverse.
La porta è occupata ma docker ps è vuoto.
Allora la tiene un processo dell'host. ss -lntp mostra PID e programma.