3
votes

Comment accéder à l'adresse IP interne du conteneur Docker depuis l'hôte?

J'ai 2 conteneurs docker en cours d'exécution sur mon hôte Mac - le conteneur 1 est Jenkins de Docker Hub et le conteneur 2 est SonarQube de Docker Hub . Les deux conteneurs fonctionnent avec succès. Je peux accéder à Jenkins depuis mon hôte en allant sur http: // localhost: 8080 / et je peux accéder à mon SonarQube en allant sur http: // localhost: 9000 / .

Le conteneur Jenkins a été démarré comme ceci:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

Le conteneur SonarQube a été démarré comme ceci:

docker run -d -p 9000:9000 sonarqube

Maintenant Je veux que chaque conteneur communique entre eux, je dois donc fournir l'adresse IP de l'autre conteneur à chaque conteneur.

J'ai obtenu le Adresse IP de chaque conteneur en exécutant ceci:

docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:latest


0 commentaires

3 Réponses :


1
votes

Il semble que vous utilisiez le modèle de réseau bridge par défaut. Les adresses IP internes sont destinées à permettre à chaque conteneur de se parler sous le réseau bridge . Vous ne pouvez pas y accéder depuis l'hôte.

Il existe plusieurs options pour vous.

  1. Vous pouvez configurer http://172.17.0.3:9000 comme point de terminaison de votre sondeur dans Jenkins.
  2. Vous pouvez configurer http://172.17.0.2:8000 comme point de terminaison jenkins dans le sondeur.
  3. Si vous ne souhaitez pas coder en dur au-dessus d'Ips, vos deux conteneurs peuvent communiquer avec chacun en utilisant Docker Default GatewayIp ( 172.17.0.1 ) et leur port interne . vous pouvez donc essentiellement configurer http://172.17.0.1 également.

Remarque - Modification de l'IP de la passerelle par défaut si vous définissez réseau de pont défini par l'utilisateur .

https: // docs. docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network

https://docs.docker.com/network/network-tutorial- autonome /

Si vous souhaitez faire tourner les deux conteneurs à l'aide de docker-compose, vous pouvez lier les deux conteneurs en utilisant le nom du service. Suivez simplement Mise en réseau dans Compose .


2 commentaires

J'ai réalisé que je pouvais simplement utiliser l'adresse IP de mon hôte comme adresse de l'autre conteneur. Ainsi, lorsque je fais ifconfig sur mon hôte et que je vois que mon IP est 192.168.0.14 , je définis l'adresse du sondeur dans le conteneur Jenkins comme 192.168.0.14:9000 et dans le conteneur Sonar, j'ai défini l'adresse Jenkins comme 192.168.0.14:8080 . Je devrai mettre à jour ces adresses IP car mon adresse IP hôte peut changer, mais elle est suffisante pour ce dont j'ai besoin.


@gomisha Oui. vous pouvez utiliser l'adresse IP de l'hôte. Dans un environnement DevOps typique, j'essaie d'utiliser docker-compose pour amener les deux conteneurs liés entre eux afin qu'ils puissent parler simplement en utilisant le nom et le port du service sans coder en dur les adresses IP ou en utilisant l'hôte Ip.



2
votes

Est-ce un comportement normal? Ne devrais-je pas pouvoir accéder à chaque conteneur depuis mon hôte par son adresse IP interne?

Ce que vous décrivez est un comportement normal: vous ne pouvez pas accéder directement aux adresses IP internes de Docker depuis un hôte MacOS. Voir "Par conteneur L'adressage IP n'est pas possible "dans la documentation Docker pour Mac .

Comment puis-je tester qu'un conteneur (par exemple Jenkins) peut accéder à l'autre conteneur (par exemple SonarQube) par adresse IP?

Ce n'est pas quelque chose que je "teste" normalement en soi . Démarrez les deux processus et demandez-leur d'établir leurs connexions normales (HTTP); si cela fonctionne, vous verrez les messages de journal appropriés, et si cela ne fonctionne pas, vous verrez des plaintes. (Obtenir un shell racine dans un conteneur pour envoyer des paquets ICMP d'un conteneur à un autre semble être une option populaire mais ne prouve pas grand-chose.)

Aussi: ne faites pas cette connexion en adresse IP explicite . Comme vous l'avez déjà remarqué, les adresses IP internes de Docker ne sont pas utilisables dans certains contextes et elles changeront chaque fois que vous redémarrerez les conteneurs. Au lieu de cela, Docker fournit un service DNS interne qui peut résoudre les noms d'hôte lors de la communication entre les conteneurs, mais vous devez explicitement configurer un réseau de pont autre que celui par défaut . Cette configuration ressemblerait à:

docker network create jenkinsnet
docker run --name sonarqube -d --net jenkinsnet \
  -p 9000:9000 \
  sonarqube
docker run --name jenkins -d --net jenkinsnet \
  -p 8080:8080 -p 50000:50000 \
  -e SONARQUBE_URL=http://sonarqube:9000 \
  jenkins/jenkins:latest

J'ai donc explicitement créé un réseau; commencé les deux conteneurs qui y sont connectés; et dit au conteneur client (via une variable d'environnement) où se trouve le conteneur serveur. Vous n'avez pas besoin de publier des ports avec docker run -p pour les atteindre de cette façon; que vous le fassiez ou non, utilisez le port sur lequel le processus serveur écoute (le deuxième numéro de port dans l'option docker run -p ).

Depuis l'hôte, votre seul chemin (portable et fiable) pour atteindre le conteneur passe par ses ports publiés.


1 commentaires

Votre solution est beaucoup plus élégante, mais j'ai réalisé que je pouvais simplement utiliser l'adresse IP de mon hôte comme adresse de l'autre conteneur. Ainsi, lorsque je fais ifconfig sur mon hôte et que je vois que mon IP est 192.168.0.14 , je définis l'adresse du sondeur dans le conteneur Jenkins comme 192.168.0.14:9000 et dans le conteneur Sonar, j'ai défini l'adresse Jenkins comme 192.168.0.14:8080 . Je devrai mettre à jour ces adresses IP car mon adresse IP hôte peut changer, mais elle est suffisante pour ce dont j'ai besoin.



1
votes

La réponse acceptée ( https://stackoverflow.com/a/53992787/7730554 ) fournit déjà des options valides de ce que je préfère personnellement en utilisant docker compose.

Mais comme vous exécutez Docker sur Mac, vous pouvez également utiliser en combinaison avec le port d'hôte de transfert défini. Docker veillera donc à ce que host.docker.internal soit résolu en IP correspondante même si votre IP hôte change.


0 commentaires