2017-09-30 2 views
2

Je suis nouveau à Docker et j'ai essayé de comprendre comment je peux me connecter à mon conteneur MariaDB avec PHP sans succès.Docker ne peut pas se connecter à mariadb avec PHP

J'ai essayé de chercher sur stackoverflow et google mais je n'ai trouvé aucune information utile, alors j'espère que vous pourriez m'aider. La chose étrange est que lorsque j'essaie de me connecter à MariaDB avec JetBrains DataGrip avec localhost, mysql, root, admin, je peux me connecter à la base de données mais pas avec PDO.

J'espère vraiment que vous pourriez m'aider, merci pour votre temps.

Voici les fichiers de projet suivants:

Ceci est mon fichier docker-compose.yml

version: "3.1" 
services: 

    nginx: 
    image: nginx:alpine 
    container_name: nginx 
    volumes: 
     - ./config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf 
    ports: 
     - "80:80" 
    links: 
     - php 

    php: 
    image: php:7.1-fpm 
    container_name: php 
    links: 
     - mariadb:mysql 
    volumes: 
     - ./public:/public 
    ports: 
     - "9000:9000" 

    mariadb: 
    image: mariadb:10.1 
    container_name: database 
    environment: 
     MYSQL_ROOT_PASSWORD: admin 
    ports: 
     - "3306:3306" 

    phpmyadmin: 
    image: phpmyadmin/phpmyadmin 
    container_name: phpmyadmin 
    links: 
     - mariadb 
    ports: 
     - 8183:80 
    environment: 
     PMA_HOST: mariadb 
     PMA_USER: root 
     PMA_PASSWORD: admin 
     PMA_ARBITRARY: 1 

Mon fichier nginx.conf:

server { 
    listen 80 default; 

    client_max_body_size 108M; 

    access_log /var/log/nginx/application.access.log; 


    root /public; 
    index index.php; 

    if (!-e $request_filename) { 
     rewrite ^.*$ /index.php last; 
    } 

    location ~ \.php$ { 
     fastcgi_pass php:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log"; 
     fastcgi_buffers 16 16k; 
     fastcgi_buffer_size 32k; 
     include fastcgi_params; 
    } 

} 

Et mon fichier index.php

<?php 

    $servername = "localhost"; 
    $username = "root"; 
    $password = "admin"; 
    $database = "mysql"; 

    try { 
     $conn = new PDO("sqlite:host=".$servername.";dbname=" . $database, $username, $password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sql = $conn->prepare("SELECT * FROM testDB"); 
     $sql->execute(); 

     while($result = $sql->fetch(PDO::FETCH_ASSOC)){ 
      $result['myTestData']; 
     } 

    } 
    catch(PDOException $e) { 
     echo "Connection failed: " . $e->getMessage(); 
    } 

?> 
+1

Peut-être que vous devriez changer 'sqlite' à' mysql' dans votre DSN – Bart

+0

J'ai essayé cela, je reçois le message du conducteur non trouvé. – user3626278

+0

Vous devez donc installer/activer le pilote pdo mysql – Bart

Répondre

0

Ceci est parce que vous essayez d'atteindre le serveur de base de données avec le nom d'hôte localhost de votre conteneur php, qui décide de le conteneur PHP lui-même (même avec 127.0.0.1).

Vous devez modifier la variable $servername pour qu'elle corresponde à votre nom de service mariadb dans votre fichier de composition, par ex. "mariadb".

Dans votre cas, chaque conteneur, étant dans un seul réseau par défaut, est résolu par son nom de service (entre autres), c'est pourquoi vous n'avez pas besoin de liens, qui sont quelque peu obsolètes.

Également (juste au cas où) assurez-vous que votre conteneur db est réellement démarré et prêt à recevoir des connexions. Il faut un moment pour commencer pour la première fois.

+0

Merci! Changer localhost à "mariadb" a fait l'affaire! – user3626278

0

Essayez de créer votre propre Dockerfile pour installer le mysql ext. Mettez de côté le docker Compose YML:

FROM php:7.1-fpm 

RUN docker-php-ext-install pdo pdo_mysql 

docker-compose.yml:

php: 
    build: . 
    container_name: php 
    links: 
     - mariadb:mysql 
    volumes: 
     - ./public:/public 
    ports: 
     - "9000:9000" 
+0

Je l'ai fait mais lors de la connexion avec le pilote mysql et localhost je reçois ce qui suit: SQLSTATE [HY000] [2002] Aucun fichier ou répertoire. J'ai recherché et ai trouvé que 127.0.0.1 devrait le fixer mais j'obtiens alors l'erreur de refus de connexion de SQLSTATE [HY000] [2002]. – user3626278

+0

Selon votre config. Vous devriez pointer mysql comme mysql, pas localhost – Robert

+0

Merci! Installer les pilotes et changer localhost pour mysql a fait l'affaire! – user3626278