8.1 Passaggi principali per diagnosticare i problemi di rete
I problemi di rete in Docker possono verificarsi per diverse ragioni, inclusa una configurazione errata delle reti, problemi con il DNS, conflitti di indirizzi IP e altro ancora. In questa lezione esamineremo i metodi principali per diagnosticare e risolvere i problemi di rete in Docker.
Se ci sono problemi di rete, bisogna seguire questi passaggi:
- Verifica dello stato dei container e delle reti
- Utilizzo degli strumenti di rete all'interno dei container
- Controllo della configurazione di Docker e dei file di rete
- Verifica dei log di sistema di Docker
- Uso dei comandi di rete di Docker
8.2 Verifica dello stato dei container e delle reti
Il primo passo nella diagnosi dei problemi di rete è verificare lo stato dei container e delle reti.
Verifica dello stato dei container
Per prima cosa, visualizziamo tutti i container in esecuzione. Per questo utilizziamo il comando docker ps:
docker ps
Se i container non sono in esecuzione, potrebbe indicare problemi con Docker stesso o con la configurazione dei container.
Verifica delle reti
Il comando docker network ls mostra tutte le reti create in Docker:
docker network ls
Assicurati che la rete necessaria esista e che i container siano connessi ad essa.
8.3 Utilizzo degli strumenti di rete all'interno dei container
Gli strumenti di rete, come ping, curl, netcat (o nc), e nslookup, possono essere utili per diagnosticare problemi all'interno dei container. Ognuno di questi strumenti svolge un compito specifico:
ping— uno strumento per controllare la disponibilità degli host remoti nella rete, inviando richieste ICMP.curl— uno strumento per il trasferimento dei dati utilizzando vari protocolli, spesso utilizzato per verificare la disponibilità dei servizi web.netcat (nc)— uno strumento universale per lavorare con le connessioni di rete, permette di creare connessioni TCP/UDP e diagnosticare la disponibilità delle porte.nslookup— uno strumento per cercare informazioni sui record DNS, ad esempio per verificare la risoluzione dei nomi dei container.
Esempio di utilizzo di ping
Connettiti al container e controlla la connessione con un altro container o servizio, utilizzando lo strumento ping per inviare richieste ICMP:
docker exec -it <container_name> ping <target_container_name_or_ip>
Esempio di utilizzo di curl
Verifica la disponibilità di un servizio web all'interno del container utilizzando lo strumento curl:
docker exec -it <container_name> curl http://<target_service>
Esempio di utilizzo di nslookup
Utilizza nslookup per controllare la risoluzione dei nomi DNS dei container, utile per diagnosticare problemi con i servizi di rete:
docker exec -it <container_name> nslookup <target_container_name>
Esempio di utilizzo di nc host port
Lo strumento nc è utilizzato per il debugging e la diagnostica delle connessioni di rete. Con il comando nc host port puoi stabilire una connessione con un determinato host e porta, controllando la disponibilità della porta sull'host di destinazione:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Verifica della configurazione di Docker e dei file di rete
Configurazioni errate di Docker e dei file di rete possono causare problemi di rete.
Verifica del file docker-compose.yml
Assicurati che il file docker-compose.yml sia configurato correttamente e che tutte le reti, i servizi e le porte siano specificati correttamente.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- webnet
db:
image: postgres:latest
ports:
- "5432:5432"
networks:
- webnet
networks:
webnet:
driver: bridge
Verifica del file /etc/docker/daemon.json
Controlla la configurazione di Docker Daemon se è stata modificata:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Controllo dei log di sistema di Docker
I log di sistema di Docker possono contenere informazioni utili sugli errori di rete e i problemi.
Visualizzazione dei log di Docker
Usa il comando journalctl per vedere i log di Docker sui sistemi con systemd:
journalctl -u docker.service
Visualizzazione dei log dei container
I log dei container possono anche aiutare nella diagnosi dei problemi di rete:
docker logs <container_name>
8.6: Uso dei comandi di rete di Docker
Docker offre comandi per diagnosticare e gestire le reti, come docker network inspect e docker network connect.
Comando docker network inspect
Questo comando permette di ottenere informazioni dettagliate sulla rete, inclusi i container collegati e le configurazioni IPAM.
docker network inspect <network_name>
Esempio di output del comando docker network inspect
[
{
"Name": "webnet",
"Id": "e5e5e1b1a3e5",
"Created": "2021-01-01T00:00:00.000000000Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"container_id": {
"Name": "web",
"EndpointID": "6c52f8c75c1e",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Comando docker network connect
Se il container è stato collegato male alla rete, puoi collegarlo manualmente:
docker network connect <network_name> <container_name>
8.7 Esempi di diagnostica e risoluzione dei problemi
Esempio 1: Problemi con la conversione del nome di dominio in IP tramite DNS
Se i container non riescono a convertire i nomi degli host di altri container, controlla le impostazioni DNS:
Controllo delle impostazioni DNS in docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
Controllo del DNS all'interno del container:
docker exec -it <container_name> cat /etc/resolv.conf
Esempio 2: Problemi con l'accesso ai servizi
Se i container non riescono ad accedere ai servizi su altri host:
Controllo delle porte pubblicate:
docker ps
Controllo delle regole del firewall:
Assicurati che le regole del firewall non blocchino le porte necessarie.
Esempio 3: Conflitto di indirizzi IP
Se hai un conflitto di indirizzi IP tra i container o con l'host:
Controllo della subnet della rete:
docker network inspect <network_name>
Cambio della subnet:
docker network create --subnet=192.168.2.0/24 my_network
GO TO FULL VERSION