Bonjour,
Je me suis récemment mis à docker aussi pour mes développements personnels, et là il y a un truc que je ne comprends pas trop comment faire.
J’ai un site web en PHP qui doit se connecter à une base MariaDB, rien d’extraordinaire.
Par contre, je n’arrive pas à me connecter à la base en spécifiant localhost ou 127.0.0.1. Pour que ça marche, je dois lui donner mon IP locale en 192.168.1.X.
Pourquoi ? Il me semblais qu’un réseau docker commun était automatiquement construit…
Est-ce qu’il y a un moyen de lui faire accepter une connexion avec localhost ou 127.0.0.1, sachant que c’est le host utilisé en prod ?
Je n’ai pas envie de coder en dur 192.168.1.X, car cette IP change selon que je suis en wifi ou en connexion filaire, et puis j’ai plusieurs PC où j’aimerais pouvoir développer mon projet si possible sans avoir à changer quelque chose dans le code de spécifique (c’était aussi un des buts que de passer à docker).
Alternative à la question précédente: y a-t-il un moyen de transmettre mon IP locale actuelle à PHP ? Par une variable d’environnement ou je ne sais quoi.
Sachant que la prod n’est pas en docker, et que $_SERVER['SERVER_ADDR']
ne peut pas fonctionner car elle retourne l’IP utilisée en interne par docker en 172.X.X.X (c’est logique)
Question plus générale: comment puis-je faire pour ne pas avoir à modifier mon code entre mon environnement de dev et de prod ?
Jusqu’à maintenant j’utilisais une constante LOCAL, mais n’y a-t-il pas plus propre ?
define('LOCAL', $_SERVER['REMOTE_ADDR']=='127.0.0.1' || $_SERVER['REMOTE_ADDR']=='::1' || $_SERVER['REMOTE_ADDR']==$_SERVER['SERVER_ADDR'] || substr($_SERVER['SERVER_ADDR'], 0, 10)=='192.168.1.');
Je pourrais bien sûr ajouter le 172.X.X.X donné par docker, mais si un jour je passe à docker aussi en prod (ce n’est pas exclu), je serai coincé.
Voici le script php de test de connexion:
<?php
$host = '127.0.0.1';
$user = '...';
$dbname = '...';
$password = '...';
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
die('DB connection OK');
?>
L’erreur quand je ne spécifie pas mon IP locale 192.168.1.X:
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused
ET mon docker-compose.yml:
services:
php:
image: webdevops/php-apache:7.4
ports:
- 0.0.0.0:80:80
- 0.0.0.0:443:443
working_dir: /app
volumes:
- ./html:/app
environment:
PHP_DATE_TIMEZONE: Europe/Paris
PHP_DISPLAY_ERRORS: 1
mariadb:
image: mariadb
restart: always
ports: [0.0.0.0:3306:3306]
volumes:
- ./mariadb-data/:/var/lib/mysql/
environment:
MARIADB_DATABASE: ...
MARIADB_USER: ...
MARIADB_PASSWORD: ...
MARIADB_ROOT_PASSWORD: ...
adminer:
image: adminer
restart: always
ports: [0.0.0.0:8080:8080]
A noter que je dois aussi spécifier 192.168.1.X pour me connecter à la base avec adminer, localhost ou 127.0.0.1 ne fonctionne pas non plus.
A noter aussi que je tiens à exposer le port 3306, car je me connecte aussi à la base avec un autre programme qui, lui, n’est pas dockerisé, et ne le sera sans doute jamais. Pour le coup avec cette config, ça fonctionne très bien, le programme se connecte bien en spécifiant localhost comme host. Ce qui est logique aussi, car comme il n’est pas dockerisé, il se fiche pas mal de savoir si MariaDB est réellement installé ou pas, du moment que le port 3306 est ouvert.
Merci pour votre aide !