Vai al contenuto principale

Padroneggiare il networking di Docker: dai bridge personalizzati alle architetture pronte per Swarm

Una guida pratica completa alle reti Docker, inclusi driver di rete, gestione IP, setup dell'overlay in Swarm e tuning delle prestazioni per sistemi containerizzati scalabili e sicuri.
· 12 min leggi

Scopri con l'IA

Il networking è un concetto centrale nelle applicazioni containerizzate. Consente una comunicazione fluida tra tutti i container, i sistemi host e i servizi esterni. Le funzionalità di rete integrate di Docker sono fondamentali per isolare efficacemente i servizi, mettere in sicurezza i flussi di dati e orchestrare architetture a microservizi scalabili.

Uno degli strumenti più potenti in questo contesto è il comando Docker network create, che permette a ingegneri DevOps e sviluppatori di definire reti personalizzate su misura per le esigenze della loro applicazione.

Per questo oggi ti guiderò passo passo su come creare e gestire queste reti Docker in modo efficace. 

Se sei alle prime armi con Docker, dai un'occhiata al nostro percorso di competenze su Containerization and Virtualization with Docker and Kubernetes per fare un po' di pratica. 

Che cos'è il Docker Networking?

Creare applicazioni moderne comporta in genere l'uso di diversi servizi in container separati e isolati. Il networking di Docker offre un modo flessibile e potente per connettere tra loro questi container e con sistemi esterni, tramite il modello di rete che preferisci, a prescindere dall'infrastruttura sottostante.

Questa sezione ti fornirà le nozioni di base sul networking di Docker, un componente chiave di Docker, e su come valutare quale configurazione di rete funziona per la tua applicazione. Ma prima di iniziare, se sei completamente nuovo a Docker, ti consiglio vivamente di consultare Introduction to Docker per costruire solide basi prima di approfondire il networking di Docker.

Driver di rete: le fondamenta del networking di Docker

Docker utilizza driver di rete per specificare come i container si connettono e comunicano. Ogni driver definisce come gestirà il networking dei container. Di conseguenza, per ciascuno dei principali driver di rete di Docker ci sono livelli diversi di prestazioni, isolamento e complessità.

Panoramica dei driver di rete core di Docker

Ecco i principali driver integrati supportati da Docker:

  1. Bridge: Il driver predefinito per i container standalone. Crea una rete interna isolata sull'host, consentendo ai container di comunicare tra loro usando IP o nomi dei container. Ideale per sviluppo e test su un singolo host.
  2. Host: Rimuove l'isolamento condividendo lo stack di rete dell'host. Il container usa direttamente IP e porte dell'host. Utile per applicazioni ad alte prestazioni o per compatibilità con servizi a livello host.
  3. None: Disabilita tutta la rete per il container. È disponibile solo l'interfaccia di loopback. Ottimo per container che non necessitano di connettività esterna o richiedono un isolamento di sicurezza rigoroso.
  4. Overlay: Abilita la comunicazione tra container su host Docker diversi. Comunemente usato in Docker Swarm e in deployment multi-host. Crea una rete distribuita che astrae l'infrastruttura fisica sottostante.
  5. Macvlan: Assegna un indirizzo MAC univoco a ciascun container, facendolo apparire come un dispositivo fisico sulla rete. Adatto ad applicazioni legacy che richiedono accesso diretto alla rete fisica.
  6. IPvlan: Simile a macvlan, ma instrada il traffico a livello IP invece di usare gli indirizzi MAC. Offre prestazioni e controllo migliori in ambienti ad alta densità.

Ogni driver influisce su come i container interagiscono tra loro, con l'host e con le reti esterne. 

Curioso di vedere come questi tipi di rete funzionano insieme? Il nostro corso Intermediate Docker tratta in dettaglio pratico il networking di Docker, i volumi e Compose. Capire queste differenze è fondamentale per progettare architetture sicure e performanti.

Quale tipo di rete dovrei usare?

