docker / Guide

Docker: risolvere port already allocated e porte occupate

Una porta pubblicata usa indirizzo e porta dell’host Docker. Un altro container o programma può essere già in ascolto. Cambiare la porta host lascia invariata la porta interna del container.

Esempi per Bash; consulta i riferimenti per i dettagli del tuo ambiente.

docker — Cheat sheet

Trova chi usa la porta prima di arrestare servizi

Elenca i container in esecuzione e le porte pubblicate. Cerca il lato host di un mapping, come 8080->80/tcp. Su un host Linux, ss -ltnp elenca anche i listener TCP; alcuni dettagli dei processi richiedono privilegi adeguati.

docker ps --format 'table {{.Names}}\t{{.Ports}}'

Un elenco vuoto di container non dimostra che la porta sia libera: può occuparla un programma sull’host. Controlla anche indirizzo e protocollo. Identifica il servizio e il suo scopo prima di fermarlo.

Scegli una porta host disponibile

Per questo esempio web temporaneo, verifica prima che la porta host 8081 sia libera e il nome devsheet-web non sia usato. L’esempio usa l’indirizzo loopback dell’host e avvia nginx in primo piano.

docker run --rm --name devsheet-web -p 127.0.0.1:8081:80 nginx

Il mapping è HOST_IP:HOST_PORT:CONTAINER_PORT. Cambia solo la porta host in 8081; nginx resta sulla porta interna 80. Apri un altro terminale per provarlo. Ctrl+C arresta questo esempio e --rm rimuove il suo container.

Aggiorna il mapping in Compose

Nel file Compose modifica la voce ports del servizio interessato in 127.0.0.1:8081:80, dopo aver controllato la porta. Ricrea il servizio verificato per applicare il mapping; sostituisci web con il nome effettivo.

docker compose ps
docker compose up -d web

Un semplice riavvio non applica un mapping modificato. Controlla il progetto Compose prima di ricreare il servizio e conserva mount e dati applicativi. Arrestare container estranei può interrompere altri servizi.

Verifica il servizio pubblicato

Controlla il mapping in esecuzione e invia una richiesta HTTP alla porta host scelta. L’esempio nginx dovrebbe rispondere; altre applicazioni possono richiedere tempo per avviarsi.

docker ps --format 'table {{.Names}}\t{{.Ports}}'
curl --head http://127.0.0.1:8081/

Se il conflitto persiste, ricontrolla indirizzo host, porta e protocollo, inclusi i listener IPv4 e IPv6. Un errore HTTP dopo la connessione è diverso da un errore di bind. Esamina log e configurazione del servizio interessato.

Riferimenti

Tutte le guide