GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come ottenere l'indirizzo IP del contenitore Docker

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.


Docker
  1. Come installare WordPress utilizzando Docker

  2. Come eseguire MySQL in un contenitore Docker

  3. Come installare Vim in un contenitore Docker

  4. Come ottenere informazioni su un contenitore in Docker

  5. Come accedere allo spazio dei nomi di rete di Docker Container dall'host

Cos'è Docker? Come funziona?

Come ottenere l'indirizzo IP di un contenitore Docker dall'host

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come configurare un container Docker Apache

Come eseguire i contenitori Docker