Estoy empezando a ensuciarme las manos con Docker y estoy tratando de hacer que mi aplicación PHP se ejecute en un contenedor docker con nginx para conectarme a la base de datos que se ejecuta en otro contenedor que ejecuta MariaDB.
Cuando ejecuto los contenedores, puedo conectarme sin problemas a la base de datos desde mi computadora (usando Sequel Pro), pero cuando intento conectarme a la base de datos desde la aplicación PHP que se ejecuta en el contenedor nginx, aparece el siguiente error de mysqli:
Advertencia: mysqli_connect(): (HY000/2002): Conexión rechazada en >/app/web/php/db-config.php en la línea 7 No se pudo conectar a la base de datos, murió con error:
El db-config.php donde ocurre el error es el siguiente:
define('DB_HOST', '0.0.0.0:3306'); define('DB_NAME', 'Jumpooling'); define('DB_USER', 'root'); define('DB_PASSWORD', 'root'); $con=mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Failed to connect to the database, died with error:');
Todo el contenido del archivo docker-compose.yml está en este repositorio.
¿Qué me estoy perdiendo?
Logré encontrar la solución en esta respuesta.
El problema era que el host no debía definirse como una dirección IP sino con el nombre de enlace que se le da en el archivo docker-compose.yml
, es decir, db
.
El db-config.php
final es, por lo tanto:
define('DB_HOST', 'db'); define('DB_NAME', 'Jumpooling'); define('DB_USER', 'root'); define('DB_PASSWORD', 'root'); $con=mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, 3306) or die('Failed to connect to the database, died with error:');
No se requieren enlaces para permitir que los servicios se comuniquen; de forma predeterminada, cualquier servicio puede llegar a cualquier otro servicio en el nombre de ese servicio.
Se podrá acceder a los contenedores para el servicio vinculado en un nombre de host idéntico al alias, o al nombre del servicio si no se especificó ningún alias.
Debe especificar el contenedor/navegador de puertos explícitamente como -p 3306:3306:
docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=secret -d mysql:latest