Il 25 ottobre 2026 EXPOSE non pubblica una porta. La Dockerfile reference, con dateModified 8 ottobre 2026 alle 01:41:54 (+02:00) e riletta oggi, lo scrive nel paragrafo dell’istruzione. Non ho eseguito docker run e non ho aperto un container. composer install, npm ci e PHP 8.5 restano pezzi già pubblicati.
In breve: EXPOSE informa Docker che il container ascolta quelle porte a runtime. Il protocollo, se manca, è TCP. L’istruzione non pubblica. Pubblica -p su docker run, che mappa. -P pubblica tutte le porte esposte e le mappa su porte alte ed effimere. TCP e UDP, in quel caso, non escono sulla stessa porta dell’host.
Cosa dice il paragrafo EXPOSE
La reference, nella scheda dell’istruzione, scrive che EXPOSE informa Docker che il container ascolta sulle porte di rete indicate, a runtime. Si può dichiarare TCP o UDP. Se il protocollo manca, il default è TCP. La frase successiva è il punto: l’istruzione non pubblica davvero la porta. Funziona come documentazione fra chi costruisce l’immagine e chi avvia il container, sulle porte che si intende pubblicare.
Per pubblicare, la stessa pagina manda a docker run -p, che pubblica e mappa una o più porte, oppure a -P, che pubblica tutte le porte esposte e le mappa su porte alte. L’esempio UDP in pagina è EXPOSE 80/udp. Per averle entrambe servono due righe, EXPOSE 80/tcp e EXPOSE 80/udp. Con -P, scrive la pagina, la porta esce una volta per TCP e una per UDP, e le due non usano la stessa porta dell’host, perché -P pesca una porta effimera alta.
Si può ignorare EXPOSE all’avvio. La pagina dice che, a prescindere da ciò che è stato esposto, -p sovrascrive. L’esempio è docker run -p 80:80/tcp -p 80:80/udp.
EXPOSE, -p e -P
| Cosa | Cosa fa, secondo la reference di oggi | Cosa non fa |
|---|---|---|
EXPOSE | Documenta le porte su cui il container ascolta. Default TCP | Non pubblica la porta sull’host |
docker run -p | Pubblica e mappa una o più porte. Può sovrascrivere EXPOSE | Non è un’istruzione del Dockerfile |
docker run -P | Pubblica tutte le porte esposte, su porte alte ed effimere | Non tiene TCP e UDP sulla stessa porta dell’host |
Più sopra, nella stessa reference, c’è una nota generale: l’istruzione non è case-sensitive, ma la convenzione è il maiuscolo, per distinguerla dagli argomenti. Non è una regola speciale di EXPOSE. La pagina elenca EXPOSE anche fra le istruzioni che accettano variabili d’ambiente sostituite dal builder, non dalla shell. Non ho provato una sostituzione.
La rete che non ha bisogno della pubblicazione
In coda al paragrafo, la reference scrive che docker network crea reti su cui i container si parlano senza esporre o pubblicare porte, perché chi è sulla stessa rete può usare qualunque porta. Rimanda all’overview di quella funzione. Oggi non ho aperto quella overview e non descrivo un driver. Il punto che sta in questo paragrafo è uno solo: la pubblicazione verso l’host e il traffico fra container sulla stessa rete non sono la stessa cosa.
Cosa questa istruzione non è
composer install non è EXPOSE. npm ci non pubblica una porta. PHP 8.5 non è un’istruzione di Dockerfile. Non ho riletto quei tre pezzi per questo articolo. Non ho misurato una porta in ascolto.
Errori da evitare
Credere che
EXPOSE 80renda il servizio raggiungibile dall’host. La reference dice che non pubblica.Usare
-Pe aspettarsi la porta 80 sull’host.-Pmappa su una porta alta ed effimera.Mettere TCP e UDP in una riga sola e dare per scontato che
-Pli faccia uscire insieme. La pagina chiede due righe, e due porte diverse sull’host.Trattare
EXPOSEcome un tetto.-p, all’avvio, può pubblicare altro.Aprire una porta sull’host per far parlare due container sulla stessa rete. La pagina dice che, su quella rete, non serve.
In sintesi
Il 25 ottobre 2026 la Dockerfile reference, aggiornata l’8 ottobre 2026, dice che EXPOSE documenta le porte e non le pubblica. Il default è TCP. Pubblicare è docker run -p, oppure -P per tutte le porte esposte, su porte alte. TCP e UDP vogliono due righe e, con -P, due porte dell’host. Sulla stessa rete Docker i container si parlano anche senza pubblicazione. Non ho avviato un container.
Foto di copertina: H. Zell, gru del container terminal di Bremerhaven, Wikimedia Commons, CC BY-SA 3.0. È un porto, non un Dockerfile e non una porta pubblicata.