La scelta del driver di rete giusto dipende dall'architettura della tua applicazione e dagli obiettivi operativi:

  1. Bridge: Consigliato per la maggior parte degli scenari di sviluppo locale e per semplici applicazioni multi-container su un singolo host. Offre un buon equilibrio tra isolamento e facilità d'uso.
  2. Host: Ideale quando i container devono collegarsi direttamente alla rete dell'host, ad esempio per esporre servizi su porte standard (ad es. porta 80 o 443). Fai attenzione a sicurezza e conflitti di porte.
  3. None: Ideale per workload in sandbox o attività critiche per la sicurezza che non devono avere alcun accesso di rete. Comune in workflow automatizzati o test.
  4. Overlay: Essenziale in ambienti cluster come Docker Swarm o Kubernetes, dove i container si estendono su più host. Abilita lo scaling orizzontale e il service discovery.
  5. Macvlan: Preferibile quando i container devono comportarsi come dispositivi fisici sulla LAN. Usato in casi come sniffing di rete, integrazione di sistemi legacy o quando si vuole bypassare lo stack di rete di Docker.
  6. IPvlan: Offre controllo granulare e prestazioni migliori rispetto a macvlan per ambienti con requisiti di rete stringenti, come telco o sistemi finanziari.

Considera fattori come topologia dell'host, esigenze di sicurezza e strategia di scalabilità quando scegli un driver di rete. 

Se stai ancora decidendo quale rete si adatta al tuo carico di lavoro, scopri come Docker si confronta con Kubernetes in deployment reali con questa guida Kubernetes vs Docker.

Creare reti Docker personalizzate

Le reti Docker personalizzate ti permettono di controllare come i container comunicano internamente tra loro e con sistemi esterni, aiutandoti a isolare meglio i servizi, assegnare IP prevedibili o progettare l'architettura per prestazioni o sicurezza. 

Questa sezione ti guiderà dalle basi alle funzionalità più avanzate nel processo di creazione di reti Docker personalizzate, inclusi i comandi e le configurazioni IP personalizzate.

Struttura di comando di base

Per creare una rete personalizzata, usa il comando docker network create. Questo ti permette di definire il driver di rete, la subnet e altre opzioni per un migliore controllo sulla comunicazione tra container.

Ecco un semplice esempio usando il driver predefinito bridge:

$ docker network create demo-network -d bridge

Questo comando crea una rete bridge chiamata demo-network. Docker restituisce un ID di rete univoco come conferma. A questo punto, la rete esiste ma non connette ancora alcun container.

Puoi visualizzare le reti esistenti con:

$ docker network ls

Per connettere un container alla nuova rete, usa il flag --network:

$ docker run -it --rm --name container1 --network demo-network busybox:latest

Per aggiungere una rete a un container esistente:

$ docker network connect demo-network container2

E per rimuoverla:

$ docker network disconnect demo-network container2

Infine, quando la rete non serve più, puoi rimuoverla:

$ docker network rm demo-network

Per ripulire tutte le reti non utilizzate:

$ docker network prune

Gestione avanzata degli indirizzi IP

Quando lavori con sistemi più grandi o policy di rete specifiche, Docker ti permette di gestire manualmente gli intervalli di indirizzi IP all'interno di reti personalizzate.

Puoi definire una subnet e un gateway usando i flag --subnet e --gateway:

$ docker network create \
  --driver bridge \
  --subnet 192.168.100.0/24 \
  --gateway 192.168.100.1 \
  custom-network

Per un controllo ancora maggiore, usa:

  • --ip-range: Assegna un pool di IP da cui i container possono attingere dinamicamente, separato dall'intera subnet.
  • --aux-address: Riserva indirizzi IP specifici all'interno della subnet per sistemi esterni o per documentazione.

Ad esempio: 

$ docker network create \
  --driver bridge \
  --subnet 192.168.200.0/24 \
  --ip-range 192.168.200.128/25 \
  --aux-address reserved=192.168.200.254 \
  advanced-network

Questa configurazione:

  • Limita gli IP dinamici dei container alla metà superiore della subnet.
  • Previene collisioni con un IP riservato.
  • Garantisce un comportamento di rete coerente in ambienti complessi.

Se ti servono esempi più guidati, puoi esplorare strategie di setup avanzate in 10 Docker Project Ideas: From Beginner to Advanced.

Networking in modalità Swarm

La modalità Docker Swarm abilita il deployment orchestrato di servizi su un cluster di host Docker. Una parte critica di questa orchestrazione è il networking, che garantisce che i servizi in esecuzione su nodi diversi possano comunicare tra loro in modo fluido e sicuro.

Architetture di rete compatibili con Swarm

Docker Swarm è la soluzione di clustering nativa di Docker che trasforma un insieme di host Docker in un unico motore virtuale. Ti consente di distribuire e gestire i container come servizi distribuiti. Uno dei suoi punti di forza è il networking multi-host, che permette ai servizi su macchine diverse di comunicare come se fossero sullo stesso host.

Il networking di Swarm supporta due tipi principali di traffico:

  • Traffico del control plane – comunicazione di gestione crittografata tra i nodi Docker.
  • Traffico del data plane – comunicazione container-to-container e accesso ai servizi esterni.

Swarm usa reti overlay per supportare la comunicazione tra nodi dei servizi e il routing mesh per bilanciare il carico del traffico esterno tra le repliche dei servizi.

Creare reti in Swarm

Per supportare il service discovery e la comunicazione sicura multi-host, Docker Swarm utilizza reti overlay con scope swarm. Possono essere create manualmente o automaticamente all'avvio dei servizi.

Ecco come creare una rete overlay con scope swarm:

$ docker network create \
  --driver overlay \
  --scope swarm \
  my-overlay

Questa rete non è limitata a un singolo host; qualsiasi nodo che partecipa allo swarm può connettervi dei container. Puoi ispezionarla con:

$ docker network inspect my-overlay

Personalizzare le reti Overlay

Le reti overlay supportano configurazioni avanzate, ad esempio:

$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --gateway 10.0.9.99 \
  --opt encrypted \
  my-secure-overlay
  • --subnet e --gateway definiscono la topologia della rete.
  • --opt encrypted abilita la crittografia IPSEC per il traffico dei container.
  • --scope swarm viene applicato automaticamente con il driver overlay in modalità swarm.

Comprendere i flag --scope e --attachable

  • --scope swarm: Indica che la rete è disponibile su tutti i nodi dello swarm. Solo i servizi di swarm (non i container standalone) possono usare questa rete a meno che non sia specificato --attachable.
  • --attachable: Consente ai container standalone di unirsi a una rete con scope swarm. Utile per debugging o accessi temporanei dei container.

Ad esempio: 

$ docker network create \
  --driver overlay \
  --attachable \
  my-dev-overlay

Questo ti permette di collegare alla rete di swarm anche container regolari, oltre ai servizi.

Configurazione e validazione della rete

Devi assicurarti che le tue reti Docker siano configurate correttamente per comunicare in modo appropriato tra i container, fornire la sicurezza necessaria e servizi performanti. Docker dispone di diversi strumenti e comandi per rivedere, risolvere problemi e convalidare le configurazioni di rete.

Verifica della configurazione di rete

Per esaminare i dettagli di configurazione di qualsiasi rete Docker, usa il comando docker network inspect.  Riceverai un output JSON dettagliato che include:

  • Driver di rete (bridge, overlay, ecc.)
  • Configurazione di subnet e gateway
  • Scope (local, swarm)
  • Container connessi e i loro indirizzi IP
  • Accesso interno o esterno
  • Opzioni specifiche del driver (ad es. ID VXLAN per reti overlay)

Ad esempio, potresti fare qualcosa del genere:

$ docker network inspect my-network

Cerca campi chiave come:

  • "Driver": garantisce che sia stato creato il tipo di rete previsto.
  • "IPAM": conferma le impostazioni di gestione degli indirizzi IP, incluse subnet o gateway personalizzati.
  • "Containers": mostra quali container sono collegati e gli IP assegnati.
  • "Options": visualizza configurazioni avanzate come la crittografia (encrypted: true) o la dimensione MTU.

Tecniche di validazione

Per confermare che la rete funzioni come previsto:

  1. Per prima cosa devi verificare la configurazione IPAM. Controlla la sezione "IPAM" nell'output di Docker network inspect. Assicurati che subnet e gateway corrispondano alla configurazione desiderata. Subnet mal configurate possono causare problemi di connettività o conflitti di IP.
  2. Poi controlla gli identificatori VXLAN (solo Overlay). Le reti overlay usano VXLAN per incapsulare il traffico dei container su più host. Ispeziona la sezione "Options" per chiavi come:
"com.docker.network.driver.overlay.vxlanid_list": "4097"

Questo conferma che il tunnel VXLAN è attivo e correttamente configurato. Se assente o errato, i servizi potrebbero non essere raggiungibili tra i nodi.

  1. Infine, testa la connettività tra container. Da un container, prova a fare ping o ad accedere a un altro per nome o IP. Questo conferma che la risoluzione DNS e l'instradamento interno funzionano:
$ docker exec -it container1 ping container2

Controlla il comportamento del DNS

I container connessi a reti definite dall'utente usano il DNS embedded di Docker. Per confermarlo, ispeziona /etc/resolv.conf all'interno del container e testa la risoluzione dei nomi dei servizi.

Convalida l'instradamento del gateway

Per i container su più reti, Docker seleziona il gateway predefinito in base alla gw-priority più alta. Per imporre l'instradamento corretto, assegna priorità esplicite durante la creazione del container:

$ docker run --network name=public,gw-priority=1 --network private mycontainer

Usa log e strumenti diagnostici

Monitora i log dei container per errori di connettività e usa strumenti come curl, dig e ip a all'interno dei container per il debugging a basso livello.

In sintesi, convalidare le configurazioni di rete Docker aiuta a garantire una comunicazione fluida tra container e riduce al minimo i guasti imprevisti nelle applicazioni multi-servizio. 

E questo ci porta alla sezione seguente.

Sicurezza e ottimizzazione delle prestazioni

Il networking reale dei container non consiste solo nell'abilitare la comunicazione. In molti casi, fornisce il necessario isolamento garantendo al contempo le massime prestazioni. Quando metti in sicurezza la tua architettura ed eroghi un servizio, segmentazione e throughput possono aiutarti a farlo.

Strategie di segmentazione della rete

La segmentazione della rete è una pratica fondamentale e un metodo di sicurezza per le applicazioni containerizzate. Assegnando i container a reti Docker distinte, puoi separare le preoccupazioni trasversali come la segmentazione per servizi con frontend, backend e database. Questo consente una mitigazione proattiva del rischio contro esposizione e potenziali attacchi.

Puoi sfruttare le reti definite dall'utente per gestire i confini di comunicazione. I container in reti diverse non possono comunicare tra loro a meno che non li colleghi esplicitamente. Ad esempio, se metti il tuo container del database su una rete solo interna, i servizi esposti pubblicamente non possono accedervi direttamente.

Regole e controlli firewall integrati

Per impostazione predefinita, Docker implementa regole iptables per limitare i punti di comunicazione tra i container e il mondo esterno. 

Alcuni modi per estendere questa segmentazione includono:

  • Disabilitare la comunicazione tra container sulla rete bridge predefinita:
{
  "icc": false
}
  • Aggiungi questo al daemon.json del demone Docker per impedire ai container di comunicare a meno che non siano sulla stessa rete definita dall'utente.
  • Limitare capacità e privilegi usando flag come --cap-drop, --read-only e --no-new-privileges.
  • Usare reti overlay in modalità Swarm per comunicazioni di servizio crittografate e con scope su più host.

Tecniche di ottimizzazione delle prestazioni

Ci sono diversi modi per migliorare le prestazioni ottimizzando con Docker. 

Migliorare il throughput di rete

La scelta del driver di rete giusto ha un impatto diretto sulle prestazioni. Ad esempio:

  • Usa il driver host quando sono essenziali latenza bassa e alto throughput, e l'isolamento di rete non è una priorità.
  • Preferisci bridge per ambienti locali e isolati.
  • Usa macvlan quando i container devono comportarsi come dispositivi fisici sulla tua rete.

Evita di sovraccaricare la rete bridge predefinita e crea reti separate per servizi pesanti o raggruppamenti logici.

Profilazione delle prestazioni con iperf3 e metriche

Per misurare le prestazioni di rete, usa strumenti di profilazione come iperf3:

# Start server in container1
docker run -it --rm --name server --network my-net networkstatic/iperf3 -s

# Run client in container2
docker run -it --rm --network my-net networkstatic/iperf3 -c server

Puoi anche monitorare le statistiche di rete usando:

  • docker stats – CPU, memoria e I/O di rete in tempo reale.
  • Prometheus + cAdvisor – Per metriche a serie temporali e monitoraggio a lungo termine.
  • Script o agent personalizzati che esportano le metriche di /proc/net/dev dall'interno dei container.

La profilazione regolare aiuta a individuare i colli di bottiglia in anticipo e a guidare le decisioni su posizionamento dei container, scelta del driver o upgrade della rete dell'host.

Risoluzione dei problemi di rete

Anche con le best practice, possono sorgere problemi di rete. Diagnosticarli e risolverli rapidamente è fondamentale per mantenere l'uptime dei servizi. Questa sezione fornisce strumenti e tecniche per identificare e correggere i problemi comuni di networking in Docker.

Diagnosticare i problemi di rete

Un container minimale potrebbe non avere strumenti come ping, dig o netstat, rendendo difficile la risoluzione dei problemi. Invece di modificare il container, avviane uno nuovo che condivida il suo namespace di rete:

docker run -it --network container:my-container alpine

Poi installa gli strumenti di rete:

apk add --no-cache iproute2 bind-tools net-tools

In alternativa, usa nicolaka/netshoot, un'immagine pensata appositamente e ricca di strumenti diagnostici:

docker run -it --rm --network container:my-container nicolaka/netshoot

Strumenti come ip, nslookup, netstat e traceroute ti aiuteranno a identificare problemi di instradamento o DNS.

Risoluzione dei problemi di connettività

Alcune cause comuni e le relative soluzioni:

  • Errori di risoluzione DNS: Assicurati che il container sia su una rete definita dall'utente per beneficiare del DNS embedded di Docker. Controlla /etc/resolv.conf e usa dig o nslookup per testare la risoluzione dei nomi.
  • Mismatch di MTU: I container su reti o host diversi potrebbero subire drop di pacchetti a causa di MTU non allineate. Riduci la MTU nelle reti overlay se viene usato il tunneling:
docker network create --driver overlay --opt com.docker.network.driver.mtu=1200 my-overlay

Subnet in conflitto

Evita sovrapposizioni di subnet tra reti Docker o con le reti fisiche del tuo host. Usa --subnet per definire intervalli non in conflitto.

Porte bloccate dal firewall dell'host

Assicurati che le porte richieste da Docker siano aperte:

  • 2377 (gestione Swarm)
  • 7946 TCP/UDP (scoperta dei container)
  • 4789 UDP (dati overlay)

Una risoluzione efficace dei problemi combina diagnostica e una solida comprensione di come i container interagiscono con le loro reti. Con gli strumenti e l'approccio giusti, la maggior parte dei problemi può essere isolata e risolta in pochi minuti.

Conclusioni

Il Docker Networking è un componente fondamentale delle architetture containerizzate, che abilita comunicazioni sicure, efficienti e scalabili tra i servizi, che siano in esecuzione su un singolo host o su un cluster distribuito. 

Con il supporto integrato a vari driver di rete, una gestione IP personalizzabile e reti overlay native di Swarm, Docker consente a sviluppatori e team DevOps di isolare i workload, controllare i flussi di dati e ottimizzare le prestazioni in ambienti complessi.

Non è una soluzione valida per tutti, ma se usato con criterio offre funzionalità robuste per costruire microservizi moderni, pipeline di automazione e sistemi distribuiti sicuri.

Vuoi continuare a migliorare le tue competenze su Docker e la containerizzazione? 

Ecco alcune risorse altamente consigliate per proseguire nel tuo percorso di apprendimento:

FAQ su Docker Create Network

A cosa serve il comando Docker network create?

Serve a definire e configurare reti Docker personalizzate, consentendo ai container di comunicare in modo sicuro ed efficiente.

Quali sono i principali tipi di driver di rete Docker?

I driver principali includono bridge, host, none, overlay, macvlan e ipvlan, ciascuno con diversi livelli di isolamento e connettività.

Quando dovrei usare una rete overlay in Docker?

Le reti overlay sono ideali per la comunicazione multi-host, soprattutto in ambienti Docker Swarm o Kubernetes.

Come posso verificare se una rete Docker è configurata correttamente?

Usa Docker network inspect, verifica le impostazioni IPAM e VXLAN e testa la connettività tra container con ping o strumenti DNS.

Quali strumenti aiutano a diagnosticare i problemi di networking in Docker?

Strumenti come nicolaka/netshoot, dig, nslookup, iperf3 e i log dei container sono utili per diagnosticare problemi comuni come errori DNS o mismatch di MTU.

Josep Ferrer

Autore

Josep Ferrer

Josep è un Data Scientist freelance specializzato in progetti europei, con competenze in archiviazione e processamento dei dati, analisi avanzate e data storytelling efficace. 

Come docente, insegna Big Data nel corso di laurea magistrale dell’Università di Navarra e condivide le sue idee tramite articoli su piattaforme come Medium, KDNuggets e DataCamp. Josep scrive anche di Data e Tech nella sua newsletter Databites (databites.tech). 

Ha conseguito una laurea in Ingegneria Fisica presso la Università Politecnica della Catalogna e un master in Intelligent Interactive Systems presso la Università Pompeu Fabra.

Argomenti

Correlato