docker-compose domyślnie utworzy sieć wirtualną, w której wszystkie kontenery/usługi w pliku tworzenia mogą łączyć się ze sobą za pomocą adresu IP. Używając links
, depends_on
lub aliasy sieciowe, które mogą łączyć się ze sobą za pomocą nazwy hosta. W twoim przypadku nazwa hosta jest nazwą usługi, ale można ją zastąpić. (patrz:dokumenty
)
Twój skrypt w my_common_package
kontener/usługa powinna następnie połączyć się z mysql
na porcie 3306
zgodnie z twoją konfiguracją. (nie localhost
na porcie 3306
)
Pamiętaj też, że używanie expose
jest konieczne tylko wtedy, gdy plik Dockerfile dla usługi nie ma EXPOSE
oświadczenie. Standardowy obraz mysql już to robi.
Jeśli chcesz zmapować port kontenera na localhost
musisz użyć ports
, ale rób to tylko wtedy, gdy jest to konieczne.
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"
Mówimy tutaj, że port 3306 w kontenerze mysql powinien być zmapowany na localhost na porcie 3306.
Teraz możesz połączyć się z mysql za pomocą localhost:3306
poza dokiem. Na przykład możesz spróbować uruchomić swój testsql.py
lokalnie (NIE w kontenerze).
Komunikacja kontenera z kontenerem zawsze będzie odbywać się przy użyciu nazwy hosta każdego kontenera. Pomyśl o kontenerach jako maszynach wirtualnych.
Możesz nawet znaleźć sieć docker-compose utworzoną za pomocą docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. następnie użyj docker network inspect <id>
aby przyjrzeć się szczegółom.
Adresy IP przypisane do kontenerów mogą być dość losowe, więc jedynym realnym sposobem komunikacji kontener-kontener jest używanie nazw hostów.