Como obter o endereço IP de um Contentor de Docker da máquina

Existe um comando que eu possa executar para obter o endereço IP do contentor directamente da máquina após a criação de um novo contentor?

basicamente, uma vez que o Docker cria o contentor, eu quero rolar os meus próprios programas de implementação de código e configuração do contentor.

 1582
Author: the Tin Man, 2013-06-17

30 answers

A opção --format de inspect vem em Socorro.

A sintaxe do cliente Docker moderno é:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

A sintaxe do Cliente do Docker antigo é:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

Estes comandos irão devolver o endereço IP do contentor do Docker.

Como mencionado nos comentários: se estiver no Windows, use aspas duplas " em vez de aspas simples ' em torno dos chavões encaracolados.

 2655
Author: WouterD, 2020-10-13 11:52:18

Pode usar docker inspect <container id>.

Por exemplo:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
 531
Author: creack, 2019-12-19 23:51:41

Primeiro obter o identificador do contentor:

docker ps

(A primeira coluna é para o ID do contentor)

Utilize o identificador do contentor para executar:

docker inspect <container ID>
No fundo, em "NetworkSettings", pode encontrar "IPAddress"

Ou apenas fazer:

docker inspect <container id> | grep "IPAddress"
 439
Author: Krunal, 2018-05-09 15:14:14
docker inspect CONTAINER_ID | grep "IPAddress"

Você pode adicionar -i ao grep por ignorar o caso, então mesmo o seguinte irá funcionar:

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
 232
Author: nPcomp, 2019-12-20 23:29:07
Para obter todos os nomes dos contentores e os seus endereços IP num único comando.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

Se estiver a utilizar {[3] } o comando será este:

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

A saída será:

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
 150
Author: Hemerson Varela, 2017-03-11 16:53:38

Adicione este script de consola no seu ~/.bashrc ou ficheiro relevante:

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

Então, para obter um endereço IP de um contentor, basta fazer isto:

docker-ip YOUR_CONTAINER_ID

Para a nova versão do acoplador, por favor use o seguinte:

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
 99
Author: Tuong Le, 2017-03-11 16:40:07

No Docker 1. 3+, pode também verificá - lo usando:

Indique o acoplador em execução (Linux):

docker exec [container-id or container-name] cat /etc/hosts
172.17.0.26 d8bc98fa4088
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.17 mysql

Para as janelas:

docker exec [container-id or container-name] ipconfig
 42
Author: Jake W, 2019-12-20 18:08:45

Mostra todos os endereços IP do contentor:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
 40
Author: zhouji, 2019-12-20 18:08:21

A partir da versão 1.10.3 do Docker, build 20f81dd

A menos que tenha dito ao Docker o contrário, o Docker lança sempre os seus contentores na rede de pontes. Então você pode tentar este comando abaixo:
docker network inspect bridge

Que deverá então devolver uma secção de contentores que irá mostrar o endereço IP desse contentor em execução.

