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.