Comment obtenir l’adresse IP d’un conteneur Docker à partir de l’hôte
Les conteneurs Docker ne se limitent pas à l’isolement : ils sont souvent utilisés pour gérer des processus qui doivent encore communiquer directement entre eux. Mais, pour communiquer, vous aurez souvent besoin de connaître l’adresse IP de chaque conteneur, que vous pouvez trouver avec quelques commandes.
Sommaire
Envisagez d’utiliser un pont défini par l’utilisateur
La mise en réseau Docker est un peu compliquée. Les conteneurs lancés par défaut seront placés dans le « réseau de pont » par défaut et sont autorisés à communiquer directement avec d’autres conteneurs, à condition que vous disposiez de leur adresse IP privée. Cela peut être désactivé pour une véritable isolation, mais ce n’est pas le cas par défaut.
Vous pouvez également utiliser cette adresse pour communiquer depuis le système d’exploitation hôte si vous ne souhaitez pas lier un port. Il s’agit du cas d’utilisation principal pour accéder à un conteneur directement via son adresse IP, mais vous devriez probablement toujours simplement lier un port (vous pouvez le garder fermé d’Internet dans votre pare-feu).
Cependant, les adresses IP sont éphémères et peuvent se casser facilement lorsque les conteneurs sont arrêtés et démarrés. Pour la communication entre les conteneurs, Docker fournit une solution via des réseaux de ponts définis par l’utilisateur, que vous devriez probablement utiliser si plusieurs conteneurs communiquent entre eux.
Les conteneurs ajoutés à des réseaux autres que ceux par défaut pourront se connecter via leur alias, qui se résoudra automatiquement à l’adresse IP privée. Vous pouvez créer de nouveaux réseaux, exécuter des conteneurs dans ces réseaux et connecter des conteneurs existants au réseau. Vous pouvez ensuite accéder aux autres conteneurs en utilisant l’alias comme nom d’hôte ; par exemple, le conteneur NGINX ici peut accéder à l’instance MongoDB avec la chaîne de connexion mongodb://mongohost:27017
.
docker network create example docker run --net example --name nginx -d nginx docker network connect example --alias mongohost mongodb
Il y a beaucoup d’avantages à utiliser des ponts, et c’est recommandé par rapport à l’héritage --link
option, qui fonctionne sur le réseau par défaut. Le principal problème est que les conteneurs des réseaux définis par l’utilisateur seront exposés aux ports des autres, qu’ils soient publiés ou non, mais vous pouvez configurer plusieurs réseaux, ce n’est donc généralement pas un problème.
L’autre inconvénient est que, parce que les réseaux définis par l’utilisateur offrent une meilleure isolation, ils vous interdisent également d’accéder aux conteneurs sur les réseaux avec leur adresse IP privée. Tous les conteneurs du réseau par défaut peuvent communiquer entre eux, mais une fois supprimés et placés dans un réseau défini par l’utilisateur, cette capacité est désactivée. Cependant, vous pouvez également simplement lancer le conteneur dans les réseaux par défaut et définis par l’utilisateur, ce n’est donc pas un problème si vous choisissez de rendre le conteneur visible pour les autres.
Obtenir l’adresse IP de Docker
Si vous voulez juste l’adresse IP, c’est assez simple à obtenir à partir du système d’exploitation hôte. Tout d’abord, vous devrez trouver l’ID ou le nom du conteneur pour lequel vous souhaitez obtenir les informations, ce que vous pouvez faire avec :
docker ps
Ensuite, exécutez docker inspect
, qui renvoie un énorme fichier JSON avec toutes les informations sur le conteneur. Cependant, nous ne sommes intéressés que par l’adresse IP, vous pouvez donc lui transmettre une option de formatage avec -f
pour le réduire à l’adresse.
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' name_or_id
Cette commande fonctionne bien, mais elle ne renvoie également que des informations pour un conteneur dont vous aurez besoin de l’ID. Si vous voulez une solution plus concrète, vous pouvez utiliser docker network inspect
qui imprime des informations sur tous les conteneurs du réseau donné, en formatant éventuellement en tant que table de recherche JSON :
docker network inspect bridge -f '{{json .Containers}}'
Obtenir la configuration réseau à partir du conteneur
Les conteneurs Docker ne sont en réalité qu’un mécanisme d’isolement, et rien ne vous empêche d’entrer simplement dans le conteneur et d’exécuter des commandes Linux régulières telles que ifconfig
et obtenir l’adresse IP de cette façon.
Pour ce faire, vous devrez saisir le nom ou l’ID du conteneur avec docker ps
, puis exécutez exec -it
, dans ce cas, imprimer toutes les informations IP :
docker exec -it b94ef3169cd4 ip a