[
    {
        "Name": "bridge",
        "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
                "Name": "drunk_leavitt",
                "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]
 31
Author: Athena, 2016-04-08 14:06:14

Executar:

docker ps -a

Isto irá mostrar imagens do acoplador activo:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage

Utilize o valor DO ID do contentor:

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1

"172.17.0.2"

 27
Author: gogasca, 2016-02-24 09:59:49
Com base em algumas das respostas que amei, decidi fundi-las numa função para obter todos os endereços IP e outra para um contentor específico. Estão agora no meu ficheiro.
docker-ips() {
    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}

docker-ip() {
  docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

O primeiro comando dá o endereço IP de todos os contentores e o segundo o endereço IP de um contentor específico.

docker-ips
docker-ip YOUR_CONTAINER_ID
 25
Author: silgon, 2017-03-11 17:03:23
Eis uma resposta rápida:

Obter o nome do contentor ou o ID:

docker container ls

Depois obter o IP:

docker inspect <container_ID Or container_name> |grep 'IPAddress'

Vai para o porto:

docker inspect <container_ID Or container_name> |grep 'Port'
 18
Author: Benyamin Jafari, 2019-12-20 18:13:32

Recipientes de referência pelo nome:

docker run ... --name pg-master

Depois obtém o endereço IP pelo nome:

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
 16
Author: Sameer C, 2017-03-11 16:44:24

Aqui está uma solução que eu desenvolvi hoje em Python, usando a saída JSON docker inspect container como fonte de dados.

Tenho muitos contentores e infra-estruturas que tenho de inspeccionar, e preciso de obter informações básicas da rede de qualquer Contentor, de uma forma rápida e bonita. Foi por isso que fiz este guião.

Importante: desde a versão 1.9, o Docker permite-lhe criar várias redes e anexá-las aos contentores.

#!/usr/bin/python

import json
import subprocess
import sys

try:
    CONTAINER = sys.argv[1]
except Exception as e:
    print "\n\tSpecify the container name, please."
    print "\t\tEx.:  script.py my_container\n"
    sys.exit(1)

# Inspecting container via Subprocess
proc = subprocess.Popen(["docker","inspect",CONTAINER],
                      stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT)

out = proc.stdout.read()
json_data = json.loads(out)[0]

net_dict = {}
for network in json_data["NetworkSettings"]["Networks"].keys():
    net_dict['mac_addr']  = json_data["NetworkSettings"]["Networks"][network]["MacAddress"]
    net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"]
    net_dict['ipv4_net']  = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"]
    net_dict['ipv4_gtw']  = json_data["NetworkSettings"]["Networks"][network]["Gateway"]
    net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"]
    net_dict['ipv6_net']  = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"]
    net_dict['ipv6_gtw']  = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"]
    for item in net_dict:
        if net_dict[item] == "" or net_dict[item] == 0:
            net_dict[item] = "null"
    print "\n[%s]" % network
    print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY")
    print "--------------------------------------------"
    print "IPv4 settings:{:>16}/{:<5}  {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw'])
    print "IPv6 settings:{:>16}/{:<5}  {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])

A o resultado é:

$ python docker_netinfo.py debian1

[frontend]

02:42:ac:12:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.18.0.2/16     172.18.0.1
IPv6 settings:            null/null   null

[backend]

02:42:ac:13:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.19.0.2/16     172.19.0.1
IPv6 settings:            null/null   null
 16
Author: ivanleoncz, 2019-12-20 18:15:16

Eu escrevi o seguinte script Bash para obter uma tabela de endereços IP de todos os recipientes em docker-compose.

function docker_container_names() {
    docker ps -a --format "{{.Names}}" | xargs
}

# Get the IP address of a particular container
dip() {
    local network
    network='YOUR-NETWORK-HERE'
    docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
}

dipall() {
    for container_name in $(docker_container_names);
    do
        local container_ip=$(dip $container_name)
        if [[ -n "$container_ip" ]]; then
            echo $(dip $container_name) " $container_name"
        fi
    done | sort -t . -k 3,3n -k 4,4n
}

Você deve mudar a rede variável para o seu próprio nome de rede.

 15
Author: Dunk, 2017-03-11 16:48:30

O Docker é escrito em Go e usa a sintaxe Go também para fins de consulta.

Para inspeccionar o endereço IP de um determinado contentor, terá de executar o comando (-f para "formato"):

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name

Para o ID ou nome do contentor, pode executar o comando

docker container ls

Que irá listar todos os contentores em execução.

 15
Author: Rushal Verma, 2019-12-20 18:11:56

Uso esta forma simples

docker exec -it <container id or name> hostname -i

E. g

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5
 11
Author: Lemix, 2019-09-11 09:55:42
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>

O acima funciona se o contentor for colocado na rede de pontes predefinida.

No entanto, se usar uma rede de pontes personalizada ou uma rede sobreposta, descobri que a infra funciona melhor:

docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
 9
Author: Aravind Murthy, 2016-04-18 10:12:20

Para alargar a resposta do ko-dos, Aqui está um nome alternativo para listar todos os nomes dos contentores e os seus endereços IP:

alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'
 9
Author: Marco Roy, 2017-03-11 16:42:21

nota!!! para a utilização da composição do 'Docker':

Uma vez que a composição do Estivador cria uma rede isolada para cada aglomerado, os métodos abaixo não funcionam com docker-compose.


A maneira mais elegante e fácil é definir uma função shell, actualmente a resposta Mais votada @Wouterd's:

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

O Docker pode escrever IDs de contentores num ficheiro como os programas Linux:

Correndo com --cidfile=filename, O acoplador descarrega o ID do contentor para "nome".

Ver "O acoplador executa a secção equivalente do PID " para mais informações.

--cidfile="app.cid": Write the container ID to the file

Usando um ficheiro PID:

  1. A executar um contentor com o parâmetro --cidfile, o conteúdo do ficheiro app.cid é como:

    a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
    
  2. Pode usar o conteúdo do ficheiro para inspeccionar os contentores do Docker:

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  3. Pode extrair o IP do contentor usando um programa em Python incorporado:

    $ docker inspect `cat app.cid` | python -c "import json;import sys;\
    sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])"
    172.17.0.2
    
Aqui está um amigo mais humano. formulário:
#!/usr/bin/env python
# Coding: utf-8
# Save this file like get-docker-ip.py in a folder that in $PATH
# Run it with
# $ docker inspect <CONTAINER ID> | get-docker-ip.py

import json
import sys

sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])

Ver " 10 alternativas para obter os endereços IP do contentor do Docker " para mais informações.

 9
Author: guneysus, 2019-12-20 18:28:41

Combinar as respostas anteriores com encontrar o ID do contentor com base no nome da imagem do acoplador:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
 8
Author: Gene H., 2019-12-20 18:29:48

A minha resposta:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq
) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n

