wake-up-neo.com

Stellen Sie über Docker-Container eine Verbindung zu einer entfernten MySQL-Datenbank her

Ich arbeite an der Containerisierung einer Django 1.5.x-Anwendung, die über ODBC eine Verbindung zu einer MySQL-Datenbank auf einem separaten Server herstellt:

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

Ich kann die Django-App auf meinem lokalen Computer (außerhalb des Dockers) mit einer Verbindung zur Remote-DB über Portweiterleitung und SSH ausführen:

 ssh -L 3307:127.0.0.1:3306 [email protected]_DB_SERVER

Ich habe einen Docker-Container für die App mit Centos 6.x eingerichtet, kann jedoch die MySQL-Verbindung nicht zum Laufen bringen. In dem Container ist MySQL installiert und die mysqld läuft.

Meine docker-compose.yml-Datei sieht folgendermaßen aus:

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

Wenn der Container ausgeführt wird, kann ich den folgenden Befehl (außerhalb des Containers) ausführen, um Datenbanken in der Remote-DB anzuzeigen:

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

Aber innerhalb des Containers schlägt der gleiche Befehl fehl:

    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

Der Docker funktioniert wie eine virtuelle Maschine. Es verfügt über einen lokalen Speicher und eine lokale Umgebung. Wenn Sie vom Docker aus eine Verbindung zu 127.0.0.1 herstellen, versucht er, eine Verbindung zu diesem Docker herzustellen (nicht zu einem lokalen Computer, auf dem der Docker ausgeführt wurde), da der localhost für den Docker der Docker ist.

Bitte lesen Sie die folgende Antwort:

Wie verbinde ich mich innerhalb eines Docker-Containers mit dem localhost des Computers?

3
Danil Valov

Ich habe das Problem gelöst, indem ich die Docker-Host-Adresse anstelle von '127.0.0.1' für Abfragen aus dem Container verwendet habe:

echo "show database" | mysql -u DB_USER -pDB_USER_PWD -h 10.0.2.2 --port = 3306

Da sich die Docker Host-IP-Adresse unterscheiden kann, werden in diesem Beitrag Schritte beschrieben, um die richtige Adresse zu erhalten:

Wie erhalte ich die IP-Adresse des Docker-Hosts aus einem Docker-Container

2
Brendenw

Zuerst müssen Sie überprüfen, ob der Docker-Datenbankport in Ihrer Firewall verfügbar ist, indem Sie den folgenden Befehl ausführen:

Sudo firewall-cmd --list-all

Beispiel OUTPUT:

  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:

Hier wird 3307 als Docker-Datenbankport auf 172.17.0.2 IP verwendet. Wenn dieser Port nicht verfügbar ist, führen Sie den folgenden Befehl aus: 

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

Jetzt können Sie mit der obigen Konfiguration problemlos von Ihrem lokalen System auf die Docker-Datenbank zugreifen.

0
Sanaulla