Perché utilizzare EXPOSE in Dockerfile, poiché è comunque possibile associare tutte le porte


23

Posso docker run -p 3000:3000 image senza EXPOSE ing che porta nel contenitore (vedi sotto). Se questo è vero, allora perché preoccuparsi di inserire EXPOSE nel Dockerfile? È solo per la comunicazione agli utenti delle immagini? Perché non conosco un motivo funzionale per ESPORRE le porte se sono comunque tutte associabili.


Ecco i passaggi che mi mostrano l'associazione a una porta in un contenitore nonostante non sia EXPOSEd

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$

Risposte:


29

La documentazione EXPOSE di Docker affronta questo punto specifico:

L' EXPOSEistruzione non pubblica effettivamente la porta. Funziona come un tipo di documentazione tra la persona che crea l'immagine e la persona che gestisce il contenitore, su quali porte sono destinate a essere pubblicate. Per pubblicare effettivamente la porta quando si esegue il contenitore, utilizzare il -pflag on docker runper pubblicare e mappare una o più porte oppure il -Pflag per pubblicare tutte le porte esposte e mapparle su porte di ordine elevato.

Prestare attenzione all'ultima frase, se si espongono più porte, -Pdiventa utile per evitare l'impostazione multipla -psulla riga di comando.


La "documentazione" si presenta sotto forma di metadati di immagine. Oltre ad essere utili per il -Pflag, altre utility possono interrogare i container in esecuzione per questi metadati, utile nei proxy che aggiornano dinamicamente le loro regole di inoltro usando queste porte esposte come impostazioni predefinite.
BMitch

@Bitch assolutamente, ho pensato che fosse un'informazione estranea non ancora utile per l'OP, ma sentiti libero di modificarlo.
Tensibai,

EXPOSE è documentazione
井上 智 文

4

Questo viene fatto per motivi di automazione. È possibile disporre di un comando universale che viene eseguito docker run -Pper avviare un contenitore e lo stesso Dockerfile viene utilizzato per specificare quale contenitore espone quale porta. Nel caso tu abbia a che fare con dozzine o centinaia di container che vengono costruiti attraverso una pipeline, questo è abbastanza utile. Il passaggio di dettagli esterni non contenuti nel Dockerfile insieme al contenitore attraverso la pipeline da uno stadio all'altro è abbastanza difficile su scala.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.