Também como pseudónimo de bash:

docker-ips() {   docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n }

O resultado é ordenado pelo endereço IP e a página delimitada:

# docker-ips
172.18.0.2       memcached
172.18.0.3       nginx
172.18.0.4       fpm-backup
172.18.0.5       dns
172.18.0.6       fpm-beta
172.18.0.7       exim
172.18.0.8       fpm-delta
172.18.0.9       mariadb
172.18.0.10      fpm-alpha
172.19.0.2       nextcloud-redis
172.19.0.3       nextcloud-db
172.19.0.4       nextcloud
 8
Author: ctrlbrk, 2020-07-21 21:29:18

Se instalou o acoplador usando a caixa de ferramentas do acoplador, poderá usar a aplicação Kitemática para obter o endereço IP do contentor:

  1. Seleccione o contentor
  2. Carregue em Configuração
  3. carregue na página portas.
 7
Author: Fernando Montoya, 2017-03-11 16:53:10

Para obter o endereço IP e o porto de recepção de um contentor:

docker inspect containerId | awk '/IPAddress/ || /HostPort/'

Resultado:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",
 7
Author: Raj Asapu, 2019-04-11 19:21:55

Apenas para completar:

Eu realmente gosto da Opção --format, mas no início eu não estava ciente dela então eu usei um simples Python one-liner para obter o mesmo resultado:

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
 7
Author: sedi, 2019-12-20 18:29:27

Para o windows 10:

docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId
 6
Author: Hai Nguyen, 2017-10-08 10:46:00

Inspeccionar o uso do 'Docker' para imprimir todos os ips do contentor e os respectivos nomes

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
 6
Author: KARTHIKEYAN.A, 2019-03-14 06:09:25

Para aqueles que vieram do Google para encontrar uma solução para a execução de comandos a partir do terminal (não por um script), "jid", que é um utilitário interativo JSON drill-down com autocomplete e sugestão, permite-lhe fazer a mesma coisa com menos digitação.

docker inspect $CID | jid

Tipo Tab . Net Tab e vais ver algo como:

[Filter]> .[0].NetworkSettings
{
  "Bridge": "",
  "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
  "Gateway": "172.17.0.1",
  "GlobalIPv6Address": "",
  "GlobalIPv6PrefixLen": 0,
  "HairpinMode": false,
  "IPAddress": "172.17.0.2",
  "IPPrefixLen": 16,
  "IPv6Gateway": "",
  "LinkLocalIPv6Address": "",
  "LinkLocalIPv6PrefixLen": 0,
  "MacAddress": "02:42:ac:11:00:02",
  "Networks": {
    "bridge": {
      "Aliases": null,
      "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
      "Gateway": "172.17.0.1",
      "GlobalIPv6Address": "",

Tipo .IPA Tab e vais ver algo como:

[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
 6
Author: Joel Handwell, 2019-12-20 18:32:40

Isto irá listar todos os IPs do contentor na máquina:

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
 5
Author: rajdeepbs29, 2018-07-31 09:02:15

A resposta aceite não funciona bem com várias redes por contentor:

> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cc54d96d63ea

172.20.0.4172.18.0.5

A próxima melhor resposta é mais próxima:

> docker inspect cc54d96d63ea | grep "IPAddress"

"SecondaryIPAddresses": null,
"IPAddress": "",
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",

Gosto de usar {[4] } para analisar a rede JSON:

> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []'

{
  "proxy": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935",
    "EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b",
    "Gateway": "172.20.0.1",
    "IPAddress": "172.20.0.4",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:14:00:04",
    "DriverOpts": null
  },
  "webservers": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6",
    "EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae",
    "Gateway": "172.18.0.1",
    "IPAddress": "172.18.0.5",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:12:00:05",
    "DriverOpts": null
  }
}

Para listar os endereços IP de cada contentor torna-se então:

for s in `docker ps -q`; do
  echo `docker inspect -f "{{.Name}}" ${s}`:
  docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress";
done

/server1_web_1:
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",
/server1_php_1:
    "IPAddress": "172.20.0.3",
    "IPAddress": "172.18.0.4",
/docker-gen:
    "IPAddress": "172.18.0.3",
/nginx-proxy:
    "IPAddress": "172.20.0.2",
    "IPAddress": "172.18.0.2",
 5
Author: Drakes, 2019-02-28 10:12:07