windows - ¿Cómo obtener la dirección IP de un contenedor Docker desde el host?




los ver (25)

Primero obtenga la identificación del contenedor:

docker ps

(La primera columna es para la identificación del contenedor)

Utilice el ID del contenedor para ejecutar:

docker inspect <container ID>

En la parte inferior, debajo de "Configuración de red", puede encontrar "Dirección de IP"

O simplemente haz:

docker inspect <container id> | grep "IPAddress"

¿Hay algún comando que pueda ejecutar para obtener la dirección IP del contenedor directamente desde el host después de crear un nuevo contenedor?

Básicamente, una vez que Docker crea el contenedor, quiero rodar mis propios scripts de implementación de código y configuración de contenedor.


Escribí la siguiente secuencia de comandos Bash para obtener una tabla de direcciones IP de todos los contenedores que se ejecutan en 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 }}" "[email protected]"
}

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
}

Debe cambiar la red variable a su propio nombre de red.


Para obtener todos los nombres de contenedores y sus direcciones IP en un solo comando.

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

Si está utilizando docker-compose el comando será este:

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

La salida será:

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2

Mostrar todas las direcciones IP de los contenedores:

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

Para uso de contenedores de Windows

docker exec <container> ipconfig

donde <container> es el nombre o el id del contenedor.

Puede usar la docker ps para encontrar el id del contenedor.


Puede utilizar la docker inspect <container id>

Ejemplo:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID

Si instaló Docker usando Docker Toolbox, puede usar la aplicación Kitematic para obtener la dirección IP del contenedor:

  1. Selecciona el contenedor
  2. Haga clic en Configuración
  3. Haga clic en la pestaña Puertos.

¡¡¡NOTA!!! para Docker Componer Uso:

Dado que Docker Compose crea una red aislada para cada clúster, los métodos a continuación no funcionan con docker-compose .

La forma más elegante y fácil es definir una función de shell como la respuesta más votada en @WouterD's :

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "[email protected]"
}

Docker puede escribir identificadores de contenedor en un archivo como los programas de Linux:

Al ejecutarse con el parámetro --cidfile=filename , Docker vuelca el ID del contenedor a este archivo.

Docker ejecuta la sección equivalente PID

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

Usando archivo PID

  1. El contenedor de ejecución con el parámetro --cidfile , el contenido del archivo app.cid es como a continuación:

a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909

  1. Puede usar el contenido del archivo para inspeccionar los contenedores Docker:

    ➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`

  2. Extracción del script de Python en línea del contenedor IP:

    $ 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

Forma más amigable para los humanos

#!/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'])

http://networkstatic.net/10-examples-of-how-to-get-docker-container-ip-address/

Aquí hay 10 alternativas para obtener las direcciones IP del contenedor Docker.


Ejecutar:

docker ps -a

Esto mostrará imágenes de docker activas:

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

Utilice el valor de ID DEL CONTENEDOR:

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

"172.17.0.2"


La opción --format de inspeccionar viene al rescate.

Sintaxis del cliente Docker moderno:

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

Sintaxis del antiguo cliente Docker:

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

Que devolverá sólo la dirección IP.


Sólo para estar completo:

Realmente me gusta la opción --format , pero al principio no era consciente de esa opción, así que usé una línea de Python simple para obtener el mismo resultado:

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'

Contenedores de referencia por nombre:

docker run ... --name pg-master

Luego toma la dirección IP por nombre:

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)

Inspeccionar no funcionó para mí. Tal vez ya estaba usando -net host y algunos espacios de nombres.

De todos modos, encontré esto para trabajar muy bien:

docker exec -i -t NAME /sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

Docker se realiza internamente en Go y utiliza la sintaxis de Go para fines de consulta también.

Para inspeccionar la dirección IP de un contenedor en particular, debe ejecutar el comando (-f para la opción de formato)

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

Para la identificación o el nombre del contenedor, puede ejecutar el comando docker container ls . Se mostrará una lista de cada contenedor en ejecución.


docker inspect <container id> | grep -i ip

Por ejemplo:

docker inspect 2b0c4b617a8c | grep -i ip

Para Windows 10:

docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId

En Docker 1.3+, también puede verificarlo a través de los pasos a continuación:

Introduzca el Docker en ejecución:

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

A partir de la versión 1.10.3 de Docker, compile 20f81dd

A menos que le dijera a Docker lo contrario, Docker siempre lanza sus contenedores en la red del puente. Así que puedes probar este comando a continuación:

docker network inspect bridge

Que luego debe devolver una sección de Contenedores que mostrará la dirección IP para ese contenedor en ejecución.

[
    {
        "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"
        }
    }
]

docker inspect CONTAINER_ID | grep "IPAddress"


docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>

Lo anterior funciona si el contenedor se implementa en la red de puente predeterminada.

Sin embargo, si utilizo una red puente personalizada o una red de superposición, encontré que lo siguiente funciona mejor:

docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

Tuve que extraer la dirección IP del contenedor de la ventana acoplable por el nombre del contenedor de la ventana acoplable para su uso posterior en los scripts de implementación. Para este propósito he escrito el siguiente comando de bash:

docker inspect $(sudo docker ps | grep my_container_name | head -c 12) | grep -e \"IPAddress\"\:[[:space:]]\"[0-2] | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

Supongamos que podría ser útil colocarlo en un script de bash, que esperaría a my_container_name como un argumento ...


Para obtener la dirección IP y el puerto de host de un contenedor:

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

Salida:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",

Utilizar:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1

Para ampliar la respuesta de ko-dos, aquí hay un alias para enumerar todos los nombres de los contenedores y sus direcciones 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'

Solución para Windows 10

Docker Community Edition 17.06.0-ce-win18 2017-06-28 (estable)

Puede usar el nombre DNS del host docker.for.win.localhost para resolver la IP interna. (Advertencia algunas fuentes mencionan windows pero debería ser win )

Visión general
Necesitaba hacer algo similar, es decir, conectar desde mi contenedor Docker a mi host local, que ejecutaba el Azure Storage Emulator y el CosmosDB Emulator .

El Azure Storage Emulator escucha de forma predeterminada el 127.0.0.1 , mientras que también puede cambiar la IP de su límite, estaba buscando una solución que funcionara con la configuración predeterminada.

Esto también funciona para conectar desde mi contenedor Docker a SQL Server e IIS , ambos ejecutándose localmente en mi host con la configuración de puerto predeterminada.





docker