GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment obtenir l'adresse IP du conteneur Docker

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.


Docker
  1. Comment installer WordPress avec Docker

  2. Comment exécuter MySQL dans un conteneur Docker

  3. Comment exécuter une commande sur un conteneur Docker en cours d'exécution

  4. Comment attribuer une adresse IP statique à un conteneur Docker

  5. Comment installer Vim dans un conteneur Docker

Qu'est-ce que Docker ? Comment ça marche?

Comment obtenir l'adresse IP d'un conteneur Docker à partir de l'hôte

Comment exécuter PHPMyAdmin dans un conteneur Docker

Comment exécuter Grafana dans un conteneur Docker

Comment configurer un conteneur Apache Docker

Comment exécuter des conteneurs Docker