docker-compose creerà per impostazione predefinita una rete virtuale in cui tutti i contenitori/servizi nel file di composizione possono raggiungersi tramite un indirizzo IP. Utilizzando links
, depends_on
o alias di rete possono contattarsi tramite il nome host. Nel tuo caso il nome host è il nome del servizio, ma questo può essere sovrascritto. (vedi:documenti
)
Il tuo script in my_common_package
container/service dovrebbe quindi connettersi a mysql
sulla porta 3306
secondo la tua configurazione. (non localhost
sulla porta 3306
)
Nota anche che usando expose
è necessario solo se il Dockerfile per il servizio non ha un EXPOSE
dichiarazione. L'immagine standard di MySQL lo fa già.
Se vuoi mappare una porta container su localhost
devi usare ports
, ma fallo solo se necessario.
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"
Qui stiamo dicendo che la porta 3306 nel contenitore mysql dovrebbe essere mappata su localhost sulla porta 3306.
Ora puoi connetterti a mysql usando localhost:3306
al di fuori del docker. Ad esempio, puoi provare a eseguire il tuo testsql.py
localmente (NON in un contenitore).
La comunicazione da contenitore a contenitore avverrà sempre utilizzando il nome host di ciascun contenitore. Pensa ai container come a macchine virtuali.
Puoi persino trovare la composizione della finestra mobile di rete creata utilizzando docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. quindi usa docker network inspect <id>
per guardare i dettagli.
Gli indirizzi IP assegnati ai container possono essere piuttosto casuali, quindi l'unico modo praticabile per la comunicazione da container a container è usare i nomi host.