À travers docker-compose.yml
Je peux exécuter l'application. Maintenant, nous voulons déplacer l'application en production, mais nous ne voulons pas utiliser la base de données de conteneurs. Existe-t-il un moyen de connecter ma base de données MySQL locale à l'application à l'aide de docker-compose
?
Mon docker-compose.yml ressemble à:
version: '3'
services:
web-app:
build:
context: .
dockerfile: web-app/Dockerfile
ports:
- 8080:8080
links:
- app-db
app-db:
build:
context: .
dockerfile: app-db/Dockerfile
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=Optimize
ports:
- 3306:3306
Au lieu de app-db
partie Je veux juste me connecter à ma base de données mysql
hébergée localement.
Recherchez l'IP de la machine hôte dans le réseau Docker. Si vous utilisez docker-compose.yml version: "3"
c'est probablement que cette IP est: 172.18.0.1
, mais confirmez-le recherche de la "passerelle" de votre conteneur (votre hôte):
docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.18.0.1",
"IPv6Gateway": "",
Donc, dans votre application docker, pointez sur MySQL comme ceci: 172.18.0.1:3306
(peut-être dans un fichier de configuration). Tenez compte du fait que cette adresse IP est fixe tant que le réseau docker reste le même (le réseau est créé par docker-compose, et il n'est supprimé que si vous le faites docker-compose down
)
Vérifiez également que votre MySQL écoute toutes ses interfaces. Dans votre my.cnf
rechercher bind-address
ça devrait être 0.0.0.0
(tenez compte des problèmes de sécurité si votre serveur a une adresse IP publique).
Comme alternative, vous pouvez apporter au conteneur le même réseau que votre hôte, afin de partager l'hôte local, afin que le conteneur y trouve mysql. Utiliser le mode réseau comme "hôte":
version: '3'
services:
web-app:
build:
context: .
dockerfile: web-app/Dockerfile
ports:
- 8080:8080
network_mode: "Host"
Ensuite, pointez votre hibernate.properties
à mysql comme ceci: localhost:3306