web-dev-qa-db-fra.com

Se connecter à la base de données MySQL distante depuis le conteneur Docker

Je travaille à la conteneurisation d'une application Django 1.5.x qui se connecte à une base de données MySQL sur un serveur distinct via ODBC:

[mysql_default]
database = DB_NAME
driver = /usr/lib64/libmyodbc5.so
server = REMOTE_DB_SERVER
user = DB_USER
password = DB_USER_PWD
port = 3306

Je peux exécuter l'application Django sur ma machine locale (en dehors du menu fixe) avec une connexion à la base de données distante via la redirection de port et SSH:

 ssh -L 3307:127.0.0.1:3306 MYID@REMOTE_DB_SERVER

J'ai configuré un conteneur Docker pour l'application à l'aide de Centos 6.x, mais la connexion à MySQL ne fonctionne pas. MySQL est installé sur le conteneur et mysqld est en cours d'exécution.

Mon fichier docker-compose.yml ressemble à ceci:

version: "2"
services:
  web:
    build: .
    image: MY_IMAGE
    container_name: MY_CONTAINER
    network_mode: "Host"
    ports:
      - "3307:3306"
    command: /bin/bash

Avec le conteneur en cours d'exécution, je peux exécuter la commande suivante (en dehors du conteneur) pour afficher les bases de données sur la base de données distante:

docker exec MY_CONTAINER echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3307

Mais depuis l'intérieur du conteneur, la même commande échoue:

    echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3306

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
9
Brendenw

Le Docker fonctionne comme une machine virtuelle. Il a un stockage local et un environnement local. Lorsque vous vous connectez à 127.0.0.1 à partir du menu fixe, celui-ci tente de se connecter à ce menu fixe (et non à la machine locale sur laquelle le menu fixe a été exécuté) car l'hôte local pour le menu fixe est le menu fixe.

S'il vous plaît, lisez la réponse suivante:

À partir d'un conteneur Docker, comment puis-je me connecter à l'hôte local de la machine?

3
Danil Valov

J'ai résolu ce problème en utilisant l'adresse de l'hôte du menu fixe au lieu de «127.0.0.1» pour les requêtes provenant du conteneur:

echo "Afficher les bases de données" | mysql -u DB_USER -pDB_USER_PWD -h 10.0.2.2 --port = 3306

Étant donné que l'adresse IP de l'hôte Docker peut varier, cet article décrit les étapes à suivre pour obtenir la bonne adresse:

Comment obtenir l'adresse IP du hôte Docker depuis un conteneur Docker

2
Brendenw

Vous devez d’abord vérifier que le port de la base de données Docker est disponible dans votre pare-feu en suivant la commande -

Sudo firewall-cmd --list-all

Exemple de sortie:

  target: default
  icmp-block-inversion: no
  interfaces: eno79841677
  sources: 
  services: dhcpv6-client ssh
  **ports: 3307/tcp**
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

Ici 3307 est utilisé comme port de base de données Docker sur 172.17.0.2 IP, si ce port n’est pas disponible, exécutez la commande suivante - 

Sudo firewall-cmd --zone=public --add-port=3307/tcp
Sudo firewall-cmd --reload

Vous pouvez maintenant accéder facilement à la base de données Docker à partir de votre système local grâce à la configuration ci-dessus.

0
Sanaulla