2015-09-23 36 views
14

Ho bisogno di mappare le porte sull'host alle porte del contenitore. Posso ottenere questo risultato eseguendo il comando "docker run" con l'opzione -p. Come ottengo ciò attraverso lo Dockerfile? Utilizzando la seguente mette a "deprecated error"Come pubblicare le porte nei file docker

EXPOSE 80:8080 

In quale altro modo posso effettuare le porte esposte pubblico attraverso teh dockerfile?

risposta

14

Non è possibile. Quali porte sono pubblicate sull'host di docker è strettamente una decisione che deve essere presa dall'amministratore locale, non dall'immagine che stanno cercando di eseguire; questo sarebbe (a) un problema di sicurezza (hey, ho appena aperto l'accesso ssh al tuo sistema!) e (b) incline al fallimento (il mio contenitore webserver non può legarsi sulla porta 80 perché sto già facendo funzionare un server su porta 80).

Se si desidera evitare lunghe righe di comando docker run, considerare l'utilizzo di qualcosa come docker-compose per automatizzare il processo. È quindi possibile passare finestra mobile-comporre una configurazione come:

mywebserver: 
    image: myname/mywebserver 
    ports: 
    - 80:8080 

E poi un semplice docker-compose up inizierà il vostro contenitore con porto per container 8080 destinato ad ospitare la porta 80.

Aggiornamento 2017/03/11

In risposta al commento di Willa:

  • Utilizzando docker-compose no h elp con il problema di collisione della porta. Il problema di collisione della porta è un motivo per cui le immagini non dovrebbero essere in grado di specificare i binding della porta host. Stavo semplicemente offrendo docker-compose in alternativa alle lunghe righe di comando docker run con più associazioni di porte. Il problema di collisione delle porte potrebbe consentire a un container di eseguire un attacco denial-of-service sul tuo host: se, ad esempio, un container si avvia e si collega alla porta 80 prima di un server Apache sul tuo host (o in un altro contenitore), allora hai appena perso il tuo servizio web.

  • Riguardo al problema di sicurezza: se un'immagine è stata in grado di specificare i binding della porta host, sarebbe possibile che i contenitori aprissero l'accesso al contenitore a vostra insaputa. Permettere a un utente remoto di accedere a un container sul tuo host ti apre alla possibilità di un compromesso dell'host nel caso in cui le funzionalità del namespace nel kernel non riescano a isolare completamente il contenitore, e anche se ti fidi completamente dell'isolamento ti apre a potenziali problemi legali se tale contenitore viene utilizzato per scopi illeciti. In entrambi i casi è una cattiva idea.

+0

Grazie! che aiuta –

+0

In che modo l'uso di docker-compose risolve il potenziale di collisione in porto? Inoltre puoi esporre un po 'sul problema di sicurezza? – Willa

10

C'è una differenza tra esporre e pubblicare.

Esporre significa aprire la porta sul lato del contenitore, pubblicare significa aprirlo sull'host Docker al mondo esterno.

Ad esempio, se il comando di esecuzione della finestra mobile ha -p 80: 8080, espone la porta 8080 sul contenitore e la porta di pubblicazione 80 sull'host.

È possibile visualizzare solo le porte nel Dockerfile, se si desidera che la flessibilità pubblichi le porte, sarà necessario utilizzare il -p opting con la finestra mobile.