sql >> Base de Datos >  >> RDS >> Mysql

Docker no puede conectar la aplicación a MySQL

docker-compose creará de forma predeterminada una red virtual donde todos los contenedores/servicios en el archivo de composición pueden comunicarse entre sí mediante una dirección IP. Mediante el uso de links , depends_on o alias de red, pueden comunicarse entre sí por nombre de host. En su caso, el nombre de host es el nombre del servicio, pero esto se puede anular. (ver:docs )

Tu script en my_common_package el contenedor/servicio debe conectarse a mysql en el puerto 3306 según su configuración. (no localhost en el puerto 3306 )

También tenga en cuenta que usar expose solo es necesario si el Dockerfile para el servicio no tiene un EXPOSE declaración. La imagen mysql estándar ya hace esto.

Si desea asignar un puerto de contenedor a localhost necesitas usar ports , pero hazlo solo si es necesario.

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"

Aquí decimos que el puerto 3306 en el contenedor mysql debe asignarse a localhost en el puerto 3306.

Ahora puede conectarse a mysql usando localhost:3306 fuera de la ventana acoplable. Por ejemplo, puede intentar ejecutar su testsql.py localmente (NO en un contenedor).

La comunicación de contenedor a contenedor siempre ocurrirá utilizando el nombre de host de cada contenedor. Piense en los contenedores como máquinas virtuales.

Incluso puede encontrar la red docker-compose creada usando docker network list :

1b1a54630639        myproject_default             bridge              local
82498fd930bb        bridge                        bridge              local

.. luego use docker network inspect <id> para ver los detalles.

Las direcciones IP asignadas a los contenedores pueden ser bastante aleatorias, por lo que la única forma viable de comunicación de contenedor a contenedor es mediante nombres de host.