GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo obtener la dirección IP del contenedor Docker

¿Se pregunta cuál es la dirección IP de su contenedor docker en ejecución? Puede inspeccionar el contenedor en ejecución para obtener esa información.

sudo docker container inspect container_name_or_ID
¿No sabe el nombre o la identificación del contenedor? Usa el comando sudo docker ps .

El inspect El comando le brinda muchos detalles sobre el contenedor que está inspeccionando. Ve hacia el final y busca en las Networks para obtener la dirección IP del contenedor.

También puede usar el comando grep para obtener solo las líneas que coincidan con la cadena "IPAddress".

No se alarme si su contenedor tiene más de una dirección IP. Eso no es inusual. Para comprender eso, debe comprender cómo se comunican los contenedores entre sí.

Te lo explicaré en la siguiente sección, seguido de algunos otros métodos para obtener la dirección IP de un contenedor docker en ejecución.

¿Cómo se comunican los contenedores docker?

Docker es una herramienta para empaquetar y entregar software a las masas utilizando tecnología de contenedorización. El software puede tener una multitud de propósitos, desde posiblemente un simple procesamiento de texto hasta un servidor web completo, que aloja sus archivos privados. Cada uno de estos softwares se divide en microservicios y luego se empaqueta como contenedores. Según el propósito del software, es posible que un servicio deba comunicarse con otro.

Por ejemplo, considere WordPress. Hay dos servicios, uno es el servidor web que da servicio al frontend, y otro es el backend, la base de datos. La interfaz tiene que comunicarse con la base de datos, de lo contrario, simplemente no funcionará.

Esta comunicación se logra teniendo al menos dos interfaces de red asociadas a cada uno de estos dos contenedores, estando ambas interfaces conectadas a la misma red. Esta red se denomina "red docker".

Red de Docker

Piense en la red docker como un grupo de direcciones IP disponibles. Si dos contenedores toman direcciones IP del mismo grupo, podrán comunicarse entre sí.

Existen principalmente dos tipos de redes, las redes predeterminadas o predefinidas y las redes definidas por el usuario.

Puede obtener la lista de redes usando el siguiente comando

docker network ls

Considere mi lista a continuación:

❯ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
272ff2e44dc2   bridge    bridge    local
5e4a3f5e99dd   host      host      local
cdaef1e49ddc   none      null      local

Ignore los dos últimos y concéntrese en la primera red. El bridge network es la red predeterminada a la que se conectará cada contenedor si no se especifica ninguno explícitamente. Puede obtener más detalles sobre esta red ejecutando docker network inspect bridge dominio.

Voy a filtrar la salida ya que para esta demostración no necesito todos los datos que inspect va a explotar.

❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Si no tiene jq instalado, instálelo usando el administrador de paquetes de su distribución.

Cada una de estas redes docker tiene una subred, en el caso del bridge red, esta subred es 172.17.0.0/16. Esto significa que hay un total de 65 534 - 1 =65 533 hosts o direcciones IP utilizables. Deduje uno ya que 172.17.0.1 está asignado para la puerta de enlace. También puede ver eso usando el siguiente comando

docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway

Comprobando la dirección IP de su contenedor docker

Hay un par de formas en las que puede verificar las direcciones IP asociadas con su contenedor, aquí hay una lista de todas ellas, incluidos ejemplos de comandos.

Método 1:inspeccionando el contenedor

El inspect Los subcomandos de Docker son extremadamente útiles. Un contenedor se puede inspeccionar usando el docker container inspect [CONTAINER ID]|[CONTAINER NAME] dominio.

Inspeccionar un contenedor significa obtener la mayor cantidad de información posible sobre el contenedor, desde puertos, variables de entorno hasta puntos de montaje, datos de cgroup, etc. La dirección IP se puede extraer de él.

Si ejecuta el inspect comando en un contenedor, obtendrá un montón de información, en formato JSON. Desplácese hacia abajo hasta encontrar la clave NetworkSettings , allí busca la subclave IPAddress . Esa es la dirección IP de su contenedor.

El comando a ejecutar se parece al siguiente

docker container inspect [CONTAINER ID]|[CONTAINER NAME]

Aquí está mi salida (truncada)

> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
            "IPAddress": "172.17.0.2",
.
.
.

En lugar de desplazarse por todo eso, puede filtrar la salida de esta manera:

docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME

Aquí hay una salida filtrada:

❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip 
172.17.0.2

Si desea obtener una dirección IP asociada con una red específica, use un comando como el siguiente

docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME

Un resultado de muestra:

❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip 
172.17.0.2

método 2:usar el caparazón del contenedor

Este es el método más sencillo, pero también algo que no recomiendo .

En este método, adjunta su stdin|stdout con el contenedor y ejecuta el ip comando (o algún otro comando que muestre las direcciones IP asociadas con las NIC).

La razón por la que no recomiendo esto es que muchas imágenes son bastante livianas y no contienen la ip comando (o algo similar).

Toma el ubuntu:20.04 imagen como ejemplo, inicie un contenedor como el siguiente

docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d

Para mantener el contenedor en funcionamiento, utilicé sleep 1d comando.

Ahora inicie un proceso de shell dentro del contenedor y adjunte su stdin|stdout así

docker exec -ti ubuntu-ip sh

Una vez que esté en este contenedor, intente ejecutar ip o ifconfig . Verás algo como lo siguiente:

❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found

Para que esos comandos funcionen, debe instalar los paquetes correspondientes. Para obtener ip comando, instale el iproute2 paquete y vuelva a ejecutar el comando como 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

Ahora puede ver la dirección IP asociada con la tarjeta [email protected] siendo 172.17.0.2.

Observe la red de la que forma parte este contenedor. Dado que no creé ni conecté una red definida por el usuario a este contenedor, se conectó a la red puente, por lo que la red de esta IP es 172.17.0.0

Este método seguro que funciona, aunque es más laborioso y poco reproducible, es intuitivo. Los siguientes métodos deberían ser mucho mejores en comparación con este.

Método 3:inspeccionando la propia red

Cada vez que un contenedor se conecta a una red, ese contenedor conectado también es visible desde la red, junto con la dirección IP asignada a esos contenedores.

Dado que mi contenedor está conectado a la red del puente, puedo inspeccionar la red con el siguiente comando

docker network inspect [NETWORK NAME][NETWORK ID]

Aquí, en lugar de una identificación, usaré el nombre, bridge

docker network inspect bridge

En lugar de desplazarse hacia abajo hasta los Containers sección, usaré jq para filtrar la salida esta vez.

❯ 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": ""
  }
}

Para demostrar esto, implementé otro contenedor con el nombre ip . Puede ver los contenedores y las direcciones IP en el objeto JSON anterior. Ahora extraer la IP de un contenedor específico es un poco más difícil aquí.

Si conoce la identificación del contenedor, puede usar jq así

docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'

Aquí hay un ejemplo

❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16

La mayoría de las veces no puede recordar la identificación del contenedor, por lo que si desea obtener la IP solo del nombre del contenedor, necesita algunos conocimientos de jq (o simplemente reutilice el siguiente 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

Coloque el nombre del contenedor en select funcionar y ver cómo sucede la magia.

❯ 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

¿Qué método prefieres? Método 1 probablemente

Esos fueron todos los métodos a través de los cuales puede obtener la(s) dirección(es) IP de los contenedores docker. El segundo método, aunque intuitivo, no es reproducible. La mayoría de las veces es el primer método que se usa, ya que es el más fácil y hace el trabajo.

Pero puede llegar un momento en el que desee verificar qué contenedores están conectados a una determinada red y obtener las direcciones IP en esa red. En ese caso, inspeccionar la red y obtener las IP tiene sentido. Puede obtener todos los nombres de contenedores y las direcciones IP asignadas a ellos desde una red como esta

❯ 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"
}

Cambiar bridge a alguna otra red, y obtendrá todos los contenedores y sus direcciones IP de esta manera.

Es todo por hoy. Espero que este artículo te haya sido útil. Si tiene alguna pregunta, hágamelo saber en los comentarios a continuación.


Docker
  1. Cómo instalar WordPress usando Docker

  2. ¿Cómo ejecutar un programa dentro de un contenedor Docker?

  3. Cómo ejecutar MySQL en un contenedor Docker

  4. Cómo salir de un contenedor Docker

  5. Cómo obtener información sobre un contenedor en Docker

¿Qué es Docker? ¿Como funciona?

Cómo obtener la dirección IP de un contenedor Docker desde el host

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo configurar un contenedor Apache Docker

Cómo ejecutar contenedores Docker