Vous vous demandez quelle est l'adresse IP de votre conteneur Docker en cours d'exécution ? Vous pouvez inspecter le conteneur en cours d'exécution pour obtenir ces informations.
sudo docker container inspect container_name_or_ID
Vous ne connaissez pas le nom ou l'ID du conteneur ? Utilisez la commande sudo docker ps
.
Le inspect
La commande vous donne de nombreux détails sur le conteneur que vous inspectez. Allez vers la fin et regardez dans les Networks
section pour obtenir l'adresse IP du conteneur.
Vous pouvez également utiliser la commande grep pour obtenir uniquement les lignes correspondant à la chaîne "IPAddress".
Ne vous inquiétez pas si votre conteneur a plus d'une adresse IP. Ce n'est pas inhabituel. Pour comprendre cela, vous devez comprendre comment les conteneurs communiquent entre eux.
Je vais vous expliquer cela dans la section suivante, suivie d'autres méthodes pour obtenir l'adresse IP d'un conteneur Docker en cours d'exécution.
Comment les conteneurs Docker communiquent ?
Docker est un outil de conditionnement et de livraison de logiciels aux masses à l'aide de la technologie de conteneurisation. Les logiciels peuvent avoir une multitude d'objectifs, allant du simple traitement de texte à un serveur Web complet, hébergeant vos fichiers privés. Chacun de ces logiciels est décomposé en microservices puis conditionné sous forme de conteneurs. Selon l'objectif du logiciel, un service peut avoir besoin de communiquer avec un autre.
Par exemple, considérez WordPress. Il existe deux services, l'un est le serveur Web qui sert le frontend, et l'autre est le backend, la base de données. L'interface doit communiquer avec la base de données, sinon cela ne fonctionnera tout simplement pas.
Cette communication est réalisée en ayant au moins deux interfaces réseau associées à chacun de ces deux conteneurs, les deux interfaces étant connectées au même réseau. Ce réseau est appelé "réseau docker".
Réseau Docker
Considérez le réseau docker comme un pool d'adresses IP disponibles. Si deux conteneurs prennent des adresses IP du même pool, ils pourront communiquer entre eux.
Il existe principalement deux types de réseaux, les réseaux par défaut ou prédéfinis et les réseaux définis par l'utilisateur.
Vous pouvez obtenir la liste des réseaux en utilisant la commande suivante
docker network ls
Considérez ma liste ci-dessous :
❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
272ff2e44dc2 bridge bridge local
5e4a3f5e99dd host host local
cdaef1e49ddc none null local
Ignorez les deux derniers et concentrez-vous sur le premier réseau. Le bridge
network est le réseau par défaut auquel chaque conteneur va être connecté si aucun n'est spécifié explicitement. Vous pouvez obtenir plus de détails sur ce réseau en exécutant le docker network inspect bridge
commande.
Je vais filtrer la sortie car pour cette démonstration je n'ai pas besoin de toutes les données que inspect
va exploser.
❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Si vous n'avez pas installé jq, veuillez l'installer à l'aide du gestionnaire de paquets de votre distribution.
Chacun de ces réseaux docker a un sous-réseau, dans le cas du bridge
réseau, ce sous-réseau est 172.17.0.0/16. Cela signifie qu'il y a un total de 65 534 - 1 =65 533 hôtes ou adresses IP utilisables. J'en ai déduit un puisque 172.17.0.1 est alloué pour la passerelle. Vous pouvez également le voir en utilisant la commande suivante
docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway
Vérification de l'adresse IP de votre conteneur Docker
Il existe plusieurs façons de vérifier les adresses IP associées à votre conteneur, voici une liste de toutes, y compris des exemples de commandes.
Méthode 1 :En inspectant le conteneur
Le inspect
les sous-commandes de docker sont extrêmement utiles. Un conteneur peut être inspecté à l'aide du docker container inspect [CONTAINER ID]|[CONTAINER NAME]
commande.
Inspecter un conteneur signifie obtenir autant d'informations que possible sur le conteneur, depuis les ports, les variables d'environnement jusqu'aux points de montage, les données de groupe de contrôle, etc. L'adresse IP peut en être extraite.
Si vous exécutez la commande inspect
commande sur un conteneur, vous obtiendrez un tas d'informations, au format JSON. Faites défiler vers le bas jusqu'à ce que vous trouviez la clé NetworkSettings
, recherchez la sous-clé IPAddress
. C'est l'adresse IP de votre conteneur.
La commande à exécuter ressemble à ceci
docker container inspect [CONTAINER ID]|[CONTAINER NAME]
Voici ma sortie (tronquée)
> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
"IPAddress": "172.17.0.2",
.
.
.
Au lieu de faire défiler tout cela, vous pouvez filtrer la sortie comme ceci :
docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME
Voici une sortie filtrée :
❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip
172.17.0.2
Si vous souhaitez obtenir une adresse IP associée à un réseau spécifique, utilisez une commande comme celle-ci
docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME
Exemple de sortie :
❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip
172.17.0.2
méthode 2 :Utiliser le shell du conteneur
C'est la méthode la plus simple, mais aussi quelque chose que je ne recommande pas .
Dans cette méthode, vous attachez votre stdin|stdout avec le conteneur et exécutez le ip
commande (ou une autre commande qui affiche les adresses IP associées aux cartes réseau).
La raison pour laquelle je ne le recommande pas est que de nombreuses images sont assez légères et ne contiennent pas l'ip
commande (ou quelque chose de similaire).
Prenez le ubuntu:20.04
image à titre d'exemple, démarrez un conteneur comme celui-ci
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d
Pour que le conteneur continue de fonctionner, j'ai utilisé le sleep 1d
commande.
Maintenant, démarrez un processus shell à l'intérieur du conteneur et attachez votre stdin|stdout comme ceci
docker exec -ti ubuntu-ip sh
Une fois dans ce conteneur, essayez d'exécuter ip
ou ifconfig
. Vous verrez quelque chose comme ce qui suit :
❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found
Pour que ces commandes fonctionnent, vous devez installer les packages appropriés. Pour obtenir ip
commande, installez le iproute2
package et réexécutez la commande en tant que 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
Vous pouvez maintenant voir l'adresse IP associée à la carte [email protected]
étant 172.17.0.2.
Remarquez le réseau dont ce conteneur fait partie. Comme je n'ai pas créé et connecté de réseau défini par l'utilisateur à ce conteneur, il était connecté au réseau de pont, c'est pourquoi le réseau de cette IP est 172.17.0.0
Cette méthode fonctionne sûrement, bien que ce soit plus de travail et peu reproductible, c'est intuitif. Les prochaines méthodes devraient être bien meilleures par rapport à celle-ci.
Méthode 3 :en inspectant le réseau lui-même
Chaque fois qu'un conteneur est connecté à un réseau, ce conteneur connecté est également visible depuis le réseau, ainsi que l'adresse IP attribuée à ces conteneurs.
Étant donné que mon conteneur est connecté au réseau de pont, je peux inspecter le réseau avec la commande suivante
docker network inspect [NETWORK NAME][NETWORK ID]
Ici, au lieu d'un identifiant, j'utiliserai le nom, bridge
docker network inspect bridge
Au lieu de faire défiler jusqu'aux Containers
section, j'utiliserai jq
pour filtrer la sortie cette fois.
❯ 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": ""
}
}
Pour le démontrer, j'ai déployé un autre conteneur avec le nom ip
. Vous pouvez voir les conteneurs et les adresses IP dans l'objet JSON ci-dessus. Maintenant, extraire l'adresse IP d'un conteneur spécifique est un peu plus difficile ici.
Si vous connaissez l'identifiant du conteneur, vous pouvez utiliser jq
comme ça
docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'
Voici un exemple
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
La plupart du temps, vous ne vous souvenez pas de l'identifiant du conteneur, donc si vous souhaitez obtenir l'adresse IP uniquement à partir du nom du conteneur, vous avez besoin de connaissances sur jq
(ou réutilisez simplement la commande suivante).
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
Placez le nom du conteneur dans le select
fonction et voyez la magie opérer.
❯ 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
Quelle méthode préférez-vous ? Méthode 1 probablement
Ce sont toutes les méthodes par lesquelles vous pouvez obtenir l'adresse IP des conteneurs Docker. La deuxième méthode bien qu'intuitive n'est pas reproductible. La plupart du temps, c'est la première méthode qui est utilisée car c'est la plus simple et elle fait le travail.
Mais il peut arriver un moment où vous voudriez vérifier quels conteneurs sont connectés à un certain réseau et obtenir les adresses IP sur ce réseau. Dans ce cas, inspecter le réseau et obtenir les adresses IP est logique. Vous pouvez obtenir tous les noms de conteneurs et les IP qui leur sont alloués à partir d'un réseau comme celui-ci
❯ 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"
}
Changer bridge
à un autre réseau, et vous obtiendrez tous les conteneurs et leurs adresses IP comme ceci.
C'est tout pour aujourd'hui. J'espère que cet article vous a été utile. Si vous avez des questions, faites-le moi savoir dans les commentaires ci-dessous.