Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Docker kann Anwendung nicht mit MySQL verbinden

docker-compose erstellt standardmäßig ein virtuelles Netzwerk, in dem sich alle Container/Dienste in der Compose-Datei über eine IP-Adresse erreichen können. Durch die Verwendung von links , depends_on ab oder Netzwerk-Aliase können sie sich gegenseitig über den Hostnamen erreichen. In Ihrem Fall ist der Hostname der Dienstname, dieser kann jedoch überschrieben werden. (siehe:docs )

Ihr Skript in my_common_package container/service sollte sich dann mit mysql verbinden auf Port 3306 nach deiner einstellung. (nicht localhost auf Port 3306 )

Beachten Sie auch die Verwendung von expose ist nur notwendig, wenn das Dockerfile für den Dienst kein EXPOSE hat Erklärung. Das Standard-Mysql-Image tut dies bereits.

Wenn Sie localhost einen Containerport zuordnen möchten Sie müssen ports verwenden , aber tun Sie dies nur, wenn es notwendig ist.

services:
   mysql:
     image: mysql:5.6
     container_name: test_mysql_container
     environment:
       - MYSQL_ROOT_PASSWORD=test
       - MYSQL_DATABASE=My_Database
       - MYSQL_USER=my_user
       - MYSQL_PASSWORD=my_password
     volumes:
       - db_data:/var/lib/mysql
     ports:
       - "3306:3306"

Hier sagen wir, dass Port 3306 im MySQL-Container localhost auf Port 3306 zugeordnet werden sollte.

Jetzt können Sie mit localhost:3306 eine Verbindung zu mysql herstellen außerhalb von docker. Sie können beispielsweise versuchen, Ihre testsql.py auszuführen lokal (NICHT in einem Container).

Die Container-zu-Container-Kommunikation erfolgt immer unter Verwendung des Hostnamens jedes Containers. Stellen Sie sich Container als virtuelle Maschinen vor.

Sie können sogar das Netzwerk docker-compose finden, das mit docker network list erstellt wurde :

1b1a54630639        myproject_default             bridge              local
82498fd930bb        bridge                        bridge              local

.. verwenden Sie dann docker network inspect <id> um sich die Details anzusehen.

Den Containern zugewiesene IP-Adressen können ziemlich willkürlich sein, daher ist die Verwendung von Hostnamen der einzige praktikable Weg für die Kommunikation von Container zu Container.