web-dev-qa-db-fra.com

Comment connecter une base de données MySQL hébergée localement avec le conteneur Docker

À 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.

11
Ben.Bean

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

26
Robert