J'ai essayé de lier un conteneur exécutant une application spring boot 2 à un conteneur exécutant mongo, mais la connexion est refusée
fichier docker-compose pour avoir un conteneur pour mongo (ajoutera plus tard un autre conteneur pour spring boot ici également )
version: '3.1' services: springboot: build: . restart: always container_name: springboot ports: - 8182:8080 working_dir: /opt/app depends_on: - mongo mongo: image: mongo container_name: springboot-mongo ports: - 27017:27017 volumes: - $HOME/data/springboot-mongo-data:/data/db - $HOME/data/springboot-mongo-bkp:/data/bkp restart: always
dockerfile pour spring boot
FROM openjdk:11 RUN apt-get update && apt-get install bash RUN mkdir -p /opt/app ENV PROJECT_HOME /opt/app COPY build/libs/recipe-book.jar $PROJECT_HOME/recipe-book.jar WORKDIR $PROJECT_HOME CMD ["java", "-Dspring.data.mongodb.uri=mongodb://springboot-mongo:27017/recipes", "-jar","./recipe-book.jar"]
J'ai essayé différentes manières d'envoyer la ligne de commande mongo uri: avec localhost au lieu de springboot-mongo, j'ai également essayé comment il est décrit ici https: // www.baeldung.com/spring-boot-command-line-arguments , plus spécifiquement -Dspring-boot.run.arguments = - spring.data.mongodb.uri = mongodb: // springboot- mongo: 27017 / recettes
. À chaque fois qu'il semble avoir une connexion refusée.
Comment puis-je connecter le conteneur à ressort à mongo?
Merci
Mise à jour, j'ai également essayé ajouter le deuxième conteneur au fichier docker-compose, en tant que tel
version: '3.1' services: mongo: image: mongo container_name: springboot-mongo ports: - 27017:27017 volumes: - $HOME/data/springboot-mongo-data:/data/db - $HOME/data/springboot-mongo-bkp:/data/bkp restart: always
mise à jour 2:
J'ai réussi à résoudre partiellement le problème en construisant d'abord l'image localement sur mon ordinateur, puis en utilisant l'image créée dans le fichier docker-compose, et en ayant -Dspring.data.mongodb.uri = mongodb: // springboot-mongo: 27017 / recettes
comme paramètre, mais toujours pas de chance de le construire directement dans le fichier docker-compose
3 Réponses :
Si vous voulez que deux conteneurs se parlent, vous devez les placer dans le même réseau docker
mettez à jour votre fichier docker-compose.yml comme ceci:
version: '3.1' services: springboot: build: . restart: always container_name: springboot ports: - 8182:8080 working_dir: /opt/app depends_on: - mongo networks: - local mongo: image: mongo container_name: springboot-mongo ports: - 27017:27017 volumes: - $HOME/data/springboot-mongo-data:/data/db - $HOME/data/springboot-mongo-bkp:/data/bkp restart: always networks: - local networks: local: driver: bridge
Et en effet cela fonctionne. Il faudra cependant examiner plus en détail le fonctionnement de docker et de son réseau. Merci beaucoup
Il n'est pas nécessaire de spécifier un réseau avec v2 et v3 de la syntaxe de fichier de composition. Les modes docker-compose et swarm créent un réseau par défaut pour le projet / la pile dont vous ne spécifiez pas un. Si vous essayez d'exécuter le même fichier de composition en mode essaim, la tentative de communication sur plusieurs nœuds sera interrompue car le réseau de superposition par défaut qui serait créé est désactivé.
J'ai le même réseau pour tous les conteneurs, mais j'obtiens toujours "connexion refusée"
Si vous êtes
Connexion refusée
lors d'une tentative de communication entre deux conteneurs Et vous voulez
api_a
communiquer avec api_b
(ou vice versa) sans le même "réseau docker" (exemple ci-dessous)
vous pouvez utiliser "hôte" du deuxième conteneur comme adresse IP de votre ordinateur et port qui est mappé depuis l'intérieur du conteneur Docker. Vous pouvez obtenir l'adresse IP de votre ordinateur avec ce script (à partir de: Recherche d'adresses IP locales en utilisant Python's stdlib ):
networks: app-tier: driver: bridge services: api: container_name: api_b image: api_b:latest depends_on: - postgresql networks: - app-tier
Exemple:
project_api_a / docker-compose.yml
: p >
networks: app-tier: driver: bridge services: api: container_name: api_a image: api_a:latest depends_on: - postgresql networks: - app-tier
dans le conteneur api_a
, vous exécutez l'application Django:
manage.py runserver 0.0.0.0:8000
et deuxième docker-compose.yml d'un autre projet:
project_api_b / docker-compose- yml
:
import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even have to be reachable s.connect(('10.255.255.255', 1)) IP = s.getsockname()[0] except: IP = '127.0.0.1' finally: s.close() return IP
dans le conteneur api_b
, vous exécutez l'application Django:
manage.py runserver 0.0.0.0:8001
Et en essayant de se connecter du conteneur api_a
à api_b
puis URL de api_b conteneur sera:
http://
Cela peut être particulièrement utile si vous utilisez encore plus de deux (trois ou plus) projets docker-compose et qu'il est difficile de fournir un réseau commun pour tout cela - c'est une bonne solution de contournement et de solution
Si vous utilisez une référence à localhost
dans le conteneur, utilisez --network = "host"
lors de l'exécution de docker.
avez-vous essayé
CMD ["java", "-Dspring.data.mongodb.uri = mongodb: // mongo: 27017 / recettes", "-jar", "./ recette-livre.jar"] code>? (en remplacement de springboot-mongo par mongo)
Comment exécutez-vous le deuxième conteneur? L'ajoutez-vous au fichier
docker-compose.yml
ou exécutez-vous séparémentdocker run
?mongo
(le nom du blocservices:
) fonctionne-t-il?vous devez ajouter l'autre au fichier docker-compose pour obtenir son nom résolu dans l'autre
J'ai essayé de remplacer springboot-mongo par juste mongo, cela n'a pas fonctionné. J'appelais le deuxième conteneur avec
docker run
. J'ai essayé d'ajouter le deuxième conteneur au fichier docker-compose, cela ne semblait pas non plus avoir d'effet@DavidMaze, si j'essaye
mongo localhost: 27017
cela fonctionne, mais pasmongo springboot-mongo: 27017
L'application Spring Boot essaie-t-elle de laisser le temps à mongo de démarrer? Avez-vous vérifié que mongo fonctionne?
en commençant par
docker-compose up
, il dit toujours que le conteneur mongo est terminé avant même de démarrer le conteneur à ressort