¿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".
![](https://m.unixlinux.online/article/uploadfiles/202205/2022050913222512.png)
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.