Qual è la differenza tra l'esposizione e la pubblicazione di una porta Docker?

0
55
Michael Vi/Shutterstock.com< /figure>

Le porte container esposte e pubblicate sono due concetti diversi ma correlati in Docker. Le porte esposte sono definite nel tuo Dockerfile come semplici metadati. È necessario pubblicarli all'avvio del contenitore se si desidera abilitare l'accesso esterno.

Esposizione di una porta

Le porte sono esposte tramite istruzioni EXPOSE in un image's Dockerfile:

EXPOSE 80

L'esposizione di una porta non ha tuttavia alcun effetto immediato. L'istruzione comunica solo che l'applicazione all'interno del container è in ascolto sulla porta 80. Non apre quella porta al mondo né fornisce esplicitamente l'accesso a nessun altro container.

In qualità di autore di immagini, l'elenco delle porte utilizzate dal carico di lavoro con EXPOSE aiuta gli utenti a configurare le regole di port forwarding appropriate quando avviano un container. Ciò è particolarmente importante quando vengono utilizzate porte non standard: mentre ci si può aspettare che un server web ascolti sulla porta 80, gli utenti non saranno in grado di indovinare la porta utilizzata da un server socket personalizzato.

Le porte esposte sono visibili quando elenchi i container con docker ps. Verranno visualizzati nella colonna PORTE, anche se non saranno effettivamente accessibili all'esterno del contenitore. Questo ti dà un modo semplice per controllare su quali porte è in ascolto il software all'interno di un container.

Puoi ispezionare le porte esposte da un'immagine senza avviare un contenitore utilizzando docker inspect. Sostituisci il tag o l'ID della tua immagine invece di demo-image:

docker inspect –format=”{{json .Config.ExposedPorts}}” demo-image

Porte di pubblicazione

La pubblicazione di una porta la rende accessibile dall'esterno del contenitore. Ti consente di prendere una porta che hai scoperto da un'istruzione EXPOSE, quindi associare una porta host ad essa.

Annuncio

Le porte sono esposte con il flag -p per il comando docker run:

docker run -d -p 8080:80 httpd:latest

Questo comando associa la porta 8080 sul tuo host Docker a 80 all'interno del tuo nuovo contenitore. Ora puoi visitare http://localhost:8080 per accedere alla porta del contenitore. Se esegui docker ps, vedrai che la colonna PORTS ora mostra questa mappatura. La porta 80 del contenitore esposta è stata pubblicata sull'host.

Il flag -p può essere utilizzato senza specificare una porta a cui collegarsi:

docker run -d -p 80 httpd:latest

Questa variante legherà la porta 80 nel contenitore a una porta casuale sull'host. Puoi controllare la porta che è stata assegnata eseguendo docker ps.

-p supporta anche la pubblicazione di una porta su interfacce di rete specifiche:

docker run -d -p 127.0.0.1:8080:80 httpd:latest Advertisement

Qui la porta 80 del contenitore sarà accessibile solo tramite la porta 8080 sull'indirizzo di loopback locale dell'host. Ciò protegge il tuo contenitore dalle chiamate di rete effettuate dagli altri tuoi dispositivi.

Pubblicazione di tutte le porte esposte

Puoi avviare un contenitore con il flag –publish-all per fare in modo che Docker pubblichi automaticamente tutte le porte esposte elencate nel Dockerfile dell'immagine:

docker run -d –publish-all httpd:latest

Questo assegnerà porte libere casuali sul tuo host a ciascuna porta esposta nel contenitore. Utilizzare il comando docker ps per visualizzare le assegnazioni delle porte effettuate. Ciò semplifica l'avvio di un nuovo contenitore da un'immagine che richiede l'apertura di diverse porte non standard.

Puoi combinare –publish-all con mappature esplicite -p. In questo caso, una mappatura creata da un flag -p sovrascriverà la porta casuale assegnata da –publish-all.

Quando non è necessario pubblicare una porta

Devi pubblicare le porte del contenitore con -p solo se desideri accedervi dal tuo host Docker o da un altro dispositivo sulla rete fisica. Le reti Docker sono l'approccio alternativo preferito per il traffico tra container.

I container che condividono una rete possono sempre comunicare tra loro, anche se le loro porte non sono state pubblicate esplicitamente.

docker network create demo-network docker run -d –network demo-network –name web web:latest docker run -d –network demo-network –name database database:latest Advertisement

In questo esempio , il contenitore Web potrebbe connettersi a un server MySQL in esecuzione sulla porta 3306 nel contenitore del database utilizzando l'indirizzo database:3306. Docker imposta automaticamente le tabelle di routing per i nomi dei container nella rete.

Utilizzo degli intervalli di porte

Docker può esporre e pubblicare interi intervalli di porte quando è necessario disporre di più porte disponibili:

EXPOSE 8000-8100 docker run –publish-all docker run -p 6000-6100:8000-8100

Nel primo caso , –publish-all assegnerà 100 porte casuali sul tuo host e le mapperà nell'intervallo del contenitore. Il secondo modulo associa in modo esplicito un intervallo di host a un intervallo di contenitori come di consueto. Le prestazioni possono essere influenzate se utilizzi un numero molto elevato di porte poiché verrà creata una regola iptables per ognuna.

Riepilogo

Le porte esposte sono parti di metadati che definiscono le porte ascoltate dal software all'interno di un'immagine contenitore. La presenza di porte esposte non le rende accessibili a meno che non le pubblichi manualmente. In questo senso, il verbo “esporre” è un termine improprio, poiché molte persone ritengono che sia un'azione attiva quando in realtà è una dichiarazione informativa. EXPOSE dovrebbe essere trattato come documentazione, mentre il flag -p crea una mappatura delle porte funzionante.

Docker fornisce alcuni comportamenti extra basati sulle istruzioni EXPOSE. Puoi visualizzare le porte esposte di un container con docker ps indipendentemente dal fatto che siano state pubblicate. C'è anche il flag –publish-all che pubblica le porte esposte di un'immagine su porte host casuali.

Devi pubblicare le porte solo quando vuoi accedere a un contenitore dall'esterno una rete Docker. La comunicazione tra container nella stessa rete è sempre libera, indipendentemente dal fatto che le porte coinvolte siano state esposte o pubblicate.