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
3 Réponses :
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.
http://172.17.0.3:9000
comme point de terminaison de votre sondeur dans Jenkins. http://172.17.0.2:8000
comme point de terminaison jenkins dans le sondeur. 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 .
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.
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:latestJ'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'optiondocker run -p
).Depuis l'hôte, votre seul chemin (portable et fiable) pour atteindre le conteneur passe par ses ports publiés.
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.
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