2017-09-30 4 views
2

Ich bin neu bei Docker und habe versucht, herauszufinden, wie ich mit meinem PHP-Verbindung mit MariaDB verbinden kann, ohne Erfolg.Docker kann keine Verbindung zu Mariadb mit PHP

Ich habe versucht, auf Stackoverflow und Google zu suchen, aber konnte keine nützlichen Informationen finden, so hoffe ich, dass Sie mir helfen könnten.

Die seltsame Sache ist, dass, wenn ich versuche, Verbindung zu MariaDB mit JetBrains DataGrip mit localhost, mysql, root, admin Ich kann eine Verbindung zur Datenbank, aber nicht mit PDO.

Ich hoffe wirklich, dass Sie mir helfen konnten, danke für Ihre Zeit.

Hier sind folgende Projektdateien:

Das ist mein Docker-compose.yml Datei

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 

Meine nginx.conf Datei:

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; 
    } 

} 

Und meine 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

Vielleicht sollten Sie 'sqlite' in' mysql' ändern in Ihrem DSN – Bart

+0

Ich habe das versucht, bekomme ich die Treiber nicht gefunden Nachricht. – user3626278

+0

Also müssen Sie pdo mysql Treiber installieren/aktivieren – Bart

Antwort

0

Dies liegt daran, dass Sie versuchen, Datenbank-Server mit dem Hostnamen localhost von Ihrem PHP-Container zu erreichen, was löst der php container selbst (selbe mit 127.0.0.1).

Sie sollten Ihre $servername Variable so ändern, dass sie Ihrem Mariadb-Dienstnamen in Ihrer Kompositionsdatei entspricht, z. "mariadb".

In Ihrem Fall wird jeder Container, der sich in einem einzigen Standardnetzwerk befindet, unter anderem durch seinen Dienstnamen aufgelöst, weshalb Sie keine Links benötigen, die etwas veraltet sind.

Auch (nur für den Fall) stellen Sie sicher, dass Ihr DB-Container tatsächlich gestartet und bereit ist, Verbindungen zu erhalten. Es dauert eine Weile, um zum ersten Mal zu starten.

+0

Danke! Das Ändern von localhost zu "mariadb" hat den Trick geschafft! – user3626278

0

Versuchen Sie, Ihre eigene Dockerfile zu erstellen, um die mysql ext zu installieren. es gebe Docker beiseite 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

Ich habe dies getan, aber beim Verbinden mit dem mysql-Treiber und localhost bekomme ich Folgendes: SQLSTATE [HY000] [2002] Keine solche Datei oder Verzeichnis. Ich habe gesucht und gefunden, dass 127.0.0.1 es beheben sollte, aber dann bekomme ich den Fehler SQLSTATE [HY000] [2002] Connection refused. – user3626278

+0

Gemäß Ihrer Konfig. Sie sollten auf mysql als 'mysql' zeigen, nicht localhost – Robert

+0

Danke! Das Installieren der Treiber und das Ändern von localhost zu mysql hat den Trick gemacht! – user3626278

Verwandte Themen