Comment obtenir une adresse IP de conteneur Docker - expliqué avec des exemples

Docker offre la possibilité de conditionner et d'exécuter une application dans un environnement vaguement isolé appelé conteneur.

Je sais à quoi vous pensez - allez, pas un autre article expliquant ce qu'est Docker, il est partout ces jours-ci!

Mais ne vous inquiétez pas, nous sautons cette introduction de base. Le public cible de cet article doit déjà avoir une compréhension de base de ce que sont Docker et Containers.

Mais vous êtes-vous déjà demandé comment obtenir une adresse IP de conteneur Docker?

Explication du réseau Docker

Tout d'abord, comprenons comment fonctionne le réseau Docker. Pour cela, nous allons nous concentrer sur le bridgeréseau par défaut . Lorsque vous utilisez Docker, si vous ne spécifiez pas de pilote, c'est le type de réseau que vous utilisez.

Le bridgeréseau fonctionne comme un réseau privé interne à l'hôte afin que les conteneurs qui s'y trouvent puissent communiquer. L'accès externe est accordé en exposant les ports aux conteneurs.

Les réseaux de pont sont utilisés lorsque vos applications s'exécutent dans des conteneurs autonomes qui doivent communiquer.

Dans l'image ci db- dessus et webpeuvent communiquer les uns avec les autres sur un réseau de pont créé par l'utilisateur appelé mybridge.

Si vous n'avez jamais ajouté de réseau dans Docker, vous devriez voir quelque chose de similaire à ceci:

$ docker network ls NETWORK ID NAME DRIVER SCOPE c3cd46f397ce bridge bridge local ad4e4c24568e host host local 1c69593fc6ac none null local

Le bridgeréseau par défaut est répertorié, ainsi que hostet none. Nous ignorerons les deux autres et utiliserons le bridgeréseau lorsque nous aurons accès aux exemples.

Adresse IP du conteneur Docker

Par défaut, une adresse IP est attribuée au conteneur pour chaque réseau Docker auquel il se connecte. Et chaque réseau est créé avec un masque de sous-réseau par défaut, en l'utilisant plus tard comme un pool pour donner les adresses IP.

Docker utilise généralement la valeur par défaut 172.17. 0.0 / 16 sous-réseau pour la mise en réseau des conteneurs.

Maintenant pour mieux le comprendre, nous allons exécuter un vrai cas d'utilisation.

dessin

Exemple Docker

Pour illustrer cela, nous utiliserons un environnement Hive et Hadoop, contenant 5 conteneurs Docker.

Découvrez le docker-compose.ymlfichier que nous allons exécuter:

version: "3" services: namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8 volumes: - namenode:/hadoop/dfs/name environment: - CLUSTER_NAME=test env_file: - ./hadoop-hive.env ports: - "50070:50070" datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8 volumes: - datanode:/hadoop/dfs/data env_file: - ./hadoop-hive.env environment: SERVICE_PRECONDITION: "namenode:50070" ports: - "50075:50075" hive-server: image: bde2020/hive:2.3.2-postgresql-metastore env_file: - ./hadoop-hive.env environment: HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore" SERVICE_PRECONDITION: "hive-metastore:9083" ports: - "10000:10000" hive-metastore: image: bde2020/hive:2.3.2-postgresql-metastore env_file: - ./hadoop-hive.env command: /opt/hive/bin/hive --service metastore environment: SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432" ports: - "9083:9083" hive-metastore-postgresql: image: bde2020/hive-metastore-postgresql:2.3.0 volumes: namenode: datanode: 

Depuis docker-hive GitHub

Personne ne veut lire un fichier de configuration ÉNORME , non? Alors voici une photo:

Bien mieux! Maintenant, démarrons ces conteneurs:

docker-compose up -d 

Nous pouvons voir 5 conteneurs:

$ docker ps --format \ "table {{.ID}}\t{{.Status}}\t{{.Names}}" CONTAINER ID STATUS NAMES 158741ba0339 Up 1 minutes dockerhive_hive-metastore-postgresql 607b00c25f29 Up 1 minutes dockerhive_namenode 2a2247e49046 Up 1 minutes dockerhive_hive-metastore 7f653d83f5d0 Up 1 minutes (healthy) dockerhive_hive-server 75000c343eb7 Up 1 minutes (healthy) dockerhive_datanode

Vérifions ensuite nos réseaux Docker:

$ docker network ls NETWORK ID NAME DRIVER SCOPE c3cd46f397ce bridge bridge local 9f6bc3c15568 docker-hive_default bridge local ad4e4c24568e host host local 1c69593fc6ac none null local

