Qual è la differenza tra le porte docker-compose vs expose


Risposte:


527

Secondo il riferimento comporre docker ,

Le porte sono definite come:

Esporre le porte . Specificare entrambe le porte (HOST: CONTAINER) o solo la porta del contenitore (verrà scelta una porta host casuale).

  • Le porte menzionate in docker-compose.yml saranno condivise tra diversi servizi avviati da docker-compose.
  • Le porte saranno esposte al computer host su una porta casuale o una determinata porta.

Il mio docker-compose.ymlaspetto è:

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 è definito come:

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

24
sarebbe possibile eto spiegare quali vantaggi ci sono nello specificare exposein un docker-compose? Per quanto ne so, non è necessario specificare esporre per rendere le porte accessibili ai servizi collegati.
Succoso

3
Non dovrebbe dire che le porte esposte saranno disponibili solo per i servizi nella stessa rete docker (il collegamento viene sostituito per la maggior parte delle parti)?
miagolio il

8
@Juicy Immagino sia simile a exposeDockerfiles: "L'istruzione EXPOSE in realtà non pubblica la porta. Funziona come un tipo di documentazione ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein

1
Le porte hanno la precedenza su qualsiasi impostazione a livello di firewall? Ho appena notato che non ho aperto le porte per mysql sul firewall, ma erano accessibili da remoto. Ho impostato Porte su "3306: 3306" invece di esporre.
Tekius Fanatikus,

3
E ricorda, se usi docker-compose run, la definizione della porta in docker-compose.ymlviene ignorata per impostazione predefinita. Utilizzare docker-compose upo fornire il parametro--service-ports
Juha Untinen,

178

porti :

  1. Attiva il contenitore per ascoltare le porte specificate dal mondo esterno alla finestra mobile (può essere la stessa macchina host o una macchina diversa) E anche un mondo accessibile all'interno della finestra mobile.
  2. Più di una porta può essere specificato (che è il motivo di porte non porta)

inserisci qui la descrizione dell'immagine

esporre :

  1. Attiva il contenitore per ascoltare una porta specifica solo dal mondo all'interno della finestra mobile E dal mondo non accessibile al di fuori della finestra mobile.
  2. È possibile specificare più di una porta

inserisci qui la descrizione dell'immagine


3
Nota che esporre consente più porte - docs.docker.com/compose/compose-file/#expose - tuttavia fornisci solo la porta interna anziché interna + esterna
Stuart Moore

Ma cosa devo fare se voglio accedere al mondo esterno dal mio contenitore? stackoverflow.com/questions/61322256/...
gstackoverflow

26

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


19

Ports

La portssezione 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

Esporre è documentazione. Imposta i metadati sull'immagine e, quando in esecuzione, anche sul contenitore. In genere lo si configura nel Dockerfile con l' EXPOSEistruzione 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 inspectun'immagine o un contenitore.

Esistono alcuni strumenti che si basano su porte esposte. Nella finestra mobile, la -Pbandiera 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.


3

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.

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.