Risposte:
Secondo il riferimento comporre docker ,
Esporre le porte . Specificare entrambe le porte (HOST: CONTAINER) o solo la porta del contenitore (verrà scelta una porta host casuale).
Il mio docker-compose.yml
aspetto è:
mysql:
image: mysql:5.7
ports:
- "3306"
Se lo faccio docker-compose ps
, sembrerà:
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
Esporre le porte senza pubblicarle sul computer host: saranno accessibili solo ai servizi collegati. È possibile specificare solo la porta interna.
Le porte non sono esposte ai computer host, ma solo ad altri servizi.
mysql:
image: mysql:5.7
expose:
- "3306"
Se lo faccio docker-compose ps
, sembrerà:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
Dockerfiles: "L'istruzione EXPOSE in realtà non pubblica la porta. Funziona come un tipo di documentazione ..." docs.docker.com/engine/reference/builder/#expose
docker-compose run
, la definizione della porta in docker-compose.yml
viene ignorata per impostazione predefinita. Utilizzare docker-compose up
o fornire il parametro--service-ports
porti :
esporre :
Porte Questa sezione viene utilizzata per definire il mapping tra il server host e il contenitore Docker.
ports:
- 10005:80
Significa che l'applicazione in esecuzione all'interno del contenitore è esposta sulla porta 80. Ma il sistema / entità esterno non può accedervi, quindi deve essere mappato sulla porta del server host.
Nota: è necessario aprire la porta host 10005 e modificare le regole del firewall per consentire alle entità esterne di accedere all'applicazione.
Possono usare
http: // {IP host}: 10005
qualcosa come questo
ESPOSIZIONE Viene utilizzato esclusivamente per definire la porta su cui è in esecuzione l'applicazione all'interno del contenitore finestra mobile.
Puoi definirlo anche in dockerfile. In generale, è buona pratica e ampiamente utilizzata definire EXPOSE all'interno del file docker perché molto raramente chiunque li esegue su una porta diversa dalla porta 80 predefinita
La ports
sezione pubblicherà le porte sull'host. Docker imposterà un forward per una porta specifica dalla rete host nel container. Per impostazione predefinita, questo viene implementato con un processo proxy userspace ( docker-proxy
) che è in ascolto sulla prima porta e inoltra nel contenitore, che deve essere in ascolto sul secondo punto. Se il contenitore non è in ascolto sulla porta di destinazione, verrà comunque visualizzato qualcosa in ascolto sull'host, ma verrà rifiutata una connessione se si tenta di connettersi a quella porta host, dall'inoltro non riuscito al contenitore.
Nota, il contenitore deve essere in ascolto su tutte le interfacce di rete poiché questo proxy non è in esecuzione nello spazio dei nomi di rete del contenitore e non può raggiungere 127.0.0.1 all'interno del contenitore. Il metodo IPv4 è quello di configurare l'applicazione per l'ascolto 0.0.0.0
.
Si noti inoltre che le porte pubblicate non funzionano nella direzione opposta. Non è possibile connettersi a un servizio sull'host dal contenitore pubblicando una porta. Troverai invece errori di finestra mobile che provano ad ascoltare la porta host già in uso.
Esporre è documentazione. Imposta i metadati sull'immagine e, quando in esecuzione, anche sul contenitore. In genere lo si configura nel Dockerfile con l' EXPOSE
istruzione e serve da documentazione per gli utenti che eseguono la propria immagine, in modo che possano sapere su quali porte per impostazione predefinita l'applicazione ascolterà. Se configurato con un file di composizione, questi metadati sono impostati solo sul contenitore. Puoi vedere le porte esposte quando esegui docker inspect
un'immagine o un contenitore.
Esistono alcuni strumenti che si basano su porte esposte. Nella finestra mobile, la -P
bandiera pubblicherà tutte le porte esposte su porte temporanee sull'host. Esistono inoltre vari proxy inversi che per impostazione predefinita utilizzano una porta esposta quando si invia traffico all'applicazione se non si imposta esplicitamente la porta del contenitore.
Oltre a questi strumenti esterni, esporre non ha alcun impatto sulla rete tra contenitori. È necessaria solo una rete docker comune e la connessione alla porta del contenitore per accedere a un contenitore da un altro. Se tale rete viene creata dall'utente (ad es. Non la rete bridge predefinita denominata bridge
), è possibile utilizzare DNS per connettersi agli altri contenitori.
Sono totalmente d'accordo con le risposte prima. Vorrei solo ricordare che la differenza tra esporre e porte fa parte del concetto di sicurezza nella finestra mobile. Va di pari passo con la rete di docker. Per esempio:
Immagina un'applicazione con un front-end Web e un back-end di database. Il mondo esterno ha bisogno dell'accesso al front-end Web (forse sulla porta 80), ma solo il back-end stesso ha bisogno di accedere all'host e alla porta del database. Utilizzando un bridge definito dall'utente, è necessario aprire solo la porta Web e l'applicazione del database non necessita di alcuna porta aperta, poiché il front-end Web può raggiungerla tramite il bridge definito dall'utente.
Questo è un caso d'uso comune quando si configura un'architettura di rete nella finestra mobile. Ad esempio, in una rete bridge predefinita, non sono accessibili porte dal mondo esterno. Pertanto è possibile aprire un ingresspoint con "porte". Con l'utilizzo di "esporre" si definisce la comunicazione all'interno della rete. Se si desidera esporre le porte predefinite, non è necessario definire "esporre" nel file di composizione mobile.
expose
in undocker-compose
? Per quanto ne so, non è necessario specificare esporre per rendere le porte accessibili ai servizi collegati.