Attendez une minute ... il y a un nouveau réseau appelé docker-hive_default!

Par défaut, docker compose configure un seul réseau pour votre application. Et le réseau de votre application reçoit un nom basé sur le «nom du projet», provenant du nom du répertoire dans lequel il réside.

Donc, puisque notre annuaire est nommé docker-hive, cela explique le nouveau réseau.

Ensuite, quelques exemples sur la façon d'obtenir l'adresse IP Docker.

Comment obtenir une adresse IP de conteneur Docker - exemples

Et maintenant que j'ai votre attention, nous allons dévoiler le mystère.

dessin

1. Utilisation de Docker Inspect

Docker inspect est un excellent moyen de récupérer des informations de bas niveau sur les objets Docker. Vous pouvez sélectionner n'importe quel champ du JSON renvoyé de manière assez simple.

Alors devons-nous l'utiliser pour obtenir l'adresse IP du dockerhive_datanode?

$ docker inspect -f \ '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \ 75000c343eb7 172.18.0.5

N'avez-vous pas dit que Docker utilise la valeur par défaut 172.17. 0.0 / 16 sous-réseau pour la mise en réseau de conteneurs? Pourquoi l'adresse IP renvoyée: 172.18.0.5 est-  elle en dehors?

Pour répondre à cela, nous devons examiner nos paramètres réseau:

$ docker network inspect -f \ '{{range .IPAM.Config}}{{.Subnet}}{{end}}' 9f6bc3c15568 172.18.0.0/16

Nous avons exécuté cet exemple dans une VM Compute Engine, et dans ce test, le réseau docker s'est vu attribuer un sous-réseau différent: 172.18.0.0/16 . Ceci explique cela!

En outre, nous pouvons également rechercher toutes les adresses IP à l'intérieur du docker-hive_defaultréseau.

Nous n'avons donc pas besoin de rechercher l'adresse IP de chaque conteneur individuellement:

$ docker network inspect -f \ '{{json .Containers}}' 9f6bc3c15568 | \ jq '.[] | .Name + ":" + .IPv4Address' "dockerhive_hive-metastore-postgresql:172.18.0.6/16" "dockerhive_hive-metastore:172.18.0.2/16" "dockerhive_namenode:172.18.0.3/16" "dockerhive_datanode:172.18.0.5/16" "dockerhive_hive-server:172.18.0.4/16"
dessin

Si vous ne l'avez pas remarqué, nous avons utilisé l' aide de jq pour analyser l' Containersobjet de la carte.

2. Utilisation de Docker exec

Dans l'exemple suivant, nous travaillerons avec le dockerhive_namenode.

$ docker exec dockerhive_namenode cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.3 607b00c25f29

3. À l'intérieur du conteneur Docker

$ docker exec -it dockerhive_namenode /bin/bash # running inside the dockerhive_namenode container ip -4 -o address 7: eth0 inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0

Nous pouvons même trouver les adresses IP d'autres conteneurs qui se trouvent à l'intérieur d'un conteneur dans le même réseau:

Nœud de données

# running inside the dockerhive_namenode container ping dockerhive_datanode PING dockerhive_datanode (172.18.0.5): 56 data bytes 64 bytes from 172.18.0.5: icmp_seq=0 ttl=64 time=0.092 ms

Ruche mestastore

# running inside the dockerhive_namenode container ping dockerhive_hive-metastore PING dockerhive_hive-metastore_1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.087 ms

Serveur Hive

# running inside the container ping dockerhive_hive-server PING dockerhive_hive-server (172.18.0.4): 56 data bytes 64 bytes from 172.18.0.4: icmp_seq=0 ttl=64 time=0.172 ms

Emballer

Tous les exemples ont été exécutés dans une VM Compute Engine de distribution Linux. Si vous les exécutez dans des environnements macOS ou Windows, les exemples de commandes peuvent changer un peu.

Gardez également à l'esprit que ces adresses IP dans les exemples donnés sont internes à l'exemple de docker-hive_defaultréseau. Ainsi, si vous avez un cas d'utilisation pour vous connecter à ces conteneurs en externe, vous devez utiliser l'adresse IP externe de la machine hôte (en supposant que vous exposez correctement les ports des conteneurs).

Ou si vous utilisez kubernetes, par exemple, pour gérer vos conteneurs Docker, laissez-le gérer les adresses IP pour vous kubernetes-expose-external-ip-address?.

* Illustrations de icons8.com par Murat Kalkavan.