Risposta breve:
EXPOSE
è un modo di documentare
--publish
(o -p
) è un modo per mappare una porta host su una porta container in esecuzione
Si noti di seguito che:
EXPOSE
è correlato a Dockerfiles
( documentazione )
--publish
è correlato a docker run ...
( esecuzione / runtime )
Esporre e pubblicare i porti
Nella rete Docker esistono due diversi meccanismi che coinvolgono direttamente le porte di rete: esporre e pubblicare le porte. Ciò si applica alla rete bridge predefinita e alle reti bridge definite dall'utente.
EXPOSE
Esporre le porte utilizzando la parola chiave nel Dockerfile o il --expose
flag per l'esecuzione della finestra mobile. L'esposizione delle porte è un modo per documentare quali porte vengono utilizzate, ma in realtà non mappa né apre alcuna porta . L'esposizione delle porte è facoltativa.
Pubblica le porte usando il flag --publish
o --publish-all
su docker run
. Questo indica a Docker quali porte aprire sull'interfaccia di rete del contenitore. Quando viene pubblicata, una porta viene mappata su una porta di ordine superiore disponibile (superiore a 30000
) sul computer host, a meno che non si specifichi la porta su cui eseguire il mapping sul computer host in fase di esecuzione. Non è possibile specificare la porta su cui eseguire il mapping sul computer host quando si crea l'immagine (nel Dockerfile), poiché non è possibile garantire che la porta sia disponibile sul computer host in cui si esegue l'immagine .
da: Docker container networking
Aggiornamento ottobre 2019 : il testo sopra riportato non è più nei documenti ma una versione archiviata è qui: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Forse la documentazione attuale è la seguente:
Porti pubblicati
Per impostazione predefinita, quando si crea un contenitore, non pubblica nessuna delle sue porte nel mondo esterno. Per rendere disponibile una porta per servizi esterni a Docker o per contenitori Docker che non sono collegati alla rete del contenitore, utilizzare il flag --publish
o -p
. Questo crea una regola firewall che mappa una porta del contenitore su una porta sull'host Docker.
e può essere trovato qui: docs.docker.com/config/containers/container-networking/#published-ports
Anche,
ESPORRE
... L' EXPOSE
istruzione in realtà non pubblica 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.
da: riferimento Dockerfile
Accesso al servizio quando EXPOSE
/ --publish
non sono definiti:
Alla risposta di @Golo Roden si afferma che:
"Se non si specifica nessuno di questi, il servizio nel contenitore non sarà accessibile da nessuna parte se non dall'interno del contenitore stesso."
Forse era il caso al momento in cui veniva scritta la risposta, ma ora sembra che anche se non lo usi EXPOSE
o --publish
, host
e l'altra containers
della stessa rete sarà in grado di accedere a un servizio, è possibile iniziare all'interno di quel contenitore.
Come testarlo:
Ho usato il seguente Dockerfile
. Fondamentalmente, inizio con Ubuntu e installo un piccolo web-server:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Ho build
l'immagine come "testexpose" e run
un nuovo contenitore con:
docker run --rm -it testexpose bash
All'interno del contenitore, lancio alcune istanze di mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Sono quindi in grado di utilizzare curl
dall'host o altri contenitori per recuperare la home page di mini-httpd
.