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.