Mysql
 sql >> Database >  >> RDS >> Mysql

Docker non può connettere l'applicazione a MySQL

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.