1
votes

Comment connecter le conteneur Docker à la base de données mysql localhost de la machine hôte?

J'ai un fichier war qui utilise la base de données MySQL dans le backend. J'ai déployé mon fichier war dans un conteneur docker et je peux envoyer un ping à partir de mon navigateur. Je souhaite connecter mon application à la base de données MySQL. Cette base de données existe sur l'hôte localhost:3306 de ma machine localhost:3306

Comme je suis incapable de connecter cela depuis l'hôte local du conteneur, j'ai essayé d'exécuter une commande docker inspect --format '{{ .NetworkSettings.IPAddress }}' 213be777a837 Cette commande m'a donné une adresse IP 172.17.0.2 . Je suis allé aux options du serveur MySQL et j'ai mis cette adresse IP dans le champ de liaison et j'ai redémarré le serveur. Après cela, j'ai mis à jour la chaîne de connexion à la base de données de mes projets avec 172.17.0.2:3306

Mais ça ne fonctionne pas. Quelqu'un pourrait-il s'il vous plaît dire ce que je manque? J'ai également essayé d'ajouter un nouvel utilisateur de base de données avec root @%, puis exécutez la commande pour autoriser toutes les autorisations à «root @%» mais rien n'a fonctionné.


12 commentaires

"Ca ne fonctionne pas?" pas un terme utile. Alors, quel est le message d'erreur? Quels ont été vos résultats? Qu'est-ce que vous attendiez? Montrez votre fichier docker / comment vous le démarrez.


Je n'ai pas pu obtenir la connexion à la base de données. Ces étapes semblent-elles correctes?


C'est l'adresse IP interne. Quel est l'environnement?. Avez-vous exposé ou remappé le port 3306 lors du démarrage ou de l'exécution du conteneur?.


Non, «obtenir la connexion» est également ambigu s'il s'agit d'un problème de réseau ou d'autorisation. Soyez précis sur les messages d'erreur en particulier. C'est pourquoi j'ai demandé votre fichier docker et comment vous l'avez démarré.


conteneur docker en cours d'exécution ls je peux voir CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 213be777a837 6ab907c973d2 "catalina.sh run" Il y a 44 heures Up 20 minutes 0.0.0.0:8082->8080/tcp my-tomcat


Je n'ai créé aucun fichier docker. J'ai extrait le repo tomcat du hub docker et y ai déployé manuellement mon fichier de guerre


Vous n'avez pas exposé ou remappé le port 3306, arrêté le conteneur et exécuté avec l'option de conteneur docker -p 3306: 3306 (utilisez un port différent si vous avez d'autres instances mysql en cours d'exécution sur l'hôte)


Et quelle sera la chaîne de connexion?


docker run -d -p 3306: 3306 -p 8082: 8080 6ab907c973d2


C: \ Program Files \ Docker \ Docker \ resources \ bin \ docker.exe: réponse d'erreur du démon: les ports ne sont pas disponibles: listen tcp 0.0.0.0:3306: bind: une seule utilisation de chaque adresse de socket (protocole / adresse réseau / port) est normalement autorisé.


Est-ce que cela répond à votre question? Comment se connecter à l'hôte Docker à partir du conteneur sur Windows 10 (Docker pour Windows)


J'essaye avec ces solutions, laissez-moi vérifier si cela résout mon problème ou non


4 Réponses :


0
votes

tl; dr : Utilisez 172.17.0.1:3306 si vous êtes sous Linux.

Description plus longue:

Si je comprends bien, ce que vous devez faire est de vous connecter à partir de votre conteneur Docker à un port hôte. Mais ce que vous avez fait est d'essayer de lier le processus hôte (MySQL) à l'interface réseau du conteneur. Je ne sais pas quelles sont les implications d'un processus hôte essayant de se lier à un autre espace de noms réseau de processus hôte, mais IIUC votre processus MySQL ne devrait pas être capable de se lier à cette adresse.

Lorsque vous démarrez MySQL avec des paramètres par défaut qui le lient à 0.0.0.0 il est disponible pour les conteneurs Docker via le pont virtuel Docker. Par conséquent, vous devez acheminer vos demandes du processus WAR vers le processus hôte via ce pont virtuel (s'il s'agit du mode réseau que vous utilisez. Si vous n'avez modifié aucun paramètre réseau Docker, cela devrait l'être). Cela se fait en spécifiant l'adresse de passerelle de pont comme adresse MySQL et le port avec lequel elle a démarré.

Vous pouvez obtenir l'adresse IP du pont en vérifiant vos interfaces réseau. Lorsque Docker est installé, il configure le pont virtuel par défaut, et cela devrait apparaître comme docker0 si vous êtes sous Linux. L'adresse IP pour cela sera très probablement 172.17.0.1 . Donc, votre adresse MySQL du point de vue du jdbc:mysql://172.17.0.1:3306/... est jdbc:mysql://172.17.0.1:3306/...

entrez la description de l'image ici

1 - https://docs.docker.com/network/

2 - https://docs.docker.com/network/bridge/


3 commentaires

Je suis sur une machine windows


Pas familier avec Docker pour Windows, mais cela ressemble à une approche basée sur la VM. docs.docker.com/docker-for-windows/networking/...


On dirait également que cela a été répondu dans stackoverflow.com/questions/40746453/… . Veuillez vérifier si cela fonctionne.



0
votes

Votre configuration est correcte. Il vous suffit de faire ce changement.

Lors de l'exécution du conteneur d'application (celui dans lequel vous déployez votre fichier war), vous devez ajouter l'argument suivant dans sa commande docker run .

docker run -itd -p 8082:8080 --net=host --name myapp myimage

Exemple:

--net=host

Avec cette modification, vous ne devez pas non plus modifier la chaîne de connexion. localhost:3306 fonctionnerait bien. Et vous pourrez établir une connexion avec MySQL.


3 commentaires

(Cela désactive l'isolation réseau normale de Docker et les communications entre conteneurs, et ce ne serait pas ma solution recommandée ... mais cela devrait fonctionner sous Linux.)


@DavidMaze Oui, vous avez raison. Mais j'aimerais connaître votre solution recommandée pour ce type de problème. Merci.


Soit les autres réponses ici, soit les explications plus détaillées dans Depuis l'intérieur d'un conteneur Docker, comment puis-je me connecter à l'hôte local de la machine? .



1
votes

Suis les étapes:-

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet
docker run -p 8082:8080 --network dockernet -d 6ab907c973d2
in your project set connection string : jdbc:mysql://host.docker.internal:3306/....

Et puis déployez.


1 commentaires

Tu as sauvé ma journée. Merci. C'est ce que je recherche



1
votes

D'après votre question, je suppose que votre war file et MySQL sont déployés localement et que vous souhaitez les connecter. Une façon d'autoriser les deux conteneurs déployés localement à se parler est de:

  1. Créez votre propre réseau docker network create <network-name>

  2. Ensuite, lorsque vous exécutez votre war file et MySQL , déployez-les tous les deux à l'aide de --network. Par exemple

    • War File: docker run --name war-file --network <network-name> <war file image>
    • MySQL: docker run --name mysql --network <network-name> <MySQL image>
  3. Après cela, si vous devriez pouvoir vous connecter à votre MySQL en utilisant mysql:3306 partir de votre conteneur de docker de fichiers de guerre, car ils sont tous les deux sur le même réseau personnalisé.

Si vous souhaitez en savoir plus à ce sujet, vous pouvez consulter la documentation de docker sur le réseau. ( https://docs.docker.com/network/bridge/ ).


0 commentaires