Tutorial Docker: inizia con la rete Docker

Un caso d'uso comune per Docker sono i servizi di rete e Docker ha il proprio modello di rete per consentire ai contenitori di parlare tra loro e con il mondo esterno.

In origine, i container Docker dovevano essere collegati in rete a mano o esposti manualmente al mondo esterno. L'attuale modello di rete consente ai contenitori di trovarsi automaticamente sullo stesso host (o su host diversi) e di essere esposti al mondo in generale in un modo più controllato.

Esistono quattro modi di base in cui Docker fornisce agli sviluppatori la rete per i contenitori. I primi due, bridge e overlay , coprono i casi d'uso più comuni in produzione. Gli altri due, reti host e Macvlan , esistono per coprire casi meno comuni.

Rete Docker: reti bridge

Le reti bridge consentono ai contenitori in esecuzione sullo stesso host Docker di comunicare tra loro. Una nuova istanza di Docker viene fornita con una rete bridge predefinita denominata bridgee per impostazione predefinita tutti i contenitori appena avviati si connettono ad essa.

La bridgerete viene fornita con molte pratiche impostazioni predefinite predefinite, ma potrebbe essere necessario un perfezionamento in produzione. Ad esempio, i contenitori bridgeattivati ​​hanno automaticamente tutte le porte esposte l'una all'altra, ma nessuna al mondo esterno. È utile quando è necessario testare la comunicazione tra contenitori, ma non per la distribuzione di un servizio live.

Per i migliori risultati, crea la tua rete bridge. I bridge definiti dall'utente hanno molte caratteristiche che il bridgebridge non ha:

  • La risoluzione DNS funziona automaticamente tra i contenitori su un bridge personalizzato. In questo modo, non è necessario utilizzare indirizzi IP grezzi per comunicare tra di loro come si fa sul bridgebridge. I contenitori possono individuare altri contenitori tramite DNS utilizzando il nome del contenitore.
  • I contenitori possono essere aggiunti e rimossi da un bridge personalizzato mentre sono in esecuzione.
  • Le variabili di ambiente possono essere condivise tra contenitori su un bridge personalizzato.

In breve, puoi iniziare ad armeggiare con i contenitori utilizzando il bridge predefinito, ma per qualsiasi lavoro di produzione serio ti consigliamo di creare un bridge personalizzato.

Rete Docker: reti overlay

Le reti bridge sono per contenitori sullo stesso host. Le reti overlay sono per contenitori in esecuzione su host diversi, come quelli in uno sciame Docker. Ciò consente ai contenitori tra host di trovarsi e comunicare, senza che tu debba preoccuparti di come configurarlo per ogni singolo contenitore partecipante.

Modalità sciame orchestratore di Docker crea automaticamente una rete sovrapposta, ingress. Per impostazione predefinita, qualsiasi servizio sullo swarm si collega a ingress. Ma come con l'impostazione predefinita bridge, questa non è la scelta migliore per un sistema di produzione, perché le impostazioni predefinite potrebbero non essere appropriate. La soluzione migliore è creare una rete overlay personalizzata, con o senza uno sciame, e collegare ad essa i nodi secondo necessità.

Se si desidera utilizzare una rete overlay con contenitori non in esecuzione in uno sciame, questo è un altro caso d'uso per la creazione di una rete overlay personalizzata. Si noti che ogni host Docker su una rete overlay deve avere le porte appropriate aperte ai suoi peer per essere visto, e senza la modalità swarm ogni nodo deve accedere a un archivio di valori-chiave di qualche tipo.

Si noti inoltre che le reti overlay, per impostazione predefinita, consentono solo 256 indirizzi IP distinti. Puoi aumentare questo limite, ma Docker consiglia di utilizzare più overlay.

Rete Docker: rete host

Il hostdriver di rete consente ai contenitori di eseguire gli stack di rete fianco a fianco con lo stack sull'host. Un server web sulla porta 80 in un hostcontenitore in rete è disponibile dalla porta 80 sull'host stesso.

Il più grande vantaggio del networking host è la velocità. Se è necessario concedere l'accesso a una porta del contenitore e si desidera renderlo il più vicino possibile al sistema operativo sottostante, questa è la strada da percorrere. Ma ha un costo in termini di flessibilità: se si mappa la porta 80 su un container, nessun altro container può utilizzarla su quell'host.

Rete Docker: rete Macvlan

Una rete Macvlan è per applicazioni che funzionano direttamente con la rete fisica sottostante, come le applicazioni di monitoraggio del traffico di rete. Il macvlandriver non assegna solo un indirizzo IP a un contenitore, ma anche un indirizzo MAC fisico.

Nota che questo tipo di rete Docker viene fornito con molte delle stesse avvertenze che avresti se, ad esempio, stessi creando indirizzi MAC virtuali utilizzando VM. In breve, Macvlan dovrebbe essere riservato solo alle applicazioni che non funzionano a meno che non si basino su un indirizzo di rete fisico.

Rete Docker: creazione e gestione di reti

Tutta la gestione della rete in Docker viene eseguita utilizzando il docker networkcomando. Molti dei suoi sottocomandi sono simili ad altri comandi Docker; ad esempio, docker network lsvisualizza tutte le reti configurate sull'istanza Docker corrente:

$ docker network ls NETWORK ID NAME DRIVER SCOPE 2e0adaa0ce4a bridge bridge local 0de3da43b973 host host local 724a28c6d86d nessuno null locale

Per creare una rete, usa il createsottocomando insieme al --driverflag per indicare quale driver usare ( bridge, overlay, macvlan):

$ docker network create --driver bridge my-bridge 

I contenitori in rete host non richiedono la creazione di una rete per essi. Lancia invece il contenitore con la --network hostbandiera. Tutti i processi sul contenitore sono in ascolto sulle porte preconfigurate, quindi assicurati che siano impostati per primi.

Le opzioni per la creazione di una rete includono anche la specifica della sua sottorete, intervallo di indirizzi IP e gateway di rete, proprio come sarebbe il caso per la creazione di una rete utilizzando altri mezzi.

I contenitori vengono eseguiti per impostazione predefinita sulla bridgerete. Per utilizzare una rete particolare, è sufficiente utilizzare il --networkflag all'avvio del contenitore e specificare il nome della rete.

Puoi anche associare un contenitore in esecuzione a una rete:

$ docker network connect bridge my_container

Questo si collega  my_containeralla bridgerete, preservando le connessioni di rete esistenti che ha già.

Quando un container viene disattivato, tutte le reti ad esso associate vengono lasciate intatte. Se desideri rimuovere manualmente le reti, puoi farlo con il docket network rm comando, oppure utilizzare docker network pruneper rimuovere tutte le reti non più in uso sull'host.

Rete Docker e rete Kubernetes

Se stai guardando Kubernetes come una soluzione di orchestrazione, ma hai già una discreta quantità di lavoro sprofondato in una configurazione di rete Docker, non sarai entusiasta di sentire che non c'è corrispondenza uno a uno tra il modo in cui Docker e Kubernetes gestiscono la rete.

I dettagli sono descritti nella documentazione di Kubernetes, ma la versione breve è che hanno modelli fondamentalmente diversi per il modo in cui le risorse di rete vengono allocate e gestite. Quindi, dovrai ideare una configurazione di rete specifica per Kubernetes per la tua applicazione.

Un possibile approccio a metà strada consiste nell'utilizzare un plug-in Kubernetes Container Network Interface (CNI) che funziona con i controlli di rete di Docker. Ma questa è nel migliore dei casi una soluzione provvisoria; a un certo punto, dovrai costruire i tuoi progetti Kubernetes usando le proprie metafore di rete dall'interno.