Ti chiedi qual è l'indirizzo IP del tuo contenitore docker in esecuzione? Puoi ispezionare il contenitore in esecuzione per ottenere tali informazioni.
sudo docker container inspect container_name_or_ID
Non conosci il nome o l'ID del contenitore? Usa il comando sudo docker ps
.
Il inspect
comando fornisce molti dettagli sul contenitore che stai ispezionando. Vai verso la fine e guarda nelle Networks
sezione per ottenere l'indirizzo IP del contenitore.
Puoi anche usare il comando grep per ottenere solo le righe che corrispondono alla stringa "IPAddress".
Non allarmarti se il tuo container ha più di un indirizzo IP. Non è insolito. Per capirlo, devi capire come i container comunicano tra loro.
Te lo spiegherò nella prossima sezione, seguita da altri metodi per ottenere l'indirizzo IP di un contenitore docker in esecuzione.
Come comunicano i container docker?
Docker è uno strumento per il confezionamento e la distribuzione di software alle masse utilizzando la tecnologia di containerizzazione. Il software può avere una moltitudine di scopi, dall'eventuale semplice elaborazione del testo a un server Web completo, che ospita i tuoi file privati. Ciascuno di questi software è suddiviso in microservizi e quindi impacchettato come contenitori. A seconda dello scopo del software, un servizio potrebbe dover comunicare con un altro.
Ad esempio, considera WordPress. Ci sono due servizi, uno è il server web che serve il frontend e un altro è il backend, il database. Il frontend deve comunicare con il database, altrimenti non funzionerà.
Questa comunicazione si ottiene avendo almeno due interfacce di rete associate a ciascuno di questi due container, essendo entrambe le interfacce collegate alla stessa rete. Questa rete è chiamata "rete mobile".
Rete Docker
Pensa alla rete Docker come a un pool di indirizzi IP disponibili. Se due container accettano indirizzi IP dallo stesso pool, saranno in grado di comunicare tra loro.
Esistono principalmente due tipi di reti, le reti predefinite o predefinite e le reti definite dall'utente.
Puoi ottenere l'elenco delle reti usando il seguente comando
docker network ls
Considera la mia lista qui sotto:
❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
272ff2e44dc2 bridge bridge local
5e4a3f5e99dd host host local
cdaef1e49ddc none null local
Ignora gli ultimi due e concentrati sulla prima rete. Il bridge
network è la rete predefinita a cui verrà connesso ogni container se nessuna è specificata in modo esplicito. Puoi ottenere maggiori dettagli su questa rete eseguendo il docker network inspect bridge
comando.
Filtrerò l'output poiché per questa dimostrazione non ho bisogno di tutti i dati che inspect
sta per esplodere.
❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Se non hai installato jq, installalo usando il gestore di pacchetti della tua distribuzione.
Ciascuna di queste reti docker ha una sottorete, nel caso del bridge
rete, questa sottorete è 172.17.0.0/16. Ciò significa che ci sono un totale di 65.534 - 1 =65.533 host o indirizzi IP utilizzabili. Ne ho dedotto uno poiché 172.17.0.1 è allocato per il gateway. Puoi vederlo anche usando il seguente comando
docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway
Controllo dell'indirizzo IP del tuo container docker
Ci sono un paio di modi in cui puoi controllare gli indirizzi IP associati al tuo container, ecco un elenco di tutti loro inclusi esempi di comandi.
Metodo 1:ispezionando il contenitore
Il inspect
i sottocomandi di Docker sono estremamente utili. Un container può essere ispezionato utilizzando il docker container inspect [CONTAINER ID]|[CONTAINER NAME]
comando.
Ispezionare un container significa ottenere quante più informazioni possibili sul container, da porte, variabili di ambiente a punti di montaggio, dati cgroup, ecc. Da esso è possibile estrarre l'indirizzo IP.
Se esegui inspect
comando su un contenitore, otterrai un sacco di informazioni, in formato JSON. Scorri verso il basso fino a trovare il tasto NetworkSettings
, cerca la sottochiave IPAddress
. Questo è l'indirizzo IP del tuo container.
Il comando da eseguire è simile al seguente
docker container inspect [CONTAINER ID]|[CONTAINER NAME]
Ecco il mio output (troncato)
> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
"IPAddress": "172.17.0.2",
.
.
.
Invece di scorrere tutto ciò, puoi filtrare l'output in questo modo:
docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME
Ecco un output filtrato:
❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip
172.17.0.2
Se vuoi ottenere un indirizzo IP associato a una rete specifica, usa un comando come il seguente
docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME
Un esempio di output:
❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip
172.17.0.2
metodo 2:utilizzo del guscio del contenitore
Questo è il metodo più semplice, ma anche qualcosa che non consiglio .
In questo metodo, alleghi il tuo stdin|stdout con il contenitore ed esegui ip
comando (o qualche altro comando che mostra gli indirizzi IP associati alle schede di rete).
Il motivo per cui non lo consiglio è che molte immagini sono piuttosto leggere e non contengono l'ip
comando (o qualcosa di simile).
Prendi ubuntu:20.04
image come esempio, avvia un contenitore come il seguente
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d
Per mantenere in funzione il container ho usato sleep 1d
comando.
Ora avvia un processo di shell all'interno del contenitore e allega il tuo stdin|stdout in questo modo
docker exec -ti ubuntu-ip sh
Una volta che sei in questo contenitore, prova a eseguire ip
o ifconfig
. Vedrai qualcosa di simile al seguente:
❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found
Per far funzionare questi comandi, è necessario installare i pacchetti pertinenti. Per ottenere ip
comando, installa iproute2
pacchetto ed eseguire nuovamente il comando come ip a
# apt update -qq
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
Ora puoi vedere l'indirizzo IP associato alla carta [email protected]
essendo 172.17.0.2.
Nota la rete di cui fa parte questo container. Poiché non ho creato e collegato una rete definita dall'utente a questo contenitore, è stato connesso alla rete bridge, motivo per cui la rete di questo IP è 172.17.0.0
Questo metodo funziona sicuramente, anche se è più laborioso e poco riproducibile, è intuitivo. I prossimi metodi dovrebbero essere molto migliori rispetto a questo.
Metodo 3:ispezionando la rete stessa
Ogni volta che un container viene connesso a una rete, quel container connesso è visibile anche dalla rete, insieme all'indirizzo IP assegnato a quei container.
Poiché il mio container è connesso alla rete bridge, posso ispezionare la rete con il seguente comando
docker network inspect [NETWORK NAME][NETWORK ID]
Qui invece di un ID, userò il nome, bridge
docker network inspect bridge
Invece di scorrere fino a Containers
sezione, userò jq
per filtrare l'output questa volta.
❯ docker network inspect bridge | jq .[].Containers
{
"1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba": {
"Name": "ubuntu-ip",
"EndpointID": "44d6b85348d6274b4ee779f9d3617d184ccfd3bad228ee652141d9b4157c50ae",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"50a4f195d8eae6b6b714e8aa058c6058dbe91d0a272c8ca826d4442df1c63885": {
"Name": "ip",
"EndpointID": "d4e72a4df81ee7023386df9d96676d9c291e2902349eb453338b8e0145a610fd",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
Per dimostrarlo, ho distribuito un altro container con il nome ip
. Puoi vedere i contenitori e gli indirizzi IP nell'oggetto JSON sopra. Ora estrarre l'IP di un contenitore specifico è leggermente più difficile qui.
Se conosci l'ID del contenitore, puoi utilizzare jq
così
docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'
Ecco un esempio
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
La maggior parte delle volte non riesci a ricordare l'id del contenitore, quindi se vuoi ottenere l'IP solo dal nome del contenitore, hai bisogno di una certa conoscenza di jq
(o semplicemente riutilizza il seguente comando).
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
Inserisci il nome del contenitore in select
funzionare e vedere la magia accadere.
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r
172.17.0.2/16
Quale metodo preferisci? Metodo 1 probabilmente
Questi erano tutti i metodi attraverso i quali è possibile ottenere gli indirizzi IP dei contenitori docker. Il secondo metodo, sebbene intuitivo, non è riproducibile. Il più delle volte è il primo metodo che viene utilizzato poiché è il più semplice e porta a termine il lavoro.
Ma potrebbe arrivare un momento in cui vorresti controllare quali contenitori sono collegati a una determinata rete e ottenere gli indirizzi IP su quella rete. In tal caso, ha senso ispezionare la rete e ottenere gli IP. Puoi ottenere tutti i nomi dei container e gli IP assegnati loro da una rete come questa
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'
{
"ubuntu-ip": "172.17.0.2/16"
}
{
"ip": "172.17.0.3/16"
}
Cambia bridge
a un'altra rete e otterrai tutti i contenitori e i loro indirizzi IP in questo modo.
Questo è tutto per oggi. Spero che questo articolo ti sia stato utile. Se avete domande, fatemelo sapere nei commenti in